- 在线时间
- 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 中,* 和 ** 具有语法多义性,具体来说是有四类用法。1 e; `: W( w/ m: P9 b* I8 G
) a7 x3 l# P* E3 n( A0 i
1. 算数运算. H+ _4 g0 P- B) J, m4 _$ p3 j
: [) Z" I6 ?2 |
* 代表乘法
, y( Y/ [$ l0 D& p
: R# ^: W; u7 B) t4 ?" q# j+ g** 代表乘方
" X8 A) B3 n$ E# E3 L
* U. Q- A. e! r" E/ r7 ]/ S1 r>>> 2 * 5+ h" w6 m8 q) J* P1 g
10
3 d; j0 O" k. f$ P>>> 2 ** 5$ I, C7 A# N! S* r# T
32
+ d. N: M* T" {* C) ^1 Y2. 函数形参' m4 s3 o; x& Z0 H5 k
6 u. }9 r9 B8 }* ^2 o1 C*args 和 **kwargs 主要用于函数定义。
9 m& F I9 o* A% `+ x& ^7 t4 U
& u2 L4 K7 ]( b你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。, H; R( [2 w* Q
) v' T1 L# q. ^7 v/ r @python函数传递参数的方式有两种:* P( D. ^- ?# f" E5 F
: F' D8 J2 s( M+ D; i位置参数(positional argument)
' m9 L% ~9 E$ `3 h+ D8 P( O# @8 K关键词参数(keyword argument)
' A" T: [4 z' L+ Y' t7 {4 e*args 与 **kwargs 的区别,两者都是 python 中的可变参数:. ^: k$ Z1 R* u5 C; f" n, a i
4 ?" p4 ~+ o w5 ?7 r. M
*args 表示任何多个无名参数,它本质是一个 tuple
6 [- w1 S9 e. G9 U% z**kwargs 表示关键字参数,它本质上是一个 dict7 q/ m' S0 i$ v
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。' ~! ~# N' M! n7 T, l
5 V3 _ O1 l$ h# Z# {>>> def fun(*args, **kwargs):
/ L# b" A" |8 K! ^* P4 H3 E# n' g( Y... print('args=', args)6 ~. p4 B5 A; ]& x* b r
... print('kwargs=', kwargs)/ |8 S; P5 A0 e9 P- U! n; T
...
2 h9 X7 N- _; J; {6 k: Y>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
7 p) s3 j) F0 q7 Vargs= (1, 2, 3, 4)) a$ A; p$ _1 _ ]0 s
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}! {6 P3 [% a& Z4 S& h( r0 a6 @
使用 *args
. d+ C6 s( E2 _5 K! t5 c# h
0 X# l/ }$ ^! O/ S. f>>> def fun(name, *args):6 Y: a! Y3 F+ W
... print('你好:', name)/ Z$ a2 z( `7 Z8 o/ k6 `
... for i in args:
4 |* {! R: z: H* V+ ?... print("你的宠物有:", i)
" j3 k; m4 q) E... " V" B% m* g& ]" h5 p" ?/ v
>>> fun("Geek", "dog", "cat")2 j3 _; K1 t0 l6 b1 N
你好: Geek
: P; `9 F; ?7 Q: O+ w你的宠物有: dog
' I; Q) d3 O w" P7 }8 I你的宠物有: cat
1 t( M2 n+ Y- y) a使用 **kwargs
2 w9 E6 F. {, ?5 G( q Y
: Z, {; m, G8 }% }>>> def fun(**kwargs):2 x1 g% ^9 l" a$ U( b; r2 t
... for key, value in kwargs.items():
( H5 p' E0 F" q5 ]1 U! T+ c... print("{0} 喜欢 {1}".format(key, value)); q, q' t L! D" @. ?) L/ a* Y
...
6 K- F, [ O& O6 b>>> fun(Geek="cat", cat="box")
& \2 j+ r; v) R& j3 s: fGeek 喜欢 cat d( Q4 g) W! v1 f! i6 Z2 a9 @: A% W
cat 喜欢 box
& G& `& L. T+ k2 h3 x5 P7 d1 s+ {3. 函数实参4 [! e; D) W" w+ T# Q, p, N3 p
( w5 n5 g4 T- i3 ?- c
如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:
. u$ X2 s# Z8 K
9 X% B$ J- {3 k$ G, j$ T>>> def fun(data1, data2, data3):0 Q. K* u- A5 I; o. {* X
... print("data1: ", data1)! x2 H5 x+ |$ s: I! Y
... print("data2: ", data2)1 K1 n* ]( Y$ m& e6 p
... print("data3: ", data3)
0 |: K9 O( p3 [7 Y... 2 `: ]. s: U5 K4 w: |
>>> args = ("one", 2, 3)
. }, s* `4 J: u* _>>> fun(*args)
% S- r3 P; |; Pdata1: one8 k& F% z8 t8 A; M2 J1 }+ g
data2: 20 }" }6 b" M" Q8 L% h( s& F5 q; o
data3: 33 ~* D9 Y) Y; ^/ d- I
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}# c9 G& b! H' l8 v6 X7 @
>>> fun(**kwargs)
; s. H7 _ Q8 r) p$ o" ?& Qdata1: 3$ y( P3 H0 C5 [1 `3 G6 N+ b
data2: 2, }' K* m6 N5 E) X4 |, ~) [, J
data3: one
' ~4 b' ?8 ^- N8 P5 J4. 序列解包
" k, r; S& U) R( F$ r4 w5 D( t- A1 f7 o& W9 G: i
序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
" a1 @" v& N( d( {! p$ z& t0 g
* R; u8 \0 E& g! q: u' `>>> a, b, *c = 0, 1, 2, 3
+ L) m g- M% T9 t' _& H>>> a 4 \$ K# l; S5 q' n8 [
0 : z, }! l, `+ G; B8 L3 H" M
>>> b
4 I! ]- ]. f/ G% h4 n1
3 V$ s* L( l% w! k' x* `>>> c & L3 w+ i) d0 r' I. h( @ e
[2,3], i; n$ L! D B/ V
|
zan
|