1. 모듈이란?
여러 기능을 모아둔 파이썬 파일
모듈은 파일 이름에서 .py확장자를 빼고 부른다.
코드를 모듈화 시키면
한 파일에서 구현하고자 하는게 더 명확해진다.
코드를 짜고 관리하기 쉬워진다.
코드 재사용이 쉽다.
2. 모듈 사용하기
다른 모듈을 불러오려면 import 명령을 써서 모듈을 불러오면 된다.
불러온 모듈의 함수를 사용하려면 모듈이름 뒤에 .을 찍고 함수를 호출하면 된다.
# 바뀌지 않을 값을 상수라고 부르는데, 상수들은 대문자로 이름을 지어서 저장한다.
PI = 3.14
def circle(radius):
return PI * radius * radius
def square(length):
return length * length
# 다른 모듈을 불러오려면 import 명령을 써서 모듈을 불러오면 된다.
import area
# 불러온 모듈의 함수를 사용하려면 모듈이름 뒤에 .을 찍고 함수를 호출하면 된다.
print(area.circle(2))
print(area.square(3))
print(area.PI)
3. 모듈을 가져오는 여러가지 방법
모듈에 있는 함수가 전부 다 필요한게 아닌 일부만 필요할 때는 import가 아닌 from명령어를 사용한다.
circle 함수 자체를 가져왔기 때문에 앞에 모듈이름을 써주지 않고 그대로 호출할 수 있다.
from area import circle
print(circle(2))
모듈에서 또 다른것을 가져오고 싶으면 import circle 뒤에 ,를 찍고 가지고 오고싶은 것의 이름을 써주면 된다.
from area import circle, square
불러오는 모듈이나 함수의 이름을 원하는대로 바꿔주기
import area as ar # area 모듈을 가져오는데 이름을 ar로 하겠다는 뜻
print(ar.circle(2))
함수이름 바꿔주기
from area import square as sq
print(sq(3))
*를 사용하면 모듈에 있는 모든 내용을 가지고 온다.
4. 모듈 정리
모듈 임포트(import)
모듈에 저장된 기능을 가져다 쓰기 위해서 사용
임포트 방법
1. import <module>
모듈 전체를 임포트 한다. 모듈 안에 있는 변수 또는 함수는 .으로 접근 가능
import area
print(area.circle(2))
print(area.PI)
2. from <module> import <member>
모듈에서 필요한 것들만 임포트 한다. 불러온 변수나 함수를 접근할때 앞에 module.을 붙이지 않는다.
from area import circle, square
print(circle(2))
print(square(3))
3. from <module> import *
모듈에서 모든걸 임포트 한다.
이 방식을 사용하면 어떤 함수기 어떤 모듈에서 왔는지 알수 없고 자신도 모르게 쓸모없는 것들을 가지고 올 수도 있어서 파이썬 커뮤니티에서는 권장하지 않는 방식이다.
from area import *
print(PI)
print(circle(2))
print(square(3))
4. as 키워드
임포트문 뒤에 as라는 키워드(특별한 의미를 가지고 있는, 이미 예약된 문자열)를 붙여서 임포트하는 것의 이름을 바꿔줄 수 있다.
# 모듈 이름을 바꿈
import area as ar
print(ar.circle(2))
# 함수 이름을 바꿈
from area import square as sq
print(sq(3))
5. dir 함수
어떤 파일 안에서 정의된 모든 이름들을 알려주는 함수
import area
print(dir(area))
['PI', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'circle', 'square']
가 나오는데 area모듈에서 정의한 PI,circle, square 말고도 다른 이름들도 나오는데, 모두 이름 양옆에 언더스코어_가 두개씩 붙어있다.
파이썬에서는 이름 양옆에 언더스코어가 두개씩 붙은 것들을 특수변수라 부른다.
읽을때는 보통 던더라고 부르는데, 던더는 더블 언더 스코업를 줄인 말이다.
특수변수는 파이썬이 내부적으로 관리하는 변수들이다.
파일에서 정의된 이름들을 확인하려면 dir 함수안에 아무 파라미터도 안넣어주면 된다.
import area
print(dir())
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'area']
모듈을 임포트하면 이 파일에서는 모듈의 이름만 정의되고 모듈 안에있는 함수나 변수의 이름들은 정의되지 않는다.
6. 네임스페이스
네임스페이스는 파일에서 정의된 모든 이름들을 뜻한다.
dir함수는 파일에 네임스페이스를 리턴해주는 것이다.
from area import circle, square
def square(length):
return 4 * length
print(dir())
print(square(3)) #12
다른파일에 정의한 square 함수가 나오는 것이 아닌 바로 아래쪽에 정의한 square 함수가 호출된다.
파이썬에서는 똑같은 이름으로 여러 함수가 정의되었을 때 가장 나중에 정의된 함수를 쓴다.
square라는 이름이 중복되지 않게 하려면 두가지 방법이 있다.
1. 모듈에서 square 함수를 가져올 때 이름을 다른걸로 바꿔준다.
모듈에서 가지고 오는 square 함수는 sq로 파일에서 정의한 square함수는 그대로 square
from area import circle, square as sq
def square(length):
return 4 * length
print(dir()) *
print(square(3)) #12
print(sq(3)) #9
*['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'circle', 'sq', 'square']
네임스페이스를 확인해 보면 sq와 square가 따로있다.
2. 모듈 그대로 임포트 해준다.
import area
def square(length):
return 4 * length
print(dir()) *
print(square(3)) #12
print(area.square(3)) #9
*['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'area', 'square']
모듈 자체를 임포트해오면 모듈에 어떤 함수나 변수가 있던 모듈이름만 네임스페이스에 추가되기 때문에 네임스페이스를 쉽게 관리할 수 있다.
7. 스탠다드 라이브러리
모듈이란 여러가지 기능을 정리해둔 파이썬 파일을 뜻한다.
파이썬에서는 개발자들이 많이 쓸법한 기능들이 모듈로 만들어져 있다.
파이썬을 설치하면 스탠다드 라이브러리 라는 것이 오는데, 스탠다드 라이브러리에는
int, float, string 같은 자료형
print, dir 같은 내장 함수
유용한 기능을 제공하는 모듈 (스탠다드 모듈)이 있다.
스탠다드 모듈 사용법
모듈이름을 쓰고 뒤에 사용하고 싶은 함수를 불러오면 된다.
import math
math.log10()
math.cos()
math모듈에 있는 특정 함수들만 가져오고 싶으면 from math import log10, cos로 써주고 함수 앞에있는 모듈 이름을 지워준다.
from math import log10, cos
log10()
cos()
8. 스크립트
파이썬에서는 실제로 프로그램을 작동시키는 코드를 담은 실행용도의 파일을 스크립트라 한다.
모듈은 프로그램에 필요한 변수들이나 함수들을 정의해 놓은 파일을 말하므로 보통 모듈은 직접 실행하지 않고 다른 파일에서 가져다 와서 쓴다.
위의 run파일은 스크립트, area파일은 모듈이 된다.
9. 모듈을 스크립트로 사용해 보기
스크립트는 실행하는 파일, 모듈은 불러오는 파일
스크립트와 모듈은 그안에 어떤 내용을 담을지 정한것일 뿐 파일 자체에는 특별한 차이가 없다.
어떤 파일이든 직접 실행할 수 있고, 다른곳에사 불러올 수도 있다.
PI = 3.14
def circle(radius):
return PI * radius * radius
def square(length):
return length * length
print(circle(2) == 12.56) # True
print(circle(5) == 78.5) # True
print(square(2) == 4 ) # True
print(square(5) == 25) # True
import area
x = float(input('원의 반지름을 입력해 주세요: '))
print('반지름이 {}인 원의 면적은 {}입니다.\n'.format(x, area.circle(x)))
y = float(input('정사각형의 변의 길이를 입력해 주세요: '))
print('변의 길이가 {}인 정사각형의 면적은 {}입니다.'.format(y, area.square(y)))
True
True
True
True
원의 반지름을 입력해 주세요: 4
반지름이 4.0인 원의 면적은 50.24입니다.
정사각형의 변의 길이를 입력해 주세요: 4
변의 길이가 4.0인 정사각형의 면적은 16.0입니다.
파이썬에서는 모듈을 임포트 하면 모듈 안에 있는 모든 코드가 실행된다.
밑에 있는 코드들까지 실행이 되어버려서 run 파일을 실행해도 True가 모두 출력된다.
10. __name__
실행파일에서 모듈에 있는 코드가 출력되는 문제를 해결하려면 __name__이라는 특별변수를 사용하면 된다.
name은 모듈의 이름을 저장해둔 변수이다.
name의 값은 파이썬에서 알아서 정해 주는데, 파이썬 파일을 직접 실행하면 그 파일의 name은 main으로 설정되고 파일을 다른곳에서 임포트해서 사용하면 name은 원래 모듈 이름으로 설정된다
area파일을 직접 실행하면 area파일의 name은 main으로 설정되고 다른곳에서 불러와서 사용하면 name은 area가 된다.
print('area 모듈 이름: {}'.format(__name__)) # area 모듈 이름: __main__
PI = 3.14
def circle(radius):
return PI * radius * radius
def square(length):
return length * length
print(circle(2) == 12.56)
print(circle(5) == 78.5)
print(square(2) == 4 )
print(square(5) == 25)
모듈의 이름이 main이라고 나온다.
print('run 파일 이름: {}'.format(__name__))
import area
print('run 파일 실행')
run 파일 이름: __main__
area 모듈 이름: area
True
True
True
True
run 파일 실행
run파일을 실행하면 area파일은 임포트 되기때문에 이름이 그냥 area라고 나오고,
run파일은 직접 실행하니까 이름이 main이라고 나온다.
코드의 실행순서 역시 run파일의 name을 출력하고 area파일에 있는 모든 코드를 실행시킨 후 run 파일로 와서 아래에 있는 코드를 출력시킨다.
area파일이 직접 실행될때만 True들을 실행시키려면 조건문을 써주고 테스트 코드들을 안으로 옮겨주면 된다.
print('area 모듈 이름: {}'.format(__name__))
PI = 3.14
def circle(radius):
return PI * radius * radius
def square(length):
return length * length
if __name__ == '__main__':
print(circle(2) == 12.56)
print(circle(5) == 78.5)
print(square(2) == 4 )
print(square(5) == 25)
파일의 name이 main인지 확인하는 것은 파일이 직접 실행됐는지를 확인하는 것과 같다.
area파일을 직접 실행시키면 파일의 name은 main이 되기때문에 조건문의 내용에 충족되므로 조건문 안에 있는 코드가 실행된다.
하지만 area 파일을 다른 곳에서 임포트해서 사용하면 name은 area가 되기 때문에 조건문을 만족시키지 못하고, 조건문 안에 있는 코드는 실행되지 않는다.
print('run 파일 이름: {}'.format(__name__))
import area
print('run 파일 실행')
run 파일 이름: __main__
area 모듈 이름: area
run 파일 실행
위의 area에 조건문을 추가하고 run 파일을 실행시키면 True값들이 출력되지 않는다.