|
在下列定义中,*and**有什么作用param2?
6 _, r! t" N' ]5 ` Adef foo(param1,*param2):def bar(param1,**param2):
) K8 t; d) z4 o& X- i! t
; m. @) r) X8 Q$ G9 G6 s. L 解决方案:
* _8 m" c+ D d# e: w *argsand是常见的**kwargs习惯性使用允许函数使用任何数量的参数,如Python 文档中关于定义函数的更多部分所述。
1 T, L5 f6 {- C$ U将为您提供*args所有函数参数作为元组:$ f' V1 `7 @9 d) Q
def foo(*args): for a in args: print(a) foo(1)# 1foo(1,2,3)# 1# 2# 3) O. V; T* z7 q
**kwargs为您提供所有 关键字参数,除与字典形式参数对应的关键字参数外。, b4 v: p+ }; E. x- E
def bar(**kwargs): for a in kwargs: print(a,kwargs[a]) bar(name='one',age=27)# name one# age 27. s9 V$ l& p3 O6 ^
这两个习语可以与普通参数混合,允许一组固定和一些可变参数:+ S5 m r9 {" |" G3 Z& q- q
def foo(kind,*args,**kwargs): pass" s- @% a( C* M, w* s+ ^
也可反过来使用:
% v2 w$ N& G2 m4 Qdef foo(a,b,c): print(a,b,c)obj = {'b':10,'c':'lee'}foo(100,**obj)# 100 10 lee/ ^/ E/ z0 t" c/ N Y
*l另一种习惯用法是调用函数解压参数列表。$ ^- e+ g& d2 E& @7 ?) k4 K
def foo(bar,lee): print(bar,lee)l = [1,2]foo(*l)# 1 2
) {8 ~ f: T* K$ a 在 Python 3 中,可以*l使用赋值左侧(Extended Iterable Unpacking),尽管在这种情况下,它给出了一个列表,而不是一个元组:8 I! d8 _' H- B0 `8 t" s
first,*rest = first,*l,last =
: H) @, r0 h9 f! a: p9 E6 {* c Python 3 还添加了新语义(请参考)PEP 3102):
+ g0 y% l5 l$ @& ]9 ldef func(arg1,arg2,arg3,*,kwarg1,kwarg二、 pass
: i) P' M0 Y. S# {* a 这种函数只接受 3 位置参数,然后所有内容*只能作为关键字参数传递。, N* o/ u+ z3 d" U9 `4 e" q& K# P' g0 D
笔记:dict 用于关键字参数的语义传递Python任意排序。但是,在 Python 3.在6 中,记住关键字参数的插入顺序。1 F0 F2 j: ~6 Q# c+ S9 [
“**kwargs现在元素的顺序对应于关键字参数传递给函数的顺序。- Python 3.6 的新功能
: [# ~2 O' I4 G! l4 K& C; f事实上,CPython 3.所有中的所有 dicts 将记住插入顺序作为实现细节Python 3.7 中成为标准。 |
|