본문 바로가기
IT/Python

Python - 함수

by 최고영회 2018. 8. 27.
728x90
반응형
SMALL
Python 에서 함수는 def 키워드를 통해 정의 한다.
max = 50
x = 50
def func(a,b,x):
    global max
    
    print('x is',x)
    x = 2
    tmp = 0
  
    if a > b :
        tmp = a
    elif a < b :
        tmp = b
    else:
        tmp = a

    if tmp > max:
        print(tmp, 'is maximum')
    else:
        print(max, 'is maximum')

func(41,31,4)
print('x is still',x)
재밌는 것은 함수 밖에 정의된 max 를 func 안에서는 인식하지 못한다는 것이다. scope 가 정확히 나뉘어져 있다. 함수 안에서 상위 블록의 변수에 접근하기 위해서는 함수안에 해당 변수를 global 이라는 키워드로 정의 해 줘야 한다. 위 코드의 결과는 아래와 같다. x is 4 50 is maximum x is still 50

함수의 매개변수에 default 값을 지정할 수 도 있다. 다만, 함수의 매개변수는 순서에 따라 지정되기 때문에 default 값 지정은 항상 함수의 마지막 매개변수에만 지정가능하다. 예제를 통해 살펴 보자.
# 아래 함수는 정상이다.
def say1(msg, times=1):
    print(msg*times)

# 아래 함수도 정상이다.
def say2(msg, times, abc=2):
    print(msg*times)
    print(abc)

# 아래 함수도 정상이다.
def say3(msg='default msg', times=1, abc=2):
    print(msg*times)
    print(abc)

# 아래 함수는 어떨까?
def say4(msg, times=1, abc):
    print(msg*times)
    print(abc)

# 아래 함수는 어떨까?
def say5(msg='hello msg', times):
    print(msg*times)

say1()
say1('hello',5)
say4 함수는 어떻게 될까? 아래와 같이 친절한 에러가 발생한다. 물론 say5 함수도 같은 오류를 발생한다. SyntaxError: non-default argument follows default argument



위에서 default 값을 사용할 때 순서보장에 대한 불편함이 있었다. python 에서는 이 불편함을 해소하기 위해 키워드 argument 라는 것을 제공한다.
def say6(a, b=5, c=10):
    print('a is',a, 'b is',b, 'c is',c)

say6(11, c=20)




우리는 함수의 매개변수 갯수와 상관없이 받기를 원할때가 있다. Java에서 str... 을 사용하는 것 처럼 말이다. python 또한 유사한 기능을 제공한다.
def total(init=5, *numbers, **keywords):
    '''Return sum of total numbers.

    numbers and keywords must be not empty'
    count = init
    for number in numbers:
        count += number
    for key in keywords: 
        count += keywords[key]
    print(total.__doc__)
    return count

print(total(10, 1, 2, 3, vegetables=50, fruits=100))
*numbers 처럼 별을 하나 달아주면 함수에 넘겨진 모든 위치 기반 인수들이 param 이라는 이름의 튜플로 묶여서 넘어온다. **keywords 처럼 별을 두개 달아주면 함수에 넘겨진 모든 키워드 인수들이 param 이라는 이름의 사전으로 묶여서 넘어온다. '튜플'과 '사전' 은 다음에 알아보기로 하고....



함수에 포함된 첫번째 논리적 명령행에 적어둔 문자열은 'DocString'이라고 불리우는 것으로 나중에 문서화 할 때에도 사용 된다. DocString에 대한 규칙(사실 규칙은 아니지만 강력 권장)이 있다. 첫번째줄의 첫문자는 대문자로, 마지막 문자는 마침표로 끝나도록 작성한다. 두번째 줄은 비워 두고, 세번째 줄부터는 상세하게 작성한다. help(total) 하면 DocString 을 볼 수 있다.
728x90
반응형
LIST

'IT > Python' 카테고리의 다른 글

Python - I/O, File I/O, pickle  (0) 2018.09.10
Python - Class  (0) 2018.09.07
Python - 자료구조  (0) 2018.08.30
Python - 기본문법  (0) 2018.08.27
Python 시작하기 - hello world  (0) 2018.08.24