回答

收藏

*and**有什么作用

技术问答 技术问答 282 人阅读 | 0 人回复 | 2023-09-12

在下列定义中,*and**有什么作用param2?
6 _, r! t" N' ]5 `  A
    def 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 Q
    def 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 l
    def 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 中成为标准。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则