160809: 103회차

종료하기 전 티스토리 네이버 로그아웃 할 것


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
Posted by DAVID