- 在线时间
- 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 中,* 和 ** 具有语法多义性,具体来说是有四类用法。% Y5 d+ J l0 L
( N* K& v' r' R6 }4 I4 f g2 ?, i( o
1. 算数运算$ [: @- d; F% u; a
; R# g/ k" S! s* ]+ F, s( L/ e! j
* 代表乘法( w; Y* {! ~( O% o+ E
/ F$ e- S$ P7 ~: g5 W! i$ W** 代表乘方
+ T4 t: P# v+ o0 Y$ L) o
) {/ C& F1 x/ @2 a>>> 2 * 5& g# x: }$ B5 X' a
10
3 F9 M d* v) s8 P" |7 |>>> 2 ** 5
; c7 }& P8 M1 m9 h. M32
8 U# D1 b F& ?1 l- _2 I2. 函数形参8 K i2 A* u4 p, B
' m) M1 R6 @, m* n; d
*args 和 **kwargs 主要用于函数定义。
+ [% c: j& s. ?- L4 f& C' I/ E2 @
M3 o3 B* }4 _; t你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。
- \1 g5 ~( k1 `+ y+ _! _
4 {6 y D* f7 v; Dpython函数传递参数的方式有两种:
( [+ {! ~( s$ b6 o+ o( Y" X" A. i4 V: b* w4 ^
位置参数(positional argument)5 ~: j6 V$ u$ Y0 C) s i
关键词参数(keyword argument)
$ @7 Y; v" T# z) m7 A*args 与 **kwargs 的区别,两者都是 python 中的可变参数:, e& r: [1 k( P4 _* S1 c
( K& b7 ~- V* l: R$ l*args 表示任何多个无名参数,它本质是一个 tuple% C ]4 g( a' ?* k6 |
**kwargs 表示关键字参数,它本质上是一个 dict
' y, }0 n7 [. u' h如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。, O1 f1 v3 f7 i! }; o) c& W/ f
9 I, d/ f* U5 {: G' I>>> def fun(*args, **kwargs):. |1 r/ b3 g8 R$ \4 R' i
... print('args=', args)
+ {* |$ `, K$ l0 T8 a/ W... print('kwargs=', kwargs)% ~+ f& |% L* j
...
% y5 |6 e6 C6 }6 I( u$ r>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
6 f. z4 o3 L: p2 pargs= (1, 2, 3, 4)
5 r% k4 F3 f( a# L4 dkwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}( J$ S7 d3 B0 b9 R# s; O, P
使用 *args
) _, J& V# V( e8 S* m9 H: O0 o H* h* L% ~
>>> def fun(name, *args):/ v; M) X& Q& j
... print('你好:', name)$ {' d6 R: ^! x2 ^$ z+ h
... for i in args:
" j( W& R8 V+ ^; _* i... print("你的宠物有:", i), S2 ?: C4 S3 G1 r6 [/ J
...
$ C( t6 J- I, W9 X>>> fun("Geek", "dog", "cat")
2 y% n4 O& D! t$ \! s* [* G你好: Geek
' s: q( i% _4 g3 t1 ?你的宠物有: dog
6 b$ R1 [3 {8 w8 ~3 x你的宠物有: cat
) l! A7 U8 P/ y2 J9 S5 ?# V使用 **kwargs4 z) N3 O+ p7 N/ R" e3 @2 x
* X* D' S6 e; l Y" |# q2 J>>> def fun(**kwargs):( A4 }$ Z, o* ^4 Y
... for key, value in kwargs.items():+ `9 \9 ~0 ~( t. }1 t+ h2 O. S6 H9 I
... print("{0} 喜欢 {1}".format(key, value))
/ p0 Y8 ` f( K# w7 ]* a... 8 O4 a) F: u& x4 x3 P; ]
>>> fun(Geek="cat", cat="box")
3 X; |+ b2 @& c3 h: u; @! m% GGeek 喜欢 cat
0 ` y+ w8 D" U, E$ C" Icat 喜欢 box& _ Z) k1 N( O6 L
3. 函数实参/ n8 T# j T' ]8 a% A
' R T$ x$ t- L3 z" h U0 s% C
如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:/ U3 c8 x Y( d0 B7 }
! W$ t7 O- D) K" `8 z>>> def fun(data1, data2, data3):
; M5 z v3 |7 y9 } l% f& i... print("data1: ", data1)6 x( x. q8 i, X/ S7 `
... print("data2: ", data2)$ E! O1 }0 ?8 a- A3 V
... print("data3: ", data3)
# g: z/ O& `$ W. h" B; u* @... 7 k, [, O, C# y0 ]# I9 S+ r% T
>>> args = ("one", 2, 3)
O. @& ?7 u# _' ?5 ?+ W6 f& p>>> fun(*args)1 |$ K" w, W0 s/ y3 y
data1: one) h; `2 p( p) P+ E
data2: 2# j" |; _5 r5 [: W8 A' T: m3 p
data3: 3
3 {3 z. a- V2 p, e- t( x4 W>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}, d" v: Y: q9 R! j
>>> fun(**kwargs)$ R, O$ ^2 a0 l5 U9 ~0 A' p
data1: 3% x5 c, \5 I5 c4 u8 g- v" G
data2: 2
& R' `3 n8 e# X1 adata3: one# F0 w5 l5 D( t _
4. 序列解包
5 e: W; `# O4 J( t; P' ]) Y0 X: E
" R7 G8 d* @- I# N) i$ K序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。3 H+ X( C1 A$ {6 Y( I2 g
3 B2 F7 l& r- v" G>>> a, b, *c = 0, 1, 2, 3 # T8 n9 V* ]! t8 h3 k
>>> a
2 M& q* P( E* Y* L0
6 @) y7 c8 k" y6 M. c>>> b
! x) j; Q2 w) f6 I. N2 \( |! g1
0 k: ]9 L" y6 K; }' n7 d' F>>> c
7 U7 `% B& [& k( R' ~, g[2,3] ~) h6 D; X4 K* f
|
zan
|