Tuesday, May 29, 2018

python - What does ** (double star/asterisk) and * (star/asterisk) do for parameters?



In the following method definitions, what does the * and ** do for param2?



def foo(param1, *param2):
def bar(param1, **param2):

Answer



The *args and **kwargs is a common idiom to allow arbitrary number of arguments to functions as described in the section more on defining functions in the Python documentation.




The *args will give you all function parameters as a tuple:



def foo(*args):
for a in args:
print(a)

foo(1)
# 1


foo(1,2,3)
# 1
# 2
# 3


The **kwargs will give you all
keyword arguments except for those corresponding to a formal parameter as a dictionary.



def bar(**kwargs):

for a in kwargs:
print(a, kwargs[a])

bar(name='one', age=27)
# age 27
# name one


Both idioms can be mixed with normal arguments to allow a set of fixed and some variable arguments:




def foo(kind, *args, **kwargs):
pass


It is also possible to use this the other way around:



def foo(a, b, c):
print(a, b, c)

obj = {'b':10, 'c':'lee'}


foo(100,**obj)
# 100 10 lee


Another usage of the *l idiom is to unpack argument lists when calling a function.



def foo(bar, lee):
print(bar, lee)


l = [1,2]

foo(*l)
# 1 2


In Python 3 it is possible to use *l on the left side of an assignment (Extended Iterable Unpacking), though it gives a list instead of a tuple in this context:



first, *rest = [1,2,3,4]
first, *l, last = [1,2,3,4]



Also Python 3 adds new semantic (refer PEP 3102):



def func(arg1, arg2, arg3, *, kwarg1, kwarg2):
pass


Such function accepts only 3 positional arguments, and everything after * can only be passed as keyword arguments.


No comments:

Post a Comment

plot explanation - Why did Peaches' mom hang on the tree? - Movies & TV

In the middle of the movie Ice Age: Continental Drift Peaches' mom asked Peaches to go to sleep. Then, she hung on the tree. This parti...