python学习笔记:第10天 函数进阶和作用域
程序员文章站
2022-04-14 20:27:49
1. 函数进阶 动态接收位置参数 之前写的函数都是固定参数的,假设有个函数需要的参数由几十个,一个个写在形参的位置会非常麻烦,因此我们要考虑使用动态参数,使用动态参数时需要在参数前加 ,表示接收多个参数: 从上面的例子我们可以看出,动态参数可以接收任意个参数,在形参中作为一个元组的形式传递过来;但是 ......
1. 函数进阶
动态接收位置参数
之前写的函数都是固定参数的,假设有个函数需要的参数由几十个,一个个写在形参的位置会非常麻烦,因此我们要考虑使用动态参数,使用动态参数时需要在参数前加*
,表示接收多个参数:
in [13]: def func5(a, b, c, d, e, f): ...: print(a, b, c, d, e, f) in [14]: func5(1, 2, ,3 ,4 , 5, 6) # 按照之前的写法是在传参的时候参数的个数都是固定的 1 2 3 4 5 6 in [18]: def func6(*args): # 使用动态接收参数后可以接收任个位置参数 ...: print(args) in [19]: in [19]: func6(1, 2, 3 ,4 , 5, 6, 7, 8, 9, 10) (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) in [20]:
从上面的例子我们可以看出,动态参数可以接收任意个参数,在形参中作为一个元组的形式传递过来;但是此时要注意的是:动态参数必须要在位置参数的后面:
in [20]: def func7(*args, a, b): ...: print(args) in [21]: func7(1, 2, 3, 4) --------------------------------------------------------------------------- typeerror traceback (most recent call last) <ipython-input-21-8171430efdb6> in <module> ----> 1 func7(1, 2, 3, 4) typeerror: func7() missing 2 required keyword-only arguments: 'a' and 'b' in [22]:
位置参数放在后面的时候,所有的参数都被args接收了,即a和b永远接收不到参数,因此动态参数必须在位置参数的后面
in [22]: def func8(a, *args, b=100): # 正确使用方法 ...: print(a, args, b) in [23]: func8(1, 2, 3, 4) 1 (2, 3, 4) 100 in [24]: def func8(a, b=100, *args): ...: print(a, args, b) in [25]: func8(1, 2, 3, 4) 1 (3, 4) 2 in [26]: func8(1, 2) 1 () 2 in [27]: func8(1) 1 () 100 in [28]:
从上面的例子可以看出,默认参数放在动态传参在之前时,只有在一种情况下才有效,即位置参数不够的情况下,会使用默认参数的值,那此时的动态传参也就没有意义了;所以只有当默认参数放在动态参数后面时,默认参数时永远生效的。
那么我们可以总结出动态传参的要注意的顺序:**位置参数, *动态参数, 默认参数**
动态接收关键字参数
在python中使用*
可以动态接收位置参数,但是这种方法并无接收关键字参数,在python中应该使用**
来接收动态关键字参数
in [28]: def func8(**kwargs): ...: print(kwargs) in [29]: func8(a='aaa', b='bbb') {'a': 'aaa', 'b': 'bbb'} in [30]:
顺序的问题, 在函数调⽤的时候, 如果先给出关键字参数, 则整个参数列表会报错.
def func(a, b, c, d): print(a, b, c, d) # 关键字参数必须在位置参数后⾯, 否则参数会混乱 func(1, 2, c=3, 4)
所以关键字参数必须在位置参数后⾯. 由于实参是这个顺序. 所以形参接收的时候也是这个顺序. 也就是说位置参数必须在关键字参数前⾯. 动态接收关键字参数也要在后⾯
最终顺序(*)为:
- 位置参数 > *args > 默认值参数 > **kwargs
这四种参数可以任意的进⾏使⽤.如果想接收所有的参数:
def func(*args, **kwargs): print(args, kwargs) func("麻花藤","⻢晕",wtf="胡辣汤")
动态参数的另⼀种传参⽅式:
def fun(*args): print(args) lst = [1, 4, 7] fun(lst[0], lst[1], lst[2])
关于名字空间和作用域部分明天再更新