[Python] 함수

전보·2020년 6월 4일
0

함수

1. 인수에 관하여

선언 인수형 정하기

함수형에 인수형을 표현해 주는 것도 가능하다.

def add_num( a: int, b: int) -> int:
    return a + b

result = add_num('a', 'b') #에러가 나진않음. 결과는 ab라고 나옴.

그리고 인수를 넘겨줄 때 헷갈리지 않게 인수명을 기입할 수 도 있다.

result = add_num(a = 3, b = 5) 
#같은의미
result = add_num(b = 5, a = 3) 

디폴트인수의 주의점

숫자나 문자의 경우에는 함수에서 디폴트 인수를 써도 수치참조이기 때문에 아무 문제가 없지만,
리스트나 사전의 경우에는 주소참조이므로 디폴트 인수를 쓰면 버그가 일어날 수 있다.
그래서 리스트나 사전의 경우에는 디폴트 인수를 쓰지 않는 것이 좋다.

다음의 예를 보자.

#리스트에 숫자를 추가해주는 함수
def func1(x, l = []):
    l.append(x)
    return l

r = func1(100)
print(r)
#결과 -> [100]

r = func1(100)
print(r)
#결과 -> [100, 100]

이와 같이 함수를 새로 불러와도 l이라는 리스트는 같은 주소값을 가르키기 때문에, 같은 리스트에 추가가된다.

이를 해결하기 위해서는 아래의 코드로 변경해야 한다.

#리스트에 숫자를 추가해주는 함수
def func1(x, l = None):
    if l is None:
        l = []
    l.append(x)
    return l

r = func1(100)
print(r)
#결과 -> [100]

r = func1(100)
print(r)
#결과 -> [100]

위치 인수의 튜플화

인수 앞에 을 써서 불러오는 인수들을 튜플화 할 수 있다.
따라서 다음코드와 같이
f의 f를 출력하면 튜플이 나온다.

def somthing_fruit(*f):
    print(f)   #결과 -> ('This', 'is', 'banana')
somthing_fruit('This', 'is', 'banana')

그냥 인수와 튜플인수를 섞어 쓸수도 있고,
넘겨줄 때도 *t처럼 튜블자체를 넘겨 줄 수도 있다.

def somthing_fruit(this, *f):
    print(this)
    for arg in f:
        print(arg)
        
#somthing_fruit('This', 'is', 'banana')
t = ('is', 'banana')
somthing_fruit('This', *t)

인수의 사전화

** 을 통해 넘겨받은 인수를 사전화 할 수 있다.

def fruit(**kwargs):
    print(kwargs)  #결과 -> {'banana':'100', 'apple' : '300'}
    for k, v in kwargs.items()
        print(k, v)
        #결과
        #banana 100
        #apple 300

fruit(banana = 100, apple = 300)

이것도 **d 와 같이 사전자체를 넘겨줄 수 있다.

def fruit(**kwargs):
    for k, v in kwargs.items()
        print(k, v)
        
d = {
    'banana' : 100
    'apple' : 300
}
fruit(**d)

#결과
#banana 100
#apple 300

전부 섞어쓰기

위의 경우들을 섞어 쓸 수 있지만, 주의해야 할 부분은,
( 기본 인수 -> * (튜플화) -> ** (사전화) )순서대로 불러와야 한다.

def menu(food, *args, **kwargs):
    print(food)
    print(arfs)
    print(kwargs)

menu('banana', 'apple', 'orange', main = 'sushi', drink = 'beer')

#결과
#banana
#('apple', 'orange')
#{'main' : 'sushi', 'drink' : 'beer'}
profile
엉망진창

0개의 댓글