- 在线时间
- 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 中,* 和 ** 具有语法多义性,具体来说是有四类用法。
' P* R! \, r3 j8 \( F( v& F* V% F, e4 K1 S2 x3 ~5 _
1. 算数运算
( E5 Z& h, c$ l# L* K2 b% V# f
( S# d8 [5 D; S+ s* 代表乘法
# ]7 D$ W' I1 ^
7 W5 u0 ^* J( D** 代表乘方
7 \, R- p9 _ Q* v$ T& b8 v6 M3 w* ~. G0 {, J" {: o
>>> 2 * 54 \) w# D! K' i4 m0 Q5 ?8 ^+ F
101 k& _) @! [8 ]1 N* m4 }4 m
>>> 2 ** 5& c: t. E3 e$ i: }# v% Z( S3 ^
326 f7 v( u/ }2 W# ?8 K
2. 函数形参$ P. P) d8 i6 t: {! P* s
9 b" Z [8 U8 [
*args 和 **kwargs 主要用于函数定义。8 a- N7 t. R/ R" k, B- ?
, l9 h& X% O( H# n: ^ Y# E
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。
/ @% r4 T. ?" |. {; U: s( {1 D0 I# ^' v O8 q) I
python函数传递参数的方式有两种:
' a1 E5 s* W2 U7 `; c2 c/ T q; z6 Y5 ]# G
位置参数(positional argument)5 u6 [+ H- j. X5 I4 t2 j
关键词参数(keyword argument)9 U! E! s/ v# D9 z( C
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:, v! R/ d: |1 P2 b7 a
- j2 D/ E$ r/ S1 J( T*args 表示任何多个无名参数,它本质是一个 tuple3 B& ] A1 u7 A' [ H: k3 g- V
**kwargs 表示关键字参数,它本质上是一个 dict4 k: }; y+ F- x7 }
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。+ }) D- }, j& S( P; {
; w+ q9 i$ w, c5 l( ?- F1 V>>> def fun(*args, **kwargs):
9 L, T% ]8 J4 X... print('args=', args)
" P1 e) x5 x1 t% ]! x7 k' F3 P a7 \... print('kwargs=', kwargs)8 I H: `& M' m+ K
... ' X2 `" S) Q( J+ o8 x% n+ V) T
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')- E' }4 s; R5 u9 Q- d2 m4 } M$ D
args= (1, 2, 3, 4)
# t4 h( {4 d/ C% M% x% K; C0 P8 Rkwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}3 F& }3 W% V6 n
使用 *args
+ c1 {1 k4 A* w5 K, h
2 y7 ]1 c: F% p>>> def fun(name, *args):. h: l$ @, F/ D. a
... print('你好:', name)
: F4 Q: Y5 A$ S* q6 E5 L... for i in args:
4 G6 s0 c7 H; {1 r& A4 ^+ t... print("你的宠物有:", i)
; ?# u$ I4 o5 }1 ~/ O0 B: k...
0 v& E0 }8 n3 `, V, Q>>> fun("Geek", "dog", "cat")2 h* J1 _1 Q. s! {
你好: Geek
7 X$ W" Y2 [" u7 A你的宠物有: dog
+ J, o/ _7 x0 D, n+ l- K1 d$ X9 F+ c你的宠物有: cat/ s" _$ ]+ y/ u8 y: v+ D7 r
使用 **kwargs
! P# X2 p% Z* a
0 f/ K& \1 F G a>>> def fun(**kwargs):# V' O3 \3 g4 [( u
... for key, value in kwargs.items():
4 D3 _$ K. @' p& G9 I! [: k... print("{0} 喜欢 {1}".format(key, value))5 W6 X& ?/ d4 ~$ X
...
# G( V9 b. e' i>>> fun(Geek="cat", cat="box")
+ k$ h6 v ~: s, SGeek 喜欢 cat) m" h [0 m% S: S+ \: x
cat 喜欢 box: r/ Q5 E1 q0 R
3. 函数实参
d& x% i! y2 b$ _1 b3 w
$ w6 C! {2 p- E; h' a; k: k5 i如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:
. n0 [$ w* }- ]$ A9 L% a& M; D+ n9 ~: s9 G
>>> def fun(data1, data2, data3):
; }# v" y/ A+ `+ W... print("data1: ", data1)
3 G4 M. N9 a- @6 h9 k) K... print("data2: ", data2)
# l" D+ o* r6 o, G. h... print("data3: ", data3)+ W6 D! e1 A6 f! R" _
...
: G7 V8 Q, z' G>>> args = ("one", 2, 3)
( [ j& U9 U5 s' m2 V7 H>>> fun(*args)
% }0 |, |: n2 W( v' N( I) adata1: one
+ O. {0 r9 s% ]: ~+ l5 L/ mdata2: 2
9 `9 f) A7 b s" vdata3: 3- M: x5 e4 A, n+ c4 f
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}( z* ~1 C1 B+ A' l4 U
>>> fun(**kwargs)
2 L9 }8 d& _' Y6 udata1: 39 N3 v) F4 i* [; M
data2: 2; \/ U/ |( _* b
data3: one
8 |0 w# c- w3 g4. 序列解包
; A# p: ^5 d- A/ l$ r
+ G6 o4 ]7 B* W! v3 a序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
$ B$ m3 J* w6 H$ t' W7 ?/ v- y2 H9 O- R( d8 N; }' w- t! J
>>> a, b, *c = 0, 1, 2, 3
0 w' Z2 I6 j& I( W( |9 Q. [* u>>> a 6 _( R& c: q+ w. U3 U
0 ( a9 {& B* V% y% }0 Y( A+ q( ]$ j, j
>>> b
& y; S- {; C6 K& W8 i# R1 8 ~: i1 D/ U6 c2 V
>>> c
w: ^0 n8 ]" t8 Z U3 g1 ^2 Y[2,3]2 {% L3 y( `. s* q& j0 [ {
|
zan
|