- 在线时间
- 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 中,* 和 ** 具有语法多义性,具体来说是有四类用法。
- S7 T2 [2 q( O* n5 b
! `+ ?9 D9 i( x. d7 z' u1. 算数运算0 e8 L: I' S/ q) m# `4 o# ], d
7 j( ?5 d3 s6 }! ~, m3 N+ M* 代表乘法: Q$ d) A& A' k7 k/ B& j
9 e9 q- y9 t; o' L) `4 r& ^** 代表乘方: x* w2 V* R8 H0 C0 `# c
! K0 l6 t4 |# W1 M+ R* N0 z! z2 K>>> 2 * 5
2 F: y5 r3 K1 a$ F: P0 C$ {! }* w: V9 J: @10
% f' _, F% W8 [0 d>>> 2 ** 5
- p6 h/ n2 G2 N0 U/ `8 E6 b3 s8 `32
! T7 D6 R9 d# v! d- f% u: }2. 函数形参3 h7 C. ~! Y6 w5 B! N5 p2 q, i
& \; s* j) {+ w, {: H' I
*args 和 **kwargs 主要用于函数定义。
0 t& K. t# a8 m5 H8 K4 Q2 A! s+ W4 v
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。
& y. d% r, \$ X- t8 u3 J
* O( C, W# \0 ~1 e) Ppython函数传递参数的方式有两种:+ ~+ g9 I9 s5 j5 y: ~, d% n
, j b- n9 F! z* j2 O$ e) ~位置参数(positional argument)
% _/ B8 O% C0 i关键词参数(keyword argument)# `8 b. C- ` ?# N, l
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:+ e U0 z9 A' k) s" b8 R7 L
% y8 [6 P7 V- _' ~" U- }
*args 表示任何多个无名参数,它本质是一个 tuple
1 ]/ C' M3 G6 n8 U2 ]**kwargs 表示关键字参数,它本质上是一个 dict
" P) M5 E) P$ @2 j1 ?! ?如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。" J$ j a* w4 k$ | O! v& J# A. P& |
) [3 [+ B W2 A) u3 ]& r% N
>>> def fun(*args, **kwargs):
1 H R0 ^6 I: A3 _" {% _2 R... print('args=', args)
3 {8 e3 Z, x# `. q T... print('kwargs=', kwargs)9 a: a6 x+ H) E- M: X6 ~
... - a/ Z r8 I% ?6 w. k- m, Y
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
' b8 I" d) g% }args= (1, 2, 3, 4)+ [/ N4 d6 m. Y3 V" ?
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}
& T7 c0 b/ Y% R3 c6 @2 f使用 *args
. ]: k5 {7 s$ z F" P* w4 _( u
2 G0 b. `/ I6 w5 } E( ~! {6 X" _>>> def fun(name, *args):" `$ C' {3 L, e
... print('你好:', name)
" K4 V; I) A$ c* f) \... for i in args:2 X/ `8 t% F: K+ K6 C* T
... print("你的宠物有:", i)
$ R/ Y& w4 J; {( k! L" h...
/ ^" S( g* p* M>>> fun("Geek", "dog", "cat"); j, U2 w2 S0 H. H
你好: Geek. d; [. l/ `5 b6 ^6 d; k
你的宠物有: dog3 K4 Z; O& X( K& j" `) N# q' V
你的宠物有: cat+ j' z. @) G( ?9 Q7 }1 O
使用 **kwargs
' ?1 A+ n. ^( `2 ]6 a: |7 ]5 e2 u8 M- e& J" t5 f& c
>>> def fun(**kwargs):% O8 C1 t6 L9 I4 _
... for key, value in kwargs.items():- g$ N7 O& w0 J( W. z9 @
... print("{0} 喜欢 {1}".format(key, value))) z( G4 Y) H9 |' p' j! \
... * R6 ~1 u+ I; g
>>> fun(Geek="cat", cat="box")0 N4 B# ~" m$ ?" w6 P! ]6 k2 ]! ]6 Y
Geek 喜欢 cat5 A1 z+ D, G- s, [6 m- l
cat 喜欢 box- ?" J+ |, v& t" S
3. 函数实参+ k/ [% p) {8 j, g, ]0 |; r0 K
0 r" Q2 w7 ?6 H2 Z
如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:. B$ Y9 A e/ n
5 R5 z R9 g8 }& r* b! D7 V>>> def fun(data1, data2, data3):
' ~8 F6 `. }4 e- b... print("data1: ", data1)
/ Q, U/ u8 G) o- X' F0 D... print("data2: ", data2)
6 Q: s9 [8 V0 H0 U* Z2 A... print("data3: ", data3)
9 Q' s) m" [& E# b6 {, K... 6 h+ F4 w9 G: w2 {7 d+ F' j1 x0 U0 j
>>> args = ("one", 2, 3)
) G* i: x9 q9 A5 x; `8 M8 \% j>>> fun(*args)3 s4 v7 z. W* b
data1: one
+ x; f8 @0 M5 s: }8 _. M ^data2: 2
2 ^$ O( J8 Q9 l' g wdata3: 3
: Y) N& |7 @) x* c$ ] B>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}( H2 K9 D; U3 K8 q
>>> fun(**kwargs)
' m& ] a6 W5 v5 ^+ `# X2 S+ zdata1: 3
. E3 d. l/ a0 i+ \( G3 gdata2: 2$ V: t2 n3 b7 N. }, {$ ?8 d
data3: one& G7 v& u5 T3 a: Y; h; [
4. 序列解包$ J' f3 m8 ~2 i, B- J
- y$ S# E t r* C5 l& f) D
序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
7 K& Z3 ^7 N& }0 X/ u
# _+ r- A, z7 Z' f: W>>> a, b, *c = 0, 1, 2, 3
" \3 a5 E4 s4 ^4 g" G>>> a
7 R! i6 a$ T' b2 N0 q0 % |/ L4 \ ^$ T; j8 W: s; u
>>> b 4 o r* t3 v& H* j& n4 q# A
1 1 L$ \; v8 V5 k! ^) m( ^
>>> c ~8 O0 h9 [% C, f1 Z) G; n
[2,3]- X% [2 h3 T1 p- ~1 R# f
|
zan
|