160809: 103회차
Programming
2016. 8. 9. 18:20
종료하기 전 티스토리 네이버 로그아웃 할 것
1. 툴
동일
추가시:
2. 폴더
동일
추가시:
3. 사용할 사이트
동일
추가시:
4. 공부하는 것
[13] 모듈과 패키지
[01] 모듈과 패키지
1. 이름공간(Naming Space or Scope):이름이 존재하는 장소
- 파이썬은 실행 시간에 각 이름들을 적절한 이름 공간에 넣어 관리한다.
1) 이름 공간(스코프)의 종류
- 지역(Local): 각 함수 내부, 클래스 메소드 안. 객체 내부
- 전역(Global): 모듈 (파일) 내부, 모듈의 물리적인 단위 = 파일
- 내장(Built-in): 파이썬 언어 자체에서 정의한 영역
2) 변수가 정의되는 위치에 의해 변수의 스코프가 정해짐
- 파이썬에서 변수의 정의->?변수가 l-value로 사용될 때
- 변수가 r-value로 사용될 때 해당 변수의 값을 아래 순서 규칙
에 따라 찾는다. L --> G --> B
- a = 1 에서 a라고 하는 것이 =의 왼쪽에 존재 시 a는 ㅣ-value
- b = a 를 하게 되면 b는 l-value, a는 r-value
- L → G → B : a 값을 local, global, built-in 순서로 찾음
3) 지역변수와 전역변수
- 변수의 스코프는 해당 변수가 l-value로서 정의되는 위치에 따라 달라짐
- 변수가 함수 내에서 정의되면 해당 함수의 지역 변수가 된다.
# -*- coding:utf-8 -*-
# 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 키워드 활용
# -*- coding:utf-8 -*-
h = 5
def f(a): # a는 지역
global h # h 변수를 전역이라고 미리 선언함
h = a + 10 # h는 l-velue로 정의되더라도 미리 선언된 내용 때문에 전역 변수
return h
print f(10)
print h # 전역 변수 h 값이 함수 내에서 변경되었음
- 동일 함수 내에서 동일한 변수가 지역변수와 전역변수로 동시에 활용될 수 없음
- 함수 내에서 정의되는 변수는 지역 변수로 간주
- 지역 변수로 선언되기 이전에 해당 변수를 사용할 수 없음
# -*- coding:utf-8 -*-
g = 10
def f():
a = g # r-value로 사용되는 g는 전역 변수
g = 20 # 전역변수와 동일한 이름의 g를 생성하면오류(l-value)
return a
print f()
# -*- coding:utf-8 -*-
g = 10
def f():
g = 20 # l-value로 새로운 지역변수 g선언
a = g # r-value로 사용되는 g는 바로위에서 생성한 지역변수(L->G->B)
return a
print f()
print g #전역변수 g출력
# -*- coding:utf-8 -*-
g = 10
def f():
global g # g를 전역변수로 선언
g = 20 # l-value g는 전역 변수
a = g # g는 전역 변수
return a
print f()
print g
4) 특정 공간의 이름 목록 얻기
- 이름(Name) : 변수 (객체) 이름,함수 이름, 클래스 이름, 모듈 이름
- dir(): 함수가 호출된 스코프에서 정의되어 있는 모든 Name들을
문자열 리스트로 반환한다.
- dir(object): object이 지니고 있는 모든 Name들을 문자열 리스트로 반환한다.
- object = 함수, 특정객체, 클래스, 인스턴스, 모듈의 이름 등
- '__'로 시작되는 것들은 특수한 변수 또는 메소드
# -*- coding:utf-8 -*-
l = []
print dir(l)
print dir()
5) 함수의 중첩 영역(Nested Scopes) 지원
- Nested Scope: 함수 안에 정의되어 있는 함수에서는
가장 안쪽의 스코프부터 바깥쪽의 스코프쪽으로 변수를 찾는다.
- 함수 안에 print x를 하면 가까운 x를 먼저 찾는다.
# -*- coding:utf-8 -*-
x = 2
def F():
x = 1
def G():
print x
G()
F()
2.모듈
- 파이썬 프로그램 파일로서 파이썬 데이터와 함수등을 정의하고 있는 단위
- 서로 연관된 작업을 하는 코드들을 묶어서 독립성을 유지하되 재사용 가능하게 만드는 단위
- 모듈을 사용하는 측에서는 모듈에 정의된 함수나 변수 이름을 사용할 수 있음.
- 파이썬 모듈이 정의되는 파일의 확장자: .py
- 다른 곳에서 모듈을 사용하게 되면 해당 모듈의 .py는 바이트 코드로 컴파일 되어
.pyc로 존재한다.
1) 모듈의 종류는
- 표준모듈 : 파이썬 언어 패키지 안에 기본적으로 포함된 모듈 ,math, string
- 사용자 생성 모듈 : 개발자가 직접 정의한 모듈
- 써드 파티 모듈 : 다른 업체나 개인이 만들어서 제공하는 모듈
2) 사용자 모듈 생성및 사용
# -*- coding:utf-8 -*-
#File: mymath.py
mypi = 3.14
def add(a, b):
return a + b
def area(r):
return mypi * r * r
# -*- coding:utf-8 -*-
import mymath
print dir(mymath) # mymath에 정의된 이름들 확인하기
print mymath.mypi # mymath 안에 정의된 mypi를 사용한다
print mymath.area(5) # mymath 안에 정의된 area를 사용한다
3) 클래스와 함수의 이름공간
- 클래스도 독립적인 이름 공간
- c.a = 1 --> 인스턴스 c 안에 a가 존재하고 a 값은 1
# -*- coding:utf-8 -*-
class C: # 클래스도 독립적인 이름 공간
a = 2 # 클래스 이름 공간 내에 변수 선언
pass # pass까지가 클래스 정의
c = C() # 클래스 인스턴스 객체 생성
c.a = 1 # 클래스에서 생성된 인스턴스 객체도 별도의 이름 공간
print c.a
c.a = 5
print c.__class__.a # 클래스에서 정의된 a
print C.a
print c.a
- 함수도 독립적인 이름 공간. 함수 내에서 선언된 로컬 변수는 함수 외부에서
접근할 수 없다.
# -*- coding:utf-8 -*-
x = 10 # 현재 모듈 내부에 정의되는 이름
def f():
a = 1
b = 2 # 현재 모듈에 정의되는 함수 f 내에 이름 a,b를 정의하고있다. 함수도 독립적인 이름 공간
f.c = 1
print f.c
print
#print f.a #주석풀면 오류
클래스 내에서 선언된 건 접근 가능
함수 내에서 선언된 변수는 접근 불가능
4) 모듈 검색경록
- 파이썬이 모듈을 찾는 순서
* 이미 메모리에 로딩되어진 것
* 현재 디렉토리 (ipython에서 pwd 명령으로 확인 가능)
* PYTHONPATH 환경 변수에 기술된 디렉토리 목록을 차례로 탐색
* 표준 라이브러리 디렉토리들 -> sys 모듈 임포트 후 sys.path 로 확인 가능
- 이클립스에서 PYTHONPATH 설정
5) 모듈 import 하기
- 이름 공간 mymath가 그대로 유지되므로 mymath.area() 형태로 자격 이름 사용
# -*- coding:utf-8 -*-
import mymath
print mymath.area(5)
- from 모듈명 import 이름들
- 해당 모듈에 존재하는 지정 이름들을 현재 이름 공간으로 불러들인다.
- import 하는 이름들이 기존에 미리 존재하고 있었다면 그 이름들에 의해 참조되던
기존 객체들은 상실된다.
from mymath import area, mypi
print area(5)
- import 뒤 * 사용하면 앞 이름공간의 모든 식별자를 import
from mymath import *
print area(5)
- import 모듈명 as 새로운 모듈 이름
- 기존 모듈 이름이 너무 길거나 현재 사용중인 다름 이름들과 충돌이 일어날 때 유용
from string import replace as substitute
print substitute
print substitute('ham chicken spam', 'chicken', 'egg')
from string import replace as substitute, upper as up
print up
print up('abc')
- import 문은 보통의 문(statement)이 작성될 수 있는 곳이면
어디에서나 사용 가능
# -*- coding:utf-8 -*-
def str_test(s):
import string
t = string.split(s)
return t
print str_test("홍길 동 ")
-import는 코드를 가져오기만 하는 것이 아니라 가져온 코드를 수행한다.
# -*- coding:utf-8 -*-
#FILE : mymath.py
mypi = 3.14
def add(a, b):
return a + b
def area(r):
return mypi * r * r
print area(4.0)
------------------------------
import mymath
6) 모듈 실행과 테스트
- __name__는 현재의 모듈이 최상위 모듈로서 수행되는지, 아니면 다른 모듈에 의해
import 되어 수행되는지를 구별하기 위해 주로 활용
- prname.py를 직접 수행할 때의 출력 내용: __main__
- prname.py가 최상위 모듈로서 수행됨을 의미
- __main__ 값이 __name__에 할당되어 있음
- __name__은 바로 수행해서 사용하고 있으므로 최상위 모듈
#FILE : prname.py
print __name__
실행결과 : __main__
- prname.py가 모듈로서 다른 이름 공간으로 import 되어질 때의
- 다른 모듈에 의해 import 되어짐 → name 값은 모듈 이름 그대로 출력
import prname
print prname.__name__
실행결과 : prname
------------------------------------------------------
import string
print string.__name__
import re
print re.__name__
import mimetools
print mimetools.__name__
import os
print os.__name__
실행결과:
string
re
mimetools
os
- 아래 코드는 최상위 모듈로서 수행될 때에 호출이 일어난다.
- 보통 파이썬 모듈을 개발할 때에는 마지막 부분에
if __name__ == "__main__": 과
같은 코드를 추가하여 테스트 코드를 삽입한다.
# -*- coding:utf-8 -*-
#file: module_test.py
def add(a, b):
return a + b
def f():
print "Python is becoming popular." // 파이썬은 무조건 리턴값을 넣어줘야 하는데 타입을 안 넣으면 무조건 None을 리턴함!
if __name__ == "__main__":
print add(1, 10)
f()
실행결과:
11
Python is becoming popular.
- import 했을때는 실행되지 않고 그모듈의 이름영역에 접근한다.
import module
module.add(10,11)
model.f()
3. 패키지
1) 패키지 (Package)
- 여러 모듈들을 한데 묶어서 정리해 놓은 구조
- 물리적으로 여러 모듈 파일을 모아 놓은 디렉토리에 해당
- 최상위 디렉토리 이름이 패키지 이름이 된다.
- 최상위 디렉토리 하위에 여러 서브 디렉토리는 해당 최상위 패키지의 하위 패키지가 된다.
- 각 패키지 폴더마다 __init__.py 파일 존재한다.
2) 패키지 import
- package1/package2/pactest.py
def train():
print "Train"
pass
def loadModel():
print "LoadModel"
pass
def saveModel():
print "SaveModel"
pass
------------------------------------------
# -*- coding:utf-8 -*-
import package1.package2.pactest
print package1.package2.pactest.train()
print package1.package2.pactest.loadModel()
print package1.package2.pactest.saveModel()
# -*- coding:utf-8 -*-
from package1.package2 import pactest
print pactest.train()
print pactest.loadModel()
print pactest.saveModel()
# -*- coding:utf-8 -*-
from package1.package2.pactest import train, loadModel, saveModel
print train()
print loadModel()
print saveModel()
# -*- coding:utf-8 -*-
from package1.package2.pactest import *
print train()
print loadModel()
print saveModel()
5. 수업
진도:
hw:
6. 할것
'Programming' 카테고리의 다른 글
160817: 105회차 (0) | 2016.08.17 |
---|---|
160816: 104회차 (0) | 2016.08.16 |
160808: 102회차 (0) | 2016.08.08 |
160805: 101회차 (0) | 2016.08.05 |
160804: 100회차 (0) | 2016.08.04 |