前言
由于最近在阅读代码的时候python传参的意义总是搞不明白,借此机会总结一下。这篇文章主要列举常用的传参类型。
1. 设置默认参数值
当我们在传参的同时并给其赋值,如果我们调用的时候传入想传入和不想传入这个参数都可以,增加了函数的灵活性。我们用下面的一个例子说明
def ask_ok(prompt, retries=4, reminder='Please try again!'):
while True:
ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
if ok in ('n', 'no', 'nop', 'nope'):
return False
retries = retries - 1
if retries < 0:
raise ValueError('invalid user response')
print(reminder)
我们可以用以下方式调用这个函数:
1.仅传入一个必须传入的参数:ask_ok("Do you really want to quit?")
2. 在1的基础之再传入一个可选参数:ask_ok("Ok to overwrite the file?,2)
3. 设置所有参数:ask_ok("Ok to overwrite the file?,2,"Come or no!")
有一点需要注意的是:默认值是在定义过程中再函数定义的时候计算的,例如
i = 5
def f(arg=i):
print(arg)
i = 6
f()
结果为还是为5,也就是说,一旦我们在定义函数的时候传入了一变量作为默认值,那么不论我们在后面修改这个变量值的时候,默认值是不变的。
Important warning
默认值只会执行一次这条规则在默认值为可变对象如列表,字典以及大多数实力类时候很重要。如下面函数回持续给后面调用传递参数。
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
结果为
[1]
[1, 2]
[1, 2, 3]
如果不想这样,那么可以直接设置L=None
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
2.关键字传参
可以使用形如kwarg=value
的关键字俩调用函数。例如
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print("-- This parrot wouldn't", action, end=' ')
print("if you put", voltage, "volts through it.")
print("-- Lovely plumage, the", type)
print("-- It's", state, "!")
然后以下的形式都是可以的
parrot(1000) # 1 positional argument
parrot(voltage=1000) # 1 keyword argument
parrot(voltage=1000000, action='VOOOOOM') # 2 keyword arguments
parrot(action='VOOOOOM', voltage=1000000) # 2 keyword arguments
parrot('a million', 'bereft of life', 'jump') # 3 positional arguments
parrot('a thousand', state='pushing up the daisies') # 1 positional, 1 keyword
但是需要注意的是关键字参数必须跟随在位置参数的后面.
当形如**name
的形式参数的时,他会接受一个字典,字典中包含所有除了与形式参数对应的其他关键字参数。可以和形如*name
形式的参数结合,该参数会接受一个包含形式参数列表之外的位置参数的元组。*name 必须出现在**name之前
def cheeseshop(kind, *arguments, **keywords):
print("-- Do you have any", kind, "?")
print("-- I'm sorry, we're all out of", kind)
for arg in arguments:
print(arg)
print("-" * 40)
for kw in keywords:
print(kw, ":", keywords[kw])
#调用
cheeseshop("Limburger", "It's very runny, sir.",
"It's really very, VERY runny, sir.",
shopkeeper="Michael Palin",
client="John Cleese",
sketch="Cheese Shop Sketch")
总结
在我个人使用中,关键字传参和默认参数用的比较多,后面的形如*name
和**name
用的很少,但是由于之前没怎么好好看,遇到的时候有点不懂什么含义,今天做一个总结。如有错误之处,敬请指出。