- 在线时间
- 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 中,* 和 ** 具有语法多义性,具体来说是有四类用法。
3 H+ X3 ~, Y: G8 o
$ U+ j+ o1 k* N$ a. B4 l1 K8 U1. 算数运算 I$ t' M' b- n$ u. W6 \) x: `( f
# ^2 \/ b2 M5 k4 ~' y7 T
* 代表乘法
' Z* R( U1 n V( n* n8 `# \" K# ?/ P% S+ \/ ~6 Y( ^( b3 J; o
** 代表乘方
M: z$ k0 @5 |1 p5 E [! \1 }( W3 J7 [, E& R$ z0 z
>>> 2 * 5
9 z2 W; ^. g! @6 A9 J6 t) y: l10' f) @8 j2 g, Z8 s1 p
>>> 2 ** 5- I. r5 k7 ^3 r6 c- m
32
6 \0 x* y8 l8 t5 j! a2 g2. 函数形参( ^2 o" o1 ?& V9 x( D
2 b* Q4 f* f: W/ j. }+ G/ r# z4 ^*args 和 **kwargs 主要用于函数定义。
/ H5 T5 b/ J- \' F6 g6 p6 e4 Q5 d" @# G$ R
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。
3 j- ^9 T9 ?- P8 K5 C' j+ }# J& b) n& C, _$ d; o- ]
python函数传递参数的方式有两种:/ R( q4 |3 d4 ~4 S; g* b
, p! _( ^6 ?0 W$ p; Z% k: H位置参数(positional argument)
+ ~% F2 m `2 b关键词参数(keyword argument)1 y8 R# U. S" X. {
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
- d' t; h0 u" ~0 U7 N7 ?9 x; J0 N& L6 ?# z4 O& x: r7 s6 {
*args 表示任何多个无名参数,它本质是一个 tuple
- ?8 U/ ]( P( D0 N' U**kwargs 表示关键字参数,它本质上是一个 dict0 G6 y" V/ [0 \5 A& v- V7 `
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。1 n+ V3 [5 [ V& v; g9 S! N2 u) l
0 p D% q; m; S* i9 B, M>>> def fun(*args, **kwargs):
/ A8 u* l4 S1 X( V: i... print('args=', args); R2 P& E0 Z4 v
... print('kwargs=', kwargs)
: u- a: l! B; Z% m2 ^...
: v; @8 Z6 u0 M. S! j" Z>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')& \" V1 R6 C; B5 I
args= (1, 2, 3, 4)& A4 Y3 B; h# l9 ]( l: p5 ~
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}# T, L9 c ?& q7 s
使用 *args
9 D$ g" j* ?2 L7 b6 A/ k' j, F1 H3 M/ d
>>> def fun(name, *args):
8 g' u+ E8 U( K. x1 i) o... print('你好:', name)
6 q1 i" ?, D/ X$ z1 H( ]1 T... for i in args:
# C: E( \" P" T% f- y; Q5 [... print("你的宠物有:", i)
+ |% n4 Z" X0 h" F8 N. H7 ^...
2 i2 q6 g& ]0 h& D% L7 v. O0 R8 L>>> fun("Geek", "dog", "cat")7 o% Z# l% D! [. O7 d. S
你好: Geek. a; j3 M2 [+ r& ?3 I9 R+ }
你的宠物有: dog
3 }2 d8 M' a$ Z3 W2 O你的宠物有: cat
& d' o! x5 [: S e& a3 Q" O使用 **kwargs
$ H0 S, |* v5 s6 Y! d
0 M- |' a6 z! x {4 T, d>>> def fun(**kwargs):% M# ]. v$ ^3 _. c' Y1 T( Q4 |
... for key, value in kwargs.items():
( X+ b6 i1 z+ q+ e/ a, D% m G... print("{0} 喜欢 {1}".format(key, value)); \; a$ E4 _1 }8 F0 a
...
, e3 C W+ q6 k) U>>> fun(Geek="cat", cat="box")& i* N* U; U& r0 \' O
Geek 喜欢 cat5 c7 D, E. c1 u/ s5 G
cat 喜欢 box/ e9 L4 Y) k0 Y4 J0 c7 x
3. 函数实参
7 @5 L1 f; T5 R
# A/ m! f( ~9 N: h0 c. F如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:! ^9 k: q: l1 I( @4 O
# t u3 m; W1 \, Q>>> def fun(data1, data2, data3):* y; P) S% ~+ v/ g$ |
... print("data1: ", data1)! ]' X" C9 _# p4 j$ f z" N# x: a/ @
... print("data2: ", data2) @2 Y$ }8 ^& y J6 \* q. B
... print("data3: ", data3)& x; ]4 {: M7 E- j4 O
... & e& s, X/ v' M. w2 z a$ Q+ b5 C
>>> args = ("one", 2, 3): W6 P0 ^. N) k8 q
>>> fun(*args)' p, j* i) f6 a; u
data1: one3 P! I2 Y0 v J. }' ~0 a
data2: 2
1 K' e1 o8 a( g4 R3 Udata3: 3' h5 y+ r. ^" v! C K
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}( S5 ^; ^" k- \
>>> fun(**kwargs)
) Q3 ` w* \) r" w1 z; S n4 Fdata1: 3! t2 [3 j4 X3 g4 j3 n
data2: 2
( \1 B6 e' G, [, ^* @$ a& rdata3: one
6 u }; r+ C. O! M. C4 o# |4 ~% [4. 序列解包
2 h* `+ r$ [9 e: O+ G
e* u0 X" T. C& F: H+ ]% w序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
; d' J& ?# d7 c; X9 _0 Q; w9 K$ ~. y2 D
>>> a, b, *c = 0, 1, 2, 3 r; [, f5 G% I& j, {! q
>>> a
8 I# h* T+ N5 _0 $ L) ~/ a1 E, v+ U4 k! H# j# B
>>> b
+ A ]; k( C4 _4 m1
+ @) V! Z* C/ b) [ r' _2 d; b>>> c
2 p" c" }8 a$ D6 ?[2,3]' |% t8 I9 H' g# O' g) g
|
zan
|