Python 3-모듈
모듈을 사용하면 Python 코드를 논리적으로 구성 할 수 있습니다. 관련 코드를 모듈로 그룹화하면 코드를 더 쉽게 이해하고 사용할 수 있습니다. 모듈은 바인딩하고 참조 할 수있는 임의로 이름이 지정된 속성이있는 Python 객체입니다.
간단히 말해서 모듈은 Python 코드로 구성된 파일입니다. 모듈은 함수, 클래스 및 변수를 정의 할 수 있습니다. 모듈에는 실행 가능한 코드도 포함될 수 있습니다.
예
aname이라는 모듈의 Python 코드는 일반적으로 aname.py라는 파일에 있습니다. 다음은 간단한 모듈 support.py의 예입니다.
def print_func( par ):
print "Hello : ", par
return
수입 명세서
다른 Python 소스 파일에서 import 문을 실행하여 모든 Python 소스 파일을 모듈로 사용할 수 있습니다. 그만큼import 다음 구문이 있습니다-
import module1[, module2[,... moduleN]
인터프리터가 import 문을 만나면 모듈이 검색 경로에 있으면 모듈을 가져옵니다. 검색 경로는 인터프리터가 모듈을 가져 오기 전에 검색하는 디렉토리 목록입니다. 예를 들어 hello.py 모듈을 가져 오려면 스크립트 맨 위에 다음 명령을 입력해야합니다.
#!/usr/bin/python3
# Import module support
import support
# Now you can call defined function that module as follows
support.print_func("Zara")
위의 코드가 실행되면 다음과 같은 결과가 생성됩니다.
Hello : Zara
모듈은 가져 오는 횟수에 관계없이 한 번만로드됩니다. 이렇게하면 여러 가져 오기가 발생하는 경우 모듈 실행이 반복적으로 발생하지 않습니다.
from ... import 문
파이썬 from문을 사용하면 모듈의 특정 속성을 현재 네임 스페이스로 가져올 수 있습니다. 그만큼from...import 다음 구문이 있습니다-
from modname import name1[, name2[, ... nameN]]
예를 들어, fib 모듈에서 fibonacci 함수를 가져 오려면 다음 명령문을 사용하십시오.
#!/usr/bin/python3
# Fibonacci numbers module
def fib(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a + b
return result
>>> from fib import fib
>>> fib(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
이 문은 전체 모듈 fib를 현재 네임 스페이스로 가져 오지 않습니다. 모듈 fib의 항목 fibonacci를 가져 오는 모듈의 전역 기호 테이블로 소개합니다.
from ... import * 문
다음 import 문을 사용하여 모듈에서 현재 네임 스페이스로 모든 이름을 가져올 수도 있습니다.
from modname import *
이렇게하면 모듈의 모든 항목을 현재 네임 스페이스로 쉽게 가져올 수 있습니다. 그러나이 문은 드물게 사용되어야합니다.
모듈을 스크립트로 실행
모듈 내에서 모듈의 이름 (문자열)은 전역 변수 __name__의 값으로 사용할 수 있습니다. 모듈의 코드는 마치 가져온 것처럼 실행되지만 __name__은 "__main__"로 설정됩니다.
이 코드를 모듈 끝에 추가하십시오.
#!/usr/bin/python3
# Fibonacci numbers module
def fib(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a + b
return result
if __name__ == "__main__":
f = fib(100)
print(f)
위의 코드를 실행하면 다음과 같은 출력이 표시됩니다.
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
모듈 찾기
모듈을 가져올 때 Python 인터프리터는 다음 순서로 모듈을 검색합니다.
현재 디렉토리.
모듈이 없으면 Python은 쉘 변수 PYTHONPATH에서 각 디렉토리를 검색합니다.
다른 모든 방법이 실패하면 Python은 기본 경로를 확인합니다. UNIX에서이 기본 경로는 일반적으로 / usr / local / lib / python3 /입니다.
모듈 검색 경로는 시스템 모듈 sys에 sys.path변하기 쉬운. sys.path 변수에는 현재 디렉토리, PYTHONPATH 및 설치 종속 기본값이 포함됩니다.
PYTHONPATH 변수
PYTHONPATH는 디렉토리 목록으로 구성된 환경 변수입니다. PYTHONPATH의 구문은 쉘 변수 PATH의 구문과 동일합니다.
다음은 Windows 시스템의 일반적인 PYTHONPATH입니다.
set PYTHONPATH = c:\python34\lib;
그리고 여기에 UNIX 시스템의 전형적인 PYTHONPATH가 있습니다.
set PYTHONPATH = /usr/local/lib/python
네임 스페이스 및 범위 지정
변수는 객체에 매핑되는 이름 (식별자)입니다. 공간은 변수 명 (키)와 해당 오브젝트 (값)의 사전이다.
Python 문은 로컬 네임 스페이스 와 전역 네임 스페이스의 변수에 액세스 할 수 있습니다 . 지역 변수와 전역 변수의 이름이 같으면 지역 변수는 전역 변수를 숨 깁니다.
각 함수에는 고유 한 로컬 네임 스페이스가 있습니다. 클래스 메서드는 일반 함수와 동일한 범위 지정 규칙을 따릅니다.
파이썬은 변수가 로컬인지 글로벌인지에 대해 교육적인 추측을합니다. 함수에서 값이 할당 된 모든 변수는 로컬이라고 가정합니다.
따라서 함수 내의 전역 변수에 값을 할당하려면 먼저 global 문을 사용해야합니다.
- global VarName 문 은 Python에 VarName이 전역 변수임을 알려줍니다. Python은 변수에 대한 로컬 네임 스페이스 검색을 중지합니다.
예를 들어 글로벌 네임 스페이스에 Money 변수를 정의 합니다. Money 함수 내에서 Money에 값을 할당하므로 Python은 Money를 지역 변수로 가정합니다.
그러나 설정하기 전에 로컬 변수 Money 의 값에 액세스 했으므로 UnboundLocalError가 결과입니다. 전역 명령문의 주석 처리를 제거하면 문제가 해결됩니다.
#!/usr/bin/python3
Money = 2000
def AddMoney():
# Uncomment the following line to fix the code:
# global Money
Money = Money + 1
print (Money)
AddMoney()
print (Money)
dir () 함수
dir () 내장 함수는 모듈에서 정의한 이름을 포함하는 정렬 된 문자열 목록을 리턴합니다.
목록에는 모듈에 정의 된 모든 모듈, 변수 및 함수의 이름이 포함됩니다. 다음은 간단한 예입니다.
#!/usr/bin/python3
# Import built-in module math
import math
content = dir(math)
print (content)
위의 코드가 실행되면 다음과 같은 결과가 생성됩니다.
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan',
'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp',
'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh',
'sqrt', 'tan', 'tanh']
여기에서 특수 문자열 변수 __name__은 모듈의 이름이고 __file__은 모듈이로드 된 파일 이름입니다.
globals () 및 locals () 함수
그만큼 globals() 과 locals() 함수를 사용하여 호출 된 위치에 따라 전역 및 로컬 네임 스페이스의 이름을 반환 할 수 있습니다.
만약 locals() 함수 내에서 호출되면 해당 함수에서 로컬로 액세스 할 수있는 모든 이름을 반환합니다.
만약 globals() 함수 내에서 호출되면 해당 함수에서 전역 적으로 액세스 할 수있는 모든 이름을 반환합니다.
이 두 함수의 반환 유형은 사전입니다. 따라서 이름은keys() 함수.
reload () 함수
모듈을 스크립트로 가져올 때 모듈의 최상위 부분에있는 코드는 한 번만 실행됩니다.
따라서 모듈의 최상위 코드를 다시 실행 하려면 reload () 함수를 사용할 수 있습니다 . reload () 함수는 이전에 가져온 모듈을 다시 가져옵니다. reload () 함수의 구문은 다음과 같습니다.
reload(module_name)
여기서 module_name은 모듈 이름을 포함하는 문자열이 아니라 다시로드하려는 모듈의 이름입니다. 예를 들어, hello 모듈을 다시로드하려면 다음을 수행하십시오.
reload(hello)
Python 패키지
패키지는 모듈, 하위 패키지 및 하위 하위 패키지 등으로 구성된 단일 Python 애플리케이션 환경을 정의하는 계층 적 파일 디렉터리 구조입니다.
Phone 디렉토리에서 사용 가능한 Pots.py 파일을 고려하십시오 . 이 파일에는 다음과 같은 소스 코드 줄이 있습니다.
#!/usr/bin/python3
def Pots():
print ("I'm Pots Phone")
비슷하게, 위와 같은 이름의 다른 기능을 가진 다른 두 파일이 있습니다. 그들은-
Isdn () 함수가있는 Phone / Isdn.py 파일
G3 () 함수가있는 Phone / G3.py 파일
이제 전화 디렉토리에 __init__.py 파일을 하나 더 만듭니다.
- Phone/__init__.py
Phone을 가져올 때 모든 함수를 사용할 수 있도록하려면 다음과 같이 __init__.py에 명시적인 import 문을 넣어야합니다.
from Pots import Pots
from Isdn import Isdn
from G3 import G3
이러한 행을 __init__.py에 추가하면 Phone 패키지를 가져올 때 이러한 모든 클래스를 사용할 수 있습니다.
#!/usr/bin/python3
# Now import your Phone Package.
import Phone
Phone.Pots()
Phone.Isdn()
Phone.G3()
위의 코드가 실행되면 다음과 같은 결과가 생성됩니다.
I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone
위의 예에서는 각 파일에서 단일 함수의 예를 사용했지만 파일에 여러 함수를 유지할 수 있습니다. 해당 파일에 다른 Python 클래스를 정의한 다음 해당 클래스에서 패키지를 만들 수도 있습니다.