함수형에 인수형을 표현해 주는 것도 가능하다.
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'}