# g, h는 전역 변수
g = 10
h = 5
def f(a): # a는 지역 변수
h = a + 10 # h는 지역, 새로 l-value로 정의했음
b = h + a + g # b도 지역, g는 r-value이므로 기존 값을 참조 - 전역 변수
return b
print(f(h)) # 함수 호출시에 사용되는 변수는 해당 위치의 스코프에서 값을 찾음 - 전역 변수
print(h) # 전역 변수 h는 변함 없음
30 5
global
키워드 활용h = 5
def f(a): # a는 지역
global h # h 변수를 전역이라고 미리 선언함
h = a + 10 # h는 l-value로 정의되더라도 미리 선언된 내용 때문에 전역 변수
return h
print(f(10))
print(h) # 전역 변수 h 값이 함수 내에서 변경되었음
20 20
g = 10
def f():
a = g # r-value로 사용되는 g는 전역 변수
g = 20 # l-value로 정의되는 g는 지역 변수
return a
print(f())
--------------------------------------------------------------------------- UnboundLocalError Traceback (most recent call last) <ipython-input-3-b9cfd4ba6eab> in <module> 6 return a 7 ----> 8 print(f()) <ipython-input-3-b9cfd4ba6eab> in f() 2 3 def f(): ----> 4 a = g # r-value로 사용되는 g는 전역 변수 5 g = 20 # l-value로 정의되는 g는 지역 변수 6 return a UnboundLocalError: local variable 'g' referenced before assignment
g = 10
def f():
global g # g는 전역 변수로 선언됨
a = g # a는 지역 변수, g는 전역 변수
g = 20 # g는 전역 변수
return a
print(f())
print(g)
10 20
dir()
: 함수가 호출된 스코프에서 정의되어 있는 모든 Name들을 문자열 리스트로 반환한다.dir(object)
: object이 지니고 있는 모든 Name들을 문자열 리스트로 반환한다.print(dir())
['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i2', '_i3', '_i4', '_i5', '_ih', '_ii', '_iii', '_oh', 'exit', 'f', 'g', 'get_ipython', 'h', 'quit']
l = []
print(dir(l))
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
x = 2
def F():
x = 1
def G():
x = 20
print(x)
G()
F()
20
x = 2
def F():
x = 1
def G():
x = 20
print("G():", x)
G()
print("F():", x)
F()
print("Global:", x)
G(): 20 F(): 1 Global: 2
x = 2
def F():
x = 1
def G():
global x
x = 20
print("G():", x)
G()
print("F():", x)
F()
print("Global:", x)
G(): 20 F(): 1 Global: 20
math, string
.py
.py
는 바이트 코드로 컴파일 되어 .pyc
로 존재한다.#File: mymath.py
mypi = 3.14
def add(a, b):
return a + b
def area(r):
return mypi * r * r
.py
를 제외한 것import
import mymath
print(dir(mymath)) # mymath에 정의된 이름들 확인하기
print(mymath.mypi) # mymath 안에 정의된 mypi를 사용한다
print(mymath.area(5)) # mymath 안에 정의된 area를 사용한다
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'add', 'area', 'mypi'] 3.14 78.5
dir(모듈)
: 모듈이 지니고 있는 모든 이름들을 리스트로 반환import string
print(dir(string))
['Formatter', 'Template', '_ChainMap', '_TemplateMetaclass', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']
string
모듈 이름 공간에 변수 a
를 생성한다.import string
string.a = 1
print(string.a)
1
class C: # 클래스도 독립적인 이름 공간
a = 2 # 클래스 이름 공간 내에 변수 선언
pass # 클래스 정의 완료
c = C() # 클래스 인스턴스 객체 생성
c.a = 1 # 클래스에서 생성된 인스턴스 객체도 별도의 이름 공간
print(c.a)
print(c.__class__.a)
print(C.a)
1 2 2
x = 10 # 현재 모듈 내부에 정의되는 이름
def f():
a = 1
b = 2 # 현재 모듈에 정의되는 함수 f 내에 이름 a,b를 정의하고있다. 함수도 독립적인 이름 공간
f.c = 1
print(f.c)
print()
print(f.a)
1
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-9-4ccf5ee8b313> in <module>() 6 print(f.c) 7 print() ----> 8 print(f.a) AttributeError: 'function' object has no attribute 'a'
PYTHONPATH
환경 변수 설정하기¶파이썬이 모듈을 찾는 순서
pwd
명령으로 확인 가능)! pwd
PYTHONPATH
환경 변수에 기술된 디렉토리 목록을 차례로 탐색sys
모듈 임포트 후 sys.path
로 확인 가능sys.path.append()
, sys.path.remove()
로 추가, 삭제 가능PYTHONPATH
환경 변수 설정 방법
PYTHONPATH
, 변수 값 - C:\Users\yhhan\mypythonlib
~/.bashrc
, ~/.bash_profile
, 혹은 ~/.profile
파일에 다음 라인 추가export PYTHONPATH=/Users/yhhan/mypythonlib
source ~/.bash_profile
PYTHONPATH
설정import sys
print sys.path
['', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python27.zip', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-darwin', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-mac', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/plat-mac/lib-scriptpackages', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-tk', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-old', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/lib-dynload', '/Users/yhhan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages', '/Applications/Canopy.app/appdata/canopy-1.4.1.1975.macosx-x86_64/Canopy.app/Contents/lib/python2.7/site-packages', '/Users/yhhan/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/IPython/extensions']
import sys
sys.path.append('~/mypythonlib')
print(sys.path)
['', '/Users/yhhan/anaconda/lib/python36.zip', '/Users/yhhan/anaconda/lib/python3.6', '/Users/yhhan/anaconda/lib/python3.6/lib-dynload', '/Users/yhhan/anaconda/lib/python3.6/site-packages', '/Users/yhhan/anaconda/lib/python3.6/site-packages/Sphinx-1.5.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/aeosa', '/Users/yhhan/anaconda/lib/python3.6/site-packages/pip-9.0.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/six-1.10.0-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/sim2net-3.1.2-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/setuptools-33.1.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/IPython/extensions', '/Users/yhhan/.ipython', '~/mypythonlib']
sys.path.insert(0, '~/mypythonlib2')
print(sys.path)
['~/mypythonlib2', '', '/Users/yhhan/anaconda/lib/python36.zip', '/Users/yhhan/anaconda/lib/python3.6', '/Users/yhhan/anaconda/lib/python3.6/lib-dynload', '/Users/yhhan/anaconda/lib/python3.6/site-packages', '/Users/yhhan/anaconda/lib/python3.6/site-packages/Sphinx-1.5.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/aeosa', '/Users/yhhan/anaconda/lib/python3.6/site-packages/pip-9.0.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/six-1.10.0-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/sim2net-3.1.2-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/setuptools-33.1.1-py3.6.egg', '/Users/yhhan/anaconda/lib/python3.6/site-packages/IPython/extensions', '/Users/yhhan/.ipython', '~/mypythonlib']
참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일