global
키워드 활용"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"20\n",
"20\n"
]
}
],
"source": [
"h = 5\n",
"\n",
"def f(a): # a는 지역\n",
" global h # h 변수를 전역이라고 미리 선언함\n",
" h = a + 10 # h는 l-value로 정의되더라도 미리 선언된 내용 때문에 전역 변수\n",
" return h\n",
"\n",
"print(f(10))\n",
"print(h) # 전역 변수 h 값이 함수 내에서 변경되었음"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- [주의] 동일 함수 내에서 동일한 변수가 지역변수와 전역변수로 동시에 활용될 수 없음\n",
" - 함수 내에서 정의되는 변수는 지역 변수로 간주\n",
" - 지역 변수로 선언되기 이전에 해당 변수를 사용할 수 없음"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"ename": "UnboundLocalError",
"evalue": "local variable 'g' referenced before assignment",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mUnboundLocalError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32mdir()
: 함수가 호출된 스코프에서 정의되어 있는 모든 Name들을 문자열 리스트로 반환한다. \n",
"- dir(object)
: object이 지니고 있는 모든 Name들을 문자열 리스트로 반환한다."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i2', '_i3', '_ih', '_ii', '_iii', '_oh', 'exit', 'f', 'g', 'get_ipython', 'quit']\n"
]
}
],
"source": [
"print(dir())"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['__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']\n"
]
}
],
"source": [
"l = []\n",
"print(dir(l))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1-3 함수의 중첩 영역(Nested Scopes) 지원\n",
"- Nested Scope: 함수 안에 정의되어 있는 함수 내부\n",
" - 가장 안쪽의 스코프부터 바깥쪽의 스코프쪽으로 변수를 찾는다.\n",
" - 각각의 중첩 함수마다 독립적인 Scope을 관리한다."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"20\n"
]
}
],
"source": [
"x = 2\n",
"def F():\n",
" x = 1\n",
" def G():\n",
" x = 20\n",
" print(x)\n",
" G()\n",
"F()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"G(): 20\n",
"F(): 1\n",
"Global: 2\n"
]
}
],
"source": [
"x = 2\n",
"def F():\n",
" x = 1\n",
" def G():\n",
" x = 20\n",
" print(\"G():\", x)\n",
" G()\n",
" print(\"F():\", x)\n",
"F()\n",
"print(\"Global:\", x)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"G(): 20\n",
"F(): 1\n",
"Global: 20\n"
]
}
],
"source": [
"x = 2\n",
"def F():\n",
" x = 1\n",
" def G():\n",
" global x\n",
" x = 20\n",
" print(\"G():\", x)\n",
" G()\n",
" print(\"F():\", x)\n",
"F()\n",
"print(\"Global:\", x)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"***\n",
"## 2 모듈의 정의\n",
"***\n",
"- 모듈: 파이썬 프로그램 파일로서 파이썬 데이터와 함수등을 정의하고 있는 단위\n",
" - 서로 연관된 작업을 하는 코드들을 묶어서 독립성을 유지하되 재사용 가능하게 만드는 단위\n",
" - 모듈을 사용하는 측에서는 모듈에 정의된 함수나 변수 이름을 사용\n",
"- 모듈의 종류\n",
" - 표준 모듈\n",
" - 파이썬 언어 패키지 안에 기본적으로 포함된 모듈\n",
" - 대표적인 표준 모듈 예\n",
" - math, string
\n",
" - 사용자 생성 모듈\n",
" - 개발자가 직접 정의한 모듈\n",
" - 써드 파티 모듈\n",
" - 다른 업체나 개인이 만들어서 제공하는 모듈"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2-1 모듈은 어디에 저장되는가\n",
"- 모듈이 정의되고 저장되는 곳은 파일\n",
" - 파일\n",
" - 모듈 코드를 저장하는 물리적인 단위\n",
" - 모듈\n",
" - 논리적으로 하나의 단위로 조직된 코드의 모임\n",
"- 파이썬 모듈이 정의되는 파일의 확장자: .py
\n",
"- 다른 곳에서 모듈을 사용하게 되면 해당 모듈의 .py
는 바이트 코드로 컴파일 되어 .pyc
로 존재한다."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2-2 사용자 모듈 만들기와 호출하기"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# File: mymath.py\n",
"mypi = 3.14\n",
"\n",
"def add(a, b):\n",
" return a + b\n",
"\n",
"def area(r):\n",
" return mypi * r * r"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 모듈 이름은 해당 모듈을 정의한 파일 이름에서 .py
를 제외한 것\n",
" - 모듈을 불러오는 키워드: import
\n",
"- 모듈에서 정의한 이름 사용하기"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'add', 'area', 'mypi']\n",
"3.14\n",
"78.5\n"
]
}
],
"source": [
"import mymath\n",
"\n",
"print(dir(mymath)) # mymath에 정의된 이름들 확인하기\n",
"print(mymath.mypi) # mymath 안에 정의된 mypi를 사용한다\n",
"print(mymath.area(5)) # mymath 안에 정의된 area를 사용한다"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2-3 모듈을 왜 사용하는가?\n",
"- 함수와 모듈\n",
" - 함수: 파일 내에서 일부 코드를 묶는 것\n",
" - 모듈: 파일 단위로 코드들을 묶는 것\n",
" - 비슷하거나 관련된 일을 하는 함수나 상수값들을 모아서 하나의 파일에 저장하고 추후에 재사용하는 단위\n",
"- 모듈 사용의 이점\n",
" - 코드의 재사용\n",
" - 프로그램 개발시에 전체 코드들을 여러 모듈 단위로 분리하여 설계함으로써 작업의 효율을 높일 수 있음\n",
" - 별도의 이름 공간(스코프)를 제공함으로써 동일한 이름의 여러 함수나 변수들이 각 모듈마다 독립적으로 정의될 수 있다.\n",
"- 별도 파일 내에 파이썬 코드를 저장할 때 (즉, 모듈을 코딩할 때) 한글 처리\n",
" - 파일의 맨 위에 다음 코드를 넣어 준다.\n",
" - \\# -\\*- coding:utf-8 -*-\n",
"- 모듈은 하나의 독립된 이름 공간을 확보하면서 정의된다."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2-4 모듈이 지닌 이름들 알아보기\n",
"- dir(모듈)
: 모듈이 지니고 있는 모든 이름들을 리스트로 반환 "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['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']\n"
]
}
],
"source": [
"import string\n",
"print(dir(string))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2-5 이름 공간을 제공하는 다른 예들\n",
"- 독립된 이름 공간(스코프)을 제공하는 것들\n",
" - 모듈\n",
" - 함수\n",
" - 클래스\n",
" - 객체"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- string
모듈 이름 공간에 변수 a
를 생성한다.\n",
" - 표준 모듈에 사용자가 정의하는 이름을 생성하는 것은 비추천\n",
" - 단지 모듈 자체가 독립적인 이름 공간을 제공한다는 것을 알려줌"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n"
]
}
],
"source": [
"import string\n",
"string.a = 1\n",
"print(string.a)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 클래스도 독립적인 이름 공간"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n",
"2\n",
"2\n"
]
}
],
"source": [
"class C: # 클래스도 독립적인 이름 공간\n",
" a = 2 # 클래스 이름 공간 내에 변수 선언\n",
" pass # 클래스 정의 완료\n",
"\n",
"c = C() # 클래스 인스턴스 객체 생성\n",
"c.a = 1 # 클래스에서 생성된 인스턴스 객체도 별도의 이름 공간\n",
"print(c.a)\n",
"print(c.__class__.a)\n",
"print(C.a)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 함수도 독립적인 이름 공간\n",
" - 다만 함수 내에서 선언된 지역(로컬) 변수는 함수 외부에서 접근할 수 없다."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n",
"\n"
]
},
{
"ename": "AttributeError",
"evalue": "'function' object has no attribute 'a'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32mPYTHONPATH
환경 변수 설정하기\n",
"- 파이썬이 모듈을 찾는 순서\n",
" - 1) 이미 메모리에 로딩되어진 것\n",
" - 2) 현재 디렉토리 (ipython에서 pwd
명령으로 확인 가능)\n",
" \n",
" - ! pwd
\n",
" \n",
" \n",
" - 3) PYTHONPATH
환경 변수에 기술된 디렉토리 목록을 차례로 탐색\n",
" - 4) 표준 라이브러리 디렉토리들\n",
" - sys
모듈 임포트 후 sys.path
로 확인 가능\n",
" - sys.path.append()
, sys.path.remove()
로 추가, 삭제 가능\n",
"- PYTHONPATH
환경 변수 설정 방법\n",
" - 윈도우즈\n",
" - 제어판\\시스템 및 보안\\시스템\\고급 시스템 설정\\환경 변수\n",
" - 새로 만들기: 변수 이름 - PYTHONPATH
, 변수 값 - C:\\Users\\yhhan\\mypythonlib
\n",
" - python 새로 시작하기 (cmd창 새로 시작한 후)\n",
" - MAC이나 리눅스\n",
" - ~/.bashrc
, ~/.bash_profile
, 혹은 ~/.profile
파일에 다음 라인 추가\n",
" - export PYTHONPATH=/Users/yhhan/mypythonlib
\n",
" - 터미널 창에서 다음 명령어 수행 \n",
" - source ~/.bash_profile
\n",
" - 이클립스에서 PYTHONPATH
설정\n",
" - [참고] https://goo.gl/crPFi0 "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![inheritance](../images/pythonpath_eclipse.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- 코드 내에서 모듈 검색 경로 확인하기"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['/Users/jubong/anaconda3/lib/python36.zip', '/Users/jubong/anaconda3/lib/python3.6', '/Users/jubong/anaconda3/lib/python3.6/lib-dynload', '', '/Users/jubong/anaconda3/lib/python3.6/site-packages', '/Users/jubong/anaconda3/lib/python3.6/site-packages/aeosa', '/Users/jubong/git/ml-agents/ml-agents', '/Users/jubong/git/ml-agents/gym-unity', '/Users/jubong/git/ml-agents/ml-agents-envs', '/Users/jubong/git/mujoco-py', '/Users/jubong/anaconda3/lib/python3.6/site-packages/IPython/extensions', '/Users/jubong/.ipython']\n"
]
}
],
"source": [
"import sys\n",
"print(sys.path)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3-2 모듈의 검색 경로 동적으로 바꾸기"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['/Users/jubong/anaconda3/lib/python36.zip', '/Users/jubong/anaconda3/lib/python3.6', '/Users/jubong/anaconda3/lib/python3.6/lib-dynload', '', '/Users/jubong/anaconda3/lib/python3.6/site-packages', '/Users/jubong/anaconda3/lib/python3.6/site-packages/aeosa', '/Users/jubong/git/ml-agents/ml-agents', '/Users/jubong/git/ml-agents/gym-unity', '/Users/jubong/git/ml-agents/ml-agents-envs', '/Users/jubong/git/mujoco-py', '/Users/jubong/anaconda3/lib/python3.6/site-packages/IPython/extensions', '/Users/jubong/.ipython', '~/mypythonlib']\n"
]
}
],
"source": [
"import sys\n",
"\n",
"sys.path.append('~/mypythonlib')\n",
"print(sys.path)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['~/mypythonlib2', '/Users/jubong/anaconda3/lib/python36.zip', '/Users/jubong/anaconda3/lib/python3.6', '/Users/jubong/anaconda3/lib/python3.6/lib-dynload', '', '/Users/jubong/anaconda3/lib/python3.6/site-packages', '/Users/jubong/anaconda3/lib/python3.6/site-packages/aeosa', '/Users/jubong/git/ml-agents/ml-agents', '/Users/jubong/git/ml-agents/gym-unity', '/Users/jubong/git/ml-agents/ml-agents-envs', '/Users/jubong/git/mujoco-py', '/Users/jubong/anaconda3/lib/python3.6/site-packages/IPython/extensions', '/Users/jubong/.ipython', '~/mypythonlib']\n"
]
}
],
"source": [
"sys.path.insert(0, '~/mypythonlib2')\n",
"print(sys.path)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"# sys.path.append('/Users/jubong/git/python-link-e-learning/python3.6/mymath')\n",
"sys.path.append('/Users/jubong/git/python-link-e-learning/')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일
" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.8" } }, "nbformat": 4, "nbformat_minor": 1 }