*args 와 **kwargs 사용하기 - 슬기로운 파이썬 트릭 中
2018. 1. 1. 23:20ㆍ분석 Python/책 구현 리뷰
이전에 했던 것
def doubler(f):
def g(x) :
return 3*f(x)
return g
def cal(x) :
return x+10
ff=doubler(cal)
print(ff(10)) # (10+10) X 3
def cal2(x,y):
return x+y
g=doubler(cal2)
g(1,2) # -> 임의의 수의 인자를 받는 함수 만들어 줘야 한다
# args kwargs -> argument unpacking
# 함수 정의에 주로 사용한다.
def magic(*args , **kwargs) :
print("unnamed args:",args)
print("keyword args:", kwargs)
magic(1,2,key="word",key2="word2")
# args -> 이름이 없는 인자로 구성된 tuple
# kwargs -> 이름이 주어진 인자로 구성된 dict 형이다
# 반대로 정해진 수의 인자가 있는 함수를 호출할때도 list 나 dict로 인자를 전달 할 수 있다.
def other_f(x,y,z):
return x+y*x
x_y_list=[1,2]
z_dict={"z":3}
other_f(*x_y_list,**z_dict)
# args , kwargs 이용하면 희한한것 가능
# 참고로 args kwargs 관습이다 *var , **vars 해도 작동함
def double_correct(f) :
"""f 인자 상관없이 작동"""
def g(*args,**kwargs) :
return 2*f(*args,**kwargs)
return g
a = double_correct(cal2)
a(1,3)
## *args
# *args is used to send a non-keyworded variable length argument list to the function
def test_var_args(f_arg, *argv):
print("first normal arg:", f_arg)
for arg in argv:
print("another arg through *argv :", arg)
test_var_args('yasoob','python','eggs','test')
## **kwargs 사용
# **kwargs allows you to pass keyworded variable length of arguments to a function.
def greet_me(**kwargs):
if kwargs is not None:
for key, value in kwargs.items():
print("%s == %s" %(key,value))
greet_me(name="yasoob")
## Using *args and **kwargs to call a function
def test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
args = ("two", 3,5)
test_args_kwargs(*args)
kwargs = {"arg3": 3, "arg2": "two","arg1":5}
test_args_kwargs(**kwargs)
def print_three_things(a, b, c):
print( 'a = {0}, b = {1}, c = {2}'.format(a,b,c))
mylist = ['aardvark', 'baboon', 1]
print_three_things(*mylist)
3.4 *args와 **kwargs 재미있게 활용하기
*args와 **kwargs는 파이썬에서 굉장히 유용한 방법이다.
이런 식으로 같은 5를 매핑해도 그냥 쓰는 것과 특정 값에다가 넣는 것이 위치가 다르게 나온다.
선택적 또는 키워드 매개 변수 전달하기
한 함수에서 다른 함수로 선택적 또는 키워드 매개 변수를 전달할 수 있다.
3.5 함수 인자 풀기
*, ** 연산자를 잘 사용만하면 연속된 데이터와 딕셔너리에서 함수 인자를 풀어내는 기능을 쉽게 할 수 있다
def print_vector(x,y,z) :
print(f"<{x} , {y} , {z}>")
만약 tuple 이나 list를 넣는 다면?
다음과 같이 argument 가 부족하다는 식으로 나온다.
이러한 함수에 대해서는 *를 이용해서 함수 인자를 풀 수 있다.
Dictinoary 같은 경우에는 **로 풀면 된다
함수에서 사용하는 **kwargs 사용 방법 (꿀팁)
1. 특정 kwargs 값이 있는지 없는지 체크하기
2. 특정값을 안 넣었을 때는 원하는 값으로 넣기
def test(**kwargs) :
if "type" in kwargs :
type = kwargs.get("type")
if type == "simple" :
stddev = kwargs.get('stddev', 0.02)
print(stddev)
else :
raise Exception("Unknown type {}".format(type))
else :
raise Exception("Not Exist Type")
위의 그림을 보면 stddev를 설정해주지 않아도 default 값인 0.02로 설정되었다.
오른쪽 그림에서는 stddev를 설정하면, 0.02말고 10으로 설정된 것을 알 수 있다.
그리고 type이라는 것을 argument를 사용하는지 안하는지 체크하는 것을 만들고 없으면 에러가 나게 발생했다.
728x90
'분석 Python > 책 구현 리뷰' 카테고리의 다른 글
미술관에 GAN 딥러닝(Generative Deep Learning) Code (0) | 2019.11.17 |
---|---|
파이썬을 활용한 딥러닝 전이학습 책 Code (0) | 2019.11.17 |
[ Python ] 자신만의 예외 클래스 정의하기 - 슬기로운 파이썬 트릭 책 中 (0) | 2019.09.29 |
[ Python ] Decorator - 슬기로운 파이썬 트릭 책 中 (0) | 2019.09.29 |
[ Python ] 파이썬 객체에서 with 사용 - 슬기로운 파이썬 트릭 책 中 (0) | 2019.09.29 |