python函数定义

前言

由于最近在阅读代码的时候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用的很少,但是由于之前没怎么好好看,遇到的时候有点不懂什么含义,今天做一个总结。如有错误之处,敬请指出。

参考

python offical documentation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值