- 在线时间
- 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 中,* 和 ** 具有语法多义性,具体来说是有四类用法。( W. Q) A) t, ]% z$ H1 o( M
6 Q0 i `: }) ~- _( t1. 算数运算; e" W7 _( P+ f) ]8 I
$ u7 s3 e z% _* \5 H* 代表乘法* W9 T% }7 x9 w W6 G
5 ?2 {! W6 ^6 b% l
** 代表乘方
% L/ M, g( V$ i" H
* T- V7 J4 p3 a. h- @>>> 2 * 5' @" x. v2 q9 r- K
10
1 I# B5 K! C6 V( |7 I" Y- ?/ K4 ]>>> 2 ** 5
3 A. I6 C2 Z q, P32
0 c- r1 h0 n+ Z5 d2. 函数形参
' H( M y6 e3 `
6 }7 k- O& d- V y' U8 N" Q*args 和 **kwargs 主要用于函数定义。
[: K" k8 s/ _: @& E1 e' O3 j9 n) s
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。
; q) Y7 v- E5 W" A
4 k) P# C3 O( Xpython函数传递参数的方式有两种:( i# p* W3 l9 L, s2 y% P& p
( W& w% m% Y6 i7 I7 \/ g9 R5 l% ^位置参数(positional argument)+ j+ J8 C# L3 S% B5 |2 |
关键词参数(keyword argument)
; J7 M" @" O9 q* q6 w*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
, q& F, G7 f, u
0 ?6 D: l* s* i7 Z5 q3 f*args 表示任何多个无名参数,它本质是一个 tuple
( `* g% R1 p5 n) Q**kwargs 表示关键字参数,它本质上是一个 dict
8 ~8 B6 y3 i. A7 Y( j7 b如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。
* I( p* V* V3 j1 y% {% C$ `2 U( C+ [2 }5 T
>>> def fun(*args, **kwargs):8 V4 Q4 c/ |/ H ~! ^- g) F$ X
... print('args=', args)
! m0 f L0 x0 A" ^$ C3 j... print('kwargs=', kwargs)* X4 t e+ @% \6 n j9 @3 j
... 8 N" U8 h4 N, Y# V+ b, k x
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')/ y& K$ X5 X& k1 c3 F! [5 _/ ?) Z
args= (1, 2, 3, 4)4 D. P4 I9 f5 X" L1 ?4 S' u
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}0 {& j Z, q9 \: N: h! q, j& H3 |, r
使用 *args k: y) H+ Q7 S' |1 F
8 \- `* C+ D" Z* u>>> def fun(name, *args):
; G4 i1 f" b3 ^5 G9 ~( P... print('你好:', name)+ ]" `8 ]% |6 i' p: x
... for i in args:
! p$ D; L6 l2 y# w% E$ a... print("你的宠物有:", i)
6 f/ ^* p. V, ^$ l/ S... 5 J/ r U$ l- _4 E" ~" G/ {, n) N, X
>>> fun("Geek", "dog", "cat")' E6 F% h" D* l/ Q% ?1 Y
你好: Geek
- Y2 Z& R$ k, E你的宠物有: dog' N' {7 K6 i% W% n
你的宠物有: cat5 y i( L' G! }4 U& g
使用 **kwargs
9 i" G* J% b4 W% M( A9 H9 W
% a6 \4 K% X* o0 h( s2 z>>> def fun(**kwargs):
( g* a e( R+ G0 A... for key, value in kwargs.items():
0 S1 W: g5 `1 X1 W* ]0 V" c... print("{0} 喜欢 {1}".format(key, value))+ i! |5 b: O! I T$ p+ ]
...
& r1 w/ Z7 f% i! H, o" q>>> fun(Geek="cat", cat="box")
& X( j& C( Y0 z8 a( |* A/ {Geek 喜欢 cat
6 C7 N9 x ^) ~3 h1 I+ Zcat 喜欢 box
+ }; b3 l8 y$ Z K% D3. 函数实参( G! H" @2 p. [' m
" c: W3 O9 k: W
如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:5 ?) l9 }/ d" p* U& q! d& {8 N+ O6 X
% k0 d' f2 ]% K
>>> def fun(data1, data2, data3):
: U) a+ }5 e# D$ O/ y* f7 y0 f+ o z... print("data1: ", data1)
8 T* o) X; i" k/ z1 K... print("data2: ", data2)- P, n" U' L: Z+ U- W& `
... print("data3: ", data3)
- F, G* Q2 |9 a& s% R9 _ a- s...
$ ]# Z. k! N( t>>> args = ("one", 2, 3)5 O& u# v" m1 y/ Q
>>> fun(*args); x3 n/ @" k5 T3 X
data1: one
0 ^) ~" m) X+ \7 d" C2 ddata2: 2
7 {+ Q2 f+ @1 |0 n) {/ b, p; sdata3: 3
8 d1 o1 }& Q2 W9 g- H>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}: X6 |/ W' o& d- v
>>> fun(**kwargs)$ K& c, r* B0 K4 K. `( v% B
data1: 3) h, H" I6 h- ~6 j
data2: 2
+ L( M7 k% q, m! G; u9 P$ ^* fdata3: one/ D6 D$ a, u$ Q. L, K% j- l
4. 序列解包
5 H: X- s' b! o8 W6 {8 O/ b4 {, I8 H- `' l# w5 i
序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。3 O( G: z, V- |2 B4 W0 g; f
( E, P4 a( h! U2 G
>>> a, b, *c = 0, 1, 2, 3 ( Q+ D6 _2 {6 p1 k5 n. }, L; W
>>> a ! e& L/ r; I6 U6 i: P4 h
0
5 c X" s+ r5 f2 E" j/ G9 E>>> b % a1 E/ |. O1 r" Z) _- w
1
' z! c$ Q2 j6 i! D$ w>>> c 1 d; x, |" _: w- p; J8 [
[2,3]- o9 e6 T# }6 Q5 I" S8 e
|
zan
|