#!/usr/bin/env python
# coding: utf-8
# ***
# ***
# # 17. 파이썬 모듈
# ***
# ***
# ***
# ## 1 이름 공간
# ***
# - 이름 공간 또는 스코프 (Naming Space or Scope): 이름이 존재하는 장소. 파이썬은 실행 시간에 각 이름들을 적절한 이름 공간에 넣어 관리한다.
# - 이름 공간(스코프)의 종류
# - 지역(Local): 각 함수 내부
# - 전역(Global): 모듈 (파일) 내부
# - 내장(Built-in): 파이썬 언어 자체에서 정의한 영역
# - 변수가 정의되는 위치에 의해 변수의 스코프가 정해짐
# - 파이썬에서 변수의 정의
# - 변수가 l-value로 사용될 때
# - 변수가 r-value로 사용될 때 해당 변수의 값을 찾는 순서 규칙
# - L --> G --> B
# ![image](../images/scoping_rule.png)
# ### 1-1 지역변수와 전역변수
# - 변수의 스코프는 해당 변수가 l-value로서 정의되는 위치에 따라 달라짐
# - 변수가 함수 내에서 정의되면 해당 함수의 지역 변수가 된다.
# In[1]:
# 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는 변함 없음
# - 함수 내부에서 전역 변수를 직접 사용하고자 할 때
# - global
키워드 활용
# In[2]:
h = 5
def f(a): # a는 지역
global h # h 변수를 전역이라고 미리 선언함
h = a + 10 # h는 l-value로 정의되더라도 미리 선언된 내용 때문에 전역 변수
return h
print(f(10))
print(h) # 전역 변수 h 값이 함수 내에서 변경되었음
# - [주의] 동일 함수 내에서 동일한 변수가 지역변수와 전역변수로 동시에 활용될 수 없음
# - 함수 내에서 정의되는 변수는 지역 변수로 간주
# - 지역 변수로 선언되기 이전에 해당 변수를 사용할 수 없음
# In[3]:
g = 10
def f():
a = g # r-value로 사용되는 g는 전역 변수
g = 20 # l-value로 정의되는 g는 지역 변수
return a
print(f())
# In[4]:
g = 10
def f():
global g # g는 전역 변수로 선언됨
a = g # a는 지역 변수, g는 전역 변수
g = 20 # g는 전역 변수
return a
print(f())
print(g)
# ### 1-2 특정 공간의 이름 목록 얻기
# - 이름(Name)
# - 변수 (객체) 이름
# - 함수 이름
# - 클래스 이름
# - 모듈 이름
# - dir()
: 함수가 호출된 스코프에서 정의되어 있는 모든 Name들을 문자열 리스트로 반환한다.
# - dir(object)
: object이 지니고 있는 모든 Name들을 문자열 리스트로 반환한다.
# In[5]:
print(dir())
# In[6]:
l = []
print(dir(l))
# ### 1-3 함수의 중첩 영역(Nested Scopes) 지원
# - Nested Scope: 함수 안에 정의되어 있는 함수 내부
# - 가장 안쪽의 스코프부터 바깥쪽의 스코프쪽으로 변수를 찾는다.
# - 각각의 중첩 함수마다 독립적인 Scope을 관리한다.
# In[8]:
x = 2
def F():
x = 1
def G():
x = 20
print(x)
G()
F()
# In[9]:
x = 2
def F():
x = 1
def G():
x = 20
print("G():", x)
G()
print("F():", x)
F()
print("Global:", x)
# In[14]:
x = 2
def F():
x = 1
def G():
global x
x = 20
print("G():", x)
G()
print("F():", x)
F()
print("Global:", x)
# ***
# ## 2 모듈의 정의
# ***
# - 모듈: 파이썬 프로그램 파일로서 파이썬 데이터와 함수등을 정의하고 있는 단위
# - 서로 연관된 작업을 하는 코드들을 묶어서 독립성을 유지하되 재사용 가능하게 만드는 단위
# - 모듈을 사용하는 측에서는 모듈에 정의된 함수나 변수 이름을 사용
# - 모듈의 종류
# - 표준 모듈
# - 파이썬 언어 패키지 안에 기본적으로 포함된 모듈
# - 대표적인 표준 모듈 예
# - math, string
# - 사용자 생성 모듈
# - 개발자가 직접 정의한 모듈
# - 써드 파티 모듈
# - 다른 업체나 개인이 만들어서 제공하는 모듈
# ### 2-1 모듈은 어디에 저장되는가
# - 모듈이 정의되고 저장되는 곳은 파일
# - 파일
# - 모듈 코드를 저장하는 물리적인 단위
# - 모듈
# - 논리적으로 하나의 단위로 조직된 코드의 모임
# - 파이썬 모듈이 정의되는 파일의 확장자: .py
# - 다른 곳에서 모듈을 사용하게 되면 해당 모듈의 .py
는 바이트 코드로 컴파일 되어 .pyc
로 존재한다.
# ### 2-2 사용자 모듈 만들기와 호출하기
# In[9]:
#File: mymath.py
mypi = 3.14
def add(a, b):
return a + b
def area(r):
return mypi * r * r
# - 모듈 이름은 해당 모듈을 정의한 파일 이름에서 .py
를 제외한 것
# - 모듈을 불러오는 키워드: import
# - 모듈에서 정의한 이름 사용하기
# In[11]:
import mymath
print(dir(mymath)) # mymath에 정의된 이름들 확인하기
print(mymath.mypi) # mymath 안에 정의된 mypi를 사용한다
print(mymath.area(5)) # mymath 안에 정의된 area를 사용한다
# ### 2-3 모듈을 왜 사용하는가?
# - 함수와 모듈
# - 함수: 파일 내에서 일부 코드를 묶는 것
# - 모듈: 파일 단위로 코드들을 묶는 것
# - 비슷하거나 관련된 일을 하는 함수나 상수값들을 모아서 하나의 파일에 저장하고 추후에 재사용하는 단위
# - 모듈 사용의 이점
# - 코드의 재사용
# - 프로그램 개발시에 전체 코드들을 여러 모듈 단위로 분리하여 설계함으로써 작업의 효율을 높일 수 있음
# - 별도의 이름 공간(스코프)를 제공함으로써 동일한 이름의 여러 함수나 변수들이 각 모듈마다 독립적으로 정의될 수 있다.
# - 별도 파일 내에 파이썬 코드를 저장할 때 (즉, 모듈을 코딩할 때) 한글 처리
# - 파일의 맨 위에 다음 코드를 넣어 준다.
# - \# -\*- coding:utf-8 -*-
# - 모듈은 하나의 독립된 이름 공간을 확보하면서 정의된다.
# ### 2-4 모듈이 지닌 이름들 알아보기
# - dir(모듈)
: 모듈이 지니고 있는 모든 이름들을 리스트로 반환
# In[5]:
import string
print(dir(string))
# ### 2-5 이름 공간을 제공하는 다른 예들
# - 독립된 이름 공간(스코프)을 제공하는 것들
# - 모듈
# - 함수
# - 클래스
# - 객체
# - string
모듈 이름 공간에 변수 a
를 생성한다.
# - 표준 모듈에 사용자가 정의하는 이름을 생성하는 것은 비추천
# - 단지 모듈 자체가 독립적인 이름 공간을 제공한다는 것을 알려줌
# In[6]:
import string
string.a = 1
print(string.a)
# - 클래스도 독립적인 이름 공간
# In[7]:
class C: # 클래스도 독립적인 이름 공간
a = 2 # 클래스 이름 공간 내에 변수 선언
pass # 클래스 정의 완료
c = C() # 클래스 인스턴스 객체 생성
c.a = 1 # 클래스에서 생성된 인스턴스 객체도 별도의 이름 공간
print(c.a)
print(c.__class__.a)
print(C.a)
# - 함수도 독립적인 이름 공간
# - 다만 함수 내에서 선언된 지역(로컬) 변수는 함수 외부에서 접근할 수 없다.
# In[9]:
x = 10 # 현재 모듈 내부에 정의되는 이름
def f():
a = 1
b = 2 # 현재 모듈에 정의되는 함수 f 내에 이름 a,b를 정의하고있다. 함수도 독립적인 이름 공간
f.c = 1
print(f.c)
print()
print(f.a)
# ***
# ## 3 모듈 검색 경로
# ***
# ### 3-1 PYTHONPATH
환경 변수 설정하기
# - 파이썬이 모듈을 찾는 순서
# - 1) 이미 메모리에 로딩되어진 것
# - 2) 현재 디렉토리 (ipython에서 pwd
명령으로 확인 가능)
#
# - ! pwd
#
#
# - 3) PYTHONPATH
환경 변수에 기술된 디렉토리 목록을 차례로 탐색
# - 4) 표준 라이브러리 디렉토리들
# - sys
모듈 임포트 후 sys.path
로 확인 가능
# - sys.path.append()
, sys.path.remove()
로 추가, 삭제 가능
# - PYTHONPATH
환경 변수 설정 방법
# - 윈도우즈
# - 제어판\시스템 및 보안\시스템\고급 시스템 설정\환경 변수
# - 새로 만들기: 변수 이름 - PYTHONPATH
, 변수 값 - C:\Users\yhhan\mypythonlib
# - python 새로 시작하기 (cmd창 새로 시작한 후)
# - MAC이나 리눅스
# - ~/.bashrc
, ~/.bash_profile
, 혹은 ~/.profile
파일에 다음 라인 추가
# - export PYTHONPATH=/Users/yhhan/mypythonlib
# - 터미널 창에서 다음 명령어 수행
# - source ~/.bash_profile
# - 이클립스에서 PYTHONPATH
설정
# - [참고] https://goo.gl/crPFi0
# ![inheritance](../images/pythonpath_eclipse.png)
# - 코드 내에서 모듈 검색 경로 확인하기
# In[13]:
import sys
print sys.path
# ### 3-2 모듈의 검색 경로 동적으로 바꾸기
# In[17]:
import sys
sys.path.append('~/mypythonlib')
print(sys.path)
# In[18]:
sys.path.insert(0, '~/mypythonlib2')
print(sys.path)
#
참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일