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

마무리

  • 함수는 재사용 가능한 프로그램의 한 부분이며,
  • 모듈은 재사용가능한 프로그램을 말하며,
  • 패키지는 모듈을 구성하는 계층 구조를 말하며
  • 파이썬과 함께 설치되는 표준 라이브러리는 이러한 패키지와 모듈로 이루어진 한 예제이다

results matching ""

    No results matching ""