10. 함수
함수는 프로그램을 작성할 때 가장 중요한 단위로, 재사용 가능한 프로그램의 조각이다.
(이미 len
이나 range
와 같은 많은 내장 함수를 사용해왔다)
이러한 함수는def
키워드를 통해 정의됩니다.
def say_hello():
# block belonging to the function
print 'hello world'
# End of function
say_hello() # call the function
say_hello() # call the function again
실행결과
$ python function1.py
hello world
hello world
매개변수가 있는 함수
def print_max(a, b):
if a > b:
print a, 'is maximum'
elif a == b:
print a, 'is equal to', b
else:
print b, 'is maximum'
# directly pass literal values
print_max(3, 4)
x = 5
y = 7
# pass variables as arguments
print_max(x, y)
지역변수 활용
함수 안에서 변수를 선언하고 사용할 경우, 함수 밖에 있는 같은 이름의 변수들과 함수 안에 있는 변수들과는 서로 연관이 없다 .
이러한 변수들을 함수의 지역(local) 변수라고 하며, 그 범위를 변수의 스코프(scope)라고 부른다.
모든 변수들은 변수가 정의되는 시점에서의 블록을 스코프로 가지게 됩니다.
x = 50
def func(x):
print 'x is', x
x = 2
print 'Changed local x to', x
func(x)
print 'x is still', x
실행결과
$ python function_local.py
x is 50
Changed local x to 2
x is still 50
기본인수값
원하는 경우, 함수를 호출할 때 인수에 기본 값을 설정할 수 있다.
기본 인수값은 반드시 상수여야 하며, 매개 변수 목록에서 마지막에 있는 매개 변수들에만 기본 인수값을 지정해 줄 수 있습니다.
즉, 기본 인수값을 지정하지 않은 매개 변수의 앞에 위치한 매개 변수에만 기본 인수값을 지정할 수 없다.
이것은 함수 를 호출할 때 매개 변수의 위치에 맞춰서 값이 지정되기 때문이다.
예를 들어,def func(a, b=5)
는 옳은 함수 정의이지만 def func(a=5, b)
는 컴파일 에러가 발생한다.
def say(message, times=1):
print message * times
say('Hello')
say('World', 5)
실행 결과
$ python function_default.py
Hello
WorldWorldWorldWorldWorld
키워드 인수
함수를 호출할 때 여러 개의 매개변수 중 몇개만 인수를 넘겨주고 싶은 경우, 이름을 직접 지정하여 넘겨줄 수 있다.
매개 변수의 순서대로 값을 넘겨주는 것 대신, 매개 변수의 이름 (키워드) 를 사용하여 각각의 매개 변수에 인수를 넘겨 주도록 지정한다.
특정한 매개 변수에만 값을 넘기도록 하여 나머지는 자동으로 기본 인수값으로 채워지게 할 수 있다.
def func(a, b=5, c=10):
print 'a is', a, 'and b is', b, 'and c is', c
func(3, 7)
func(25, c=24)
func(c=50, a=100)
실행 결과
$ python function_keyword.py
a is 3 and b is 7 and c is 10
a is 25 and b is 5 and c is 24
a is 100 and b is 5 and c is 50
VarArgs 매개변수
가끔 함수에 임의의 개수의 매개 변수를 지정해줘야 할 때가 있는데, 이 때 VarArgs 매개 변수를 사용한다.
아래 예제와 같이 별 기호를 사용하여 임의의(Variable) 개수의 인수(Arguments) 를 표현한다.
def total(initial=5, *numbers, **keywords):
count = initial
for number in numbers:
count += number
for key in keywords:
count += keywords[key]
return count
print(total(10, 1, 2, 3, vegetables=50, fruits=100))
동작 원리
*가 있는매 변수, 예를 들어*param
과 같이 매개 변수를 지정해 주면
함수에 넘겨진 모든 위치 기반 인수들이 'param' 이라는 이름의 튜플로 묶여서 넘어옵니다.
또 이와 비슷하게 **가 달린 매개 변수, 예를 들어**param
과 같이 매개 변수를 지정해 주면
함수에 넘겨진 모든 키워드 인수들이 'param' 이라는 이름의 사전(Dictionary)으로 묶여서 넘어옵니다.
pass문
pass 문은 아무 기능이 없는 구문입니다. 이것은 빈 블록을 지정해 줄 때 사용됩니다.
def some_function():
pass
pass 문은 아무 기능이 없는 구문입니다. 이것은 빈 블록을 지정해 줄 때 사용됩니다.
11. 모듈
여러 함수들을 한꺼번에 불러들여 재사용할 때 모듈을 이용합니다.
모듈을 만드는 가장 간단한 방법은.py
확장자를 가진 파일을 하나 만들고 그 안에 함수들과 변수들을 정의하는 것이다.
다른 방법은 현재 사용중인 파이썬 인터프리터를 만드는데 사용되는 프로그래밍 언어로 모듈을 작성하는 것입니다.
( 예를 들어, 표준 파이썬 인터프리터를 사용 중인 경우C 언어를 이용하여 모듈을 작성하고 컴파일하면 파이썬에서 이것을 불러와 사용할 수 있다)
다른 프로그램에서 import 명령을 통해 모듈을 불러와 사용할 수 있다. 파이썬 표준 라이브러리도 동일하게 사용할 수 있다.
# 표준라이브러리 sys 모듈을 불러옴
import sys
print('The command line arguments are:')
for i in sys.argv:
print i
print '\n\nThe PYTHONPATH is', sys.path, '\n'
모듈을 불러오는 빠른 방법
모듈을 불러오는 것은 상대적으로 무거운 작업이기 때문에, 중간 단계의 바이트 컴파일된 파일(.pyc)을 만들어 두면 더 빨리 불러올 수 있다.
모듈의 name 속성
모든 모듈은 이름을 갖고 있으며, 모듈 내에 포함된 명령을 통해 모듈의 이름을 알아올 수 있다.
이 속성은 현재 모듈이 불러들여져서 사용되고 있는지 아니면 인터프리터에서 곧바로 실행된 것인지를 구문하는데 사용할 수 있다.
if __name__ == '__main__':
print 'This program is being run by itself'
else:
print 'I am being imported from another module'
실행결과
$ python module_using_name.py
This program is being run by itself
$ python
>>> import module_using_name
I am being imported from another module
>>>
동작 원리
파이썬 모듈 이름이 ’main` 일 경우 모듈이 사용자로부터 직접 실행된 것임을 의미한다.
dir 내장 함수
dir
내장 함수를 이용하여 객체에 정의되어 있는 식별자들의 목록을 불러올 수 있다.
예를 들어, 모듈의 경우 함수와 클래스 및 변수들의 식별자 이름이 정의되어 있다.
dir()
함수에 모듈 이름을 넘겨 주면, 모듈 안에 선언된 식별자 이름들의 목록을 반환해준다.
아무것도 넘겨주지 않는 경우, 현재 모듈에 선언된 식별자 이름들의 목록이 반환된다.
$ python
>>> import sys
# sys 모듈 내에 선언된 속성들의 식별자 이름 목록
>>> dir(sys)
['__displayhook__', '__doc__',
'argv', 'builtin_module_names',
'version', 'version_info']
# 실제로는 너무 길어 여기에는 몇 개만 적었음
# 현재 모듈에 선언된 속성들의 식별자 이름 목록
>>> dir()
['__builtins__', '__doc__',
'__name__', '__package__']
# 새로운 변수 'a' 생성
>>> a = 5
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'a']
# 식별자 이름 제거
>>> del a
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']
패키지
변수는 함수 내부에 존재하며, 함수와 전역 변수는 모듈 안에 존재한다.
모듈은 어디에 포함될까? 패키지라는 단위에 포함된다!
패키지는 그냥 단순한 폴더이지만, 파이썬에게 이 폴더는 파이썬 모듈을 담고 있다는 것을 알려 주는 역할을 하는 init.py라는 특별한 파일을 한 개 포함하고 있다
만약 'asia', 'africa’라는 하위 패키지를 포함하고 있는 'world' 라는 패키지를 만들고 싶다고 가정해 보자.
또한 각각의 하위 패키지는 'india', 'madagascar' 등등의 하위 패키지를 하나씩 더 갖고 있다.
이 경우, 아래와 같이 폴더 구조를 만들어 주면 된다.
- <some folder present in the sys.path>/
- world/
- __init__.py
- asia/
- __init__.py
- india/
- __init__.py
- foo.py
- africa/
- __init__.py
- madagascar/
- __init__.py
- bar.py
마무리
- 함수는 재사용 가능한 프로그램의 한 부분이며,
- 모듈은 재사용가능한 프로그램을 말하며,
- 패키지는 모듈을 구성하는 계층 구조를 말하며
- 파이썬과 함께 설치되는 표준 라이브러리는 이러한 패키지와 모듈로 이루어진 한 예제이다