- 在线时间
- 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 中,* 和 ** 具有语法多义性,具体来说是有四类用法。
( K7 H6 j$ Y5 U! A( p
. a* z4 h R' n- k9 h$ N) t; O1. 算数运算+ X& L/ Z3 F3 u
9 a3 K: d+ N% r) Q$ R* t' P
* 代表乘法
& ~9 y- l- I; l) \2 ^' q2 [1 h6 [5 F, P; ]. i5 U" O. Z
** 代表乘方
8 @& j6 o8 L# }
- I0 o* i3 A# t6 e+ i" A" W>>> 2 * 55 j$ ^( `' I7 d
104 R' N$ t2 h ^2 g
>>> 2 ** 5" }) x8 `$ J$ b* Y- X' n
32: [4 r T# ~5 U6 S! w* S
2. 函数形参" c/ |4 @! \. Y/ d
' p5 C- ?' `- o- H1 B
*args 和 **kwargs 主要用于函数定义。
, g8 v6 w( T0 @ c1 I+ |9 y! I7 K% S( d; H& J b) }9 ^) a* w" q
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。; L2 ^ N) R& t5 b# [$ K% k8 i% U
) @: z& v( D) F
python函数传递参数的方式有两种:7 t) \* I- F e2 l# \* @3 |
3 m. g* a3 _" }: c: A* t
位置参数(positional argument)
: W; N( n* }$ P0 K( M; z3 S2 \关键词参数(keyword argument)
8 T1 T4 w5 v% r+ H+ k/ C*args 与 **kwargs 的区别,两者都是 python 中的可变参数:4 [& ]' r, f2 @- M" U- g
- f! A( z w/ }, Q2 F: u. N4 N*args 表示任何多个无名参数,它本质是一个 tuple
, F) G5 `4 O. d B* d* x. w**kwargs 表示关键字参数,它本质上是一个 dict
' m, [: p: x+ p( K. _0 s如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。" [0 m, @5 ^7 [7 _
, S) `0 X7 v: a+ |' z& @
>>> def fun(*args, **kwargs):9 {* b2 k: V- q! i
... print('args=', args)7 ~( d, w# k" G) E$ l
... print('kwargs=', kwargs)
$ z6 ]6 ^: ]# J% w }...
- |* w! L/ Y- |% u+ g$ \( b. n; o>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
! U* g, ~; p6 l1 hargs= (1, 2, 3, 4)
" F0 T' ^. x3 K4 N0 V7 Pkwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}, W2 q; i' m$ c( T
使用 *args: L; B/ f# } n/ F8 _: z
# J& ]; v' l% I>>> def fun(name, *args):
3 X" |9 Q& `8 m- Z5 k2 \... print('你好:', name)
# A2 B y4 M' }* W" ?5 {! o... for i in args:
$ {; a& ^- g2 z: l" T N( U$ t... print("你的宠物有:", i)6 g4 M2 q, O2 ?0 a
... ' X6 S: u4 K' g4 W
>>> fun("Geek", "dog", "cat")
! s) f) i, ?! _# @* N+ u( ]7 X7 ? J你好: Geek
9 I2 i. s" {0 W3 H& J你的宠物有: dog$ g' e- g; |6 _7 b& }! u* a; ?% M
你的宠物有: cat
7 V) z- m! d+ C, O7 E$ \使用 **kwargs) H. d5 P6 W8 b* I6 I* g
" R1 M" N6 [7 `>>> def fun(**kwargs):7 g: v9 R* G* G4 D$ F
... for key, value in kwargs.items():% q3 j5 n5 ~; H" S: u. n/ _- Y
... print("{0} 喜欢 {1}".format(key, value))0 m" P( W0 W' Y
...
" ]% `; M% J; J; l$ g" B* a3 B# d>>> fun(Geek="cat", cat="box"); ]. c E, V; B: n0 W% V) r1 u
Geek 喜欢 cat( C2 _& n3 F( i
cat 喜欢 box
% v& H% @. W; E, `8 Q% [3. 函数实参
: |# E" k P4 r% w7 C
: U% q7 Q9 {6 d# }! p( }( }如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:) Y1 \9 c! R' C& e" y" T
. I/ {8 P' p& _; s& ?$ u>>> def fun(data1, data2, data3):0 R9 b$ N; @, C; h
... print("data1: ", data1)8 G+ @" E: \. ^
... print("data2: ", data2): w: ]' a# w. J2 g0 ~$ \
... print("data3: ", data3) s: a; u, E. N9 o" S% c
... 5 D# V6 Y/ i; ?; H7 h u. `
>>> args = ("one", 2, 3)
1 U+ D8 G: X/ o' W5 U/ m" l>>> fun(*args)$ E. s! \! f3 p& ~3 Q% |
data1: one
1 F% Q! Z# U2 k8 gdata2: 2
6 f) f; O3 p& v" W" ?" d5 X, @data3: 3
( J7 a: j+ e% U" k) y# r: m>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}/ f# h7 W8 h* c" u9 g
>>> fun(**kwargs)7 t2 K; v# g" o) d+ X
data1: 35 v; N+ k5 y1 `% [( o. N* |
data2: 2
1 \+ x$ t, v' n+ r! K! Bdata3: one) L- H/ W }5 `8 ?8 z4 N
4. 序列解包
& D' F \! ?$ `
& g- [$ Q$ v3 Y( A. w- V6 D: k! F序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
3 s! ^! p% u6 O; ?* H
' W- `3 I% ^4 t+ T>>> a, b, *c = 0, 1, 2, 3 , Z; |! [5 d' U
>>> a 5 P4 N' h. Y6 P& r4 i
0
0 a* |9 V* t$ C1 h$ R# }>>> b % O! W, j% f; ~0 U
1
4 S7 |" s5 s* T$ k* M4 A>>> c ' U' S# U- b0 C; S8 X
[2,3]2 T/ y, v6 Y5 L* g5 m
|
zan
|