- 在线时间
- 4 小时
- 最后登录
- 2020-9-7
- 注册时间
- 2020-4-15
- 听众数
- 1
- 收听数
- 0
- 能力
- 0 分
- 体力
- 6 点
- 威望
- 0 点
- 阅读权限
- 60
- 积分
- 4
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 5
- 主题
- 2
- 精华
- 0
- 分享
- 0
- 好友
- 0
TA的每日心情 | 开心 2020-5-30 12:37 |
|---|
签到天数: 1 天 [LV.1]初来乍到 网络挑战赛参赛者
 |
在 Python 中,* 和 ** 具有语法多义性,具体来说是有四类用法。
* I& C% m7 e s: R z: r7 e6 u
) y' S. t" B# b" [$ E+ S1. 算数运算* Y! \3 R8 d. p$ n6 Y2 ]
6 L0 z9 s U4 U7 ]- I/ \5 \
* 代表乘法# f# X+ A6 Q g0 J( s. V e
2 H i3 ~/ p( }
** 代表乘方
9 [7 j* d/ o- e" }& U
% c8 o# m5 ]1 }# M* J7 X% B( Q>>> 2 * 5* c0 f4 U6 F4 X/ {1 t3 d9 S/ P. t( K
10
) M J7 ?/ j) A% n4 C2 {% C; }" G. ~>>> 2 ** 5
2 I: A/ ~+ ]4 o" c" t6 m$ l, \: A328 w/ |. ?! [6 p) e
2. 函数形参
: `0 a9 j' O6 F* m& _: S
5 F" M, k& @# v6 i*args 和 **kwargs 主要用于函数定义。
0 \+ ^4 O8 j+ j$ a1 L! k, u8 s" K9 L }) ~) @3 u% V9 o4 P3 o
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。$ f$ H% P4 v" f8 r- }8 n0 `
+ [$ k1 e; l. l: z( h3 I
python函数传递参数的方式有两种:9 h% t9 c) x( I5 t, Z+ D
/ W! @( ~; u/ e9 A8 z+ h
位置参数(positional argument)
, P b H7 v4 Z8 f" c关键词参数(keyword argument)
* o% e+ r5 v7 `*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
8 `- O; R+ [2 [* U8 L. D+ T* z: F- l( n
*args 表示任何多个无名参数,它本质是一个 tuple
( W" z/ |( D C1 Q+ b**kwargs 表示关键字参数,它本质上是一个 dict/ z* M( m V h \8 A
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。
; C; [5 k- X8 q1 r+ y4 e& w7 p( v6 x6 J
>>> def fun(*args, **kwargs):
3 j& T P$ B- H0 t0 a1 l6 ]. _# x... print('args=', args)
6 j* Q- ~5 w2 J* a# @' q... print('kwargs=', kwargs)9 L0 H. m3 h& Y, [3 F6 X& `
... 0 I( S- A; I' u! |! `
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
$ {+ k& L1 g7 x% T' Nargs= (1, 2, 3, 4)% U2 L- k# M+ n `
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}6 R. y+ c% S. i6 U& L
使用 *args. m1 H) r7 |$ Z* l+ j+ C: z
; S/ L& j6 F2 a% V* o k, Q8 |- \' A>>> def fun(name, *args):
' g5 D, g' D; y$ v4 D- E- `# L... print('你好:', name)
9 @% U6 g/ s% k. U) Q* f; E% T... for i in args:, Z( J! y" d7 y4 ?' Z; @6 O2 z
... print("你的宠物有:", i)
7 z6 ~1 d' h7 }# j+ V# \9 p. u* f( { A: @... / u: d# c: |5 A( w; R& M
>>> fun("Geek", "dog", "cat")
6 s9 r9 }1 c4 j你好: Geek8 y" h4 X3 q; Z# f
你的宠物有: dog
9 B: B o6 Q' Y" S& G0 [/ R9 ?# b你的宠物有: cat9 G7 f* J/ u2 P2 C
使用 **kwargs( j8 P, s# z4 T9 p. L* N$ h
# s) Q' }9 V4 k( D
>>> def fun(**kwargs):& U4 [# i4 s7 _- i/ w
... for key, value in kwargs.items():" N: L* w* z8 V7 p
... print("{0} 喜欢 {1}".format(key, value))+ y5 n4 R3 n# A; c0 ]" m9 F
... " g: Y, B! V8 S$ r/ Q& x) D& f
>>> fun(Geek="cat", cat="box")
+ I* {3 O3 X' h" JGeek 喜欢 cat# X x& _# a k2 |
cat 喜欢 box
; K4 E k8 l0 E* _* A7 p" c3. 函数实参
" H. E# i8 F0 d: D, k' X3 O9 Y
- n2 p: `6 B4 E2 @5 a2 @6 B+ Z如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:) D6 C) P2 a- {4 C2 @
/ q+ j. Z" A# x; r/ w+ L>>> def fun(data1, data2, data3):* ]5 U! ~1 f2 R- x" F
... print("data1: ", data1)
8 R" z7 x l+ g/ r5 M% k/ Z# ~/ g! x... print("data2: ", data2)7 j) e, Z7 G8 k9 ^! ~- m" C) {
... print("data3: ", data3)& a8 O3 p& N# d/ K. Y! h3 u
...
8 Q6 |) h/ A5 Q. z. \8 D* q>>> args = ("one", 2, 3)
: ?+ u8 S! t3 f) K>>> fun(*args)0 Q; S* v$ Q+ W
data1: one0 g$ M r8 ]/ N Q6 F
data2: 22 S' M% D& h( i
data3: 3
$ v1 ~7 e u6 `) C5 a2 B>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}- r* e+ c2 ^7 d& B: c5 X
>>> fun(**kwargs)
9 M: D3 N$ N2 q! V9 qdata1: 3' u0 H1 k2 c, [3 P5 l4 t% z. b8 b
data2: 22 z o0 T, l$ V c9 K0 s! H1 s9 b, D
data3: one
" o" E$ m. s; H6 z2 W& o4 C4. 序列解包8 Y( X# c7 L# j* s& X3 f
% h; y* I/ [: j) ~$ z$ y序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。4 d- W! Q. @6 z; C8 q
% [! O5 j% b0 q0 {2 J$ l
>>> a, b, *c = 0, 1, 2, 3 , I8 q; @; G. d$ f1 s7 v3 }
>>> a ' Z+ i5 g3 g7 [8 N
0
|- L/ B8 ~4 s4 P9 h& b9 `, G>>> b
& I- H3 x7 N# j, O$ T; L4 h; `: M1
1 S, W7 y+ r" a L. E; r>>> c $ E9 |' u0 } a' F8 n+ r
[2,3]
3 B" l8 m% s4 {- b& K' f! x( }7 k0 d6 ? |
zan
|