- 在线时间
- 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 中,* 和 ** 具有语法多义性,具体来说是有四类用法。" z, |" N, L# X% ?9 D7 D
/ }! `8 `6 |$ s2 @, K% N" T+ Z
1. 算数运算
! t* e! d* ?, ~- B/ U3 _8 P3 I; V* G. F$ f2 d' E; b7 J2 j3 B
* 代表乘法
/ l( i2 Z8 r# x% f; n) k; z2 g R1 P3 h: ?# U+ b. v
** 代表乘方
: R# a+ X0 m1 c, P% b6 ]7 w" x7 b: N& l/ R" \/ ?; ^! B! I
>>> 2 * 5
" ?" {& D. T* i3 X. I# x- s9 b7 b4 _102 M8 l3 _. Q: R
>>> 2 ** 51 ]+ r1 I. ?7 S# V9 b- I9 r; @
328 ?$ K9 t7 d& r1 ?
2. 函数形参
% ^0 \) ?* ?, J& R
* d; V% T: |+ C5 ^*args 和 **kwargs 主要用于函数定义。2 ^ o% `' ^# n {2 }
0 I' I& O# N% ]) o1 b* D+ N
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。
* g3 B4 X) ^: F
0 k2 m8 C) ?2 D# x6 O# Qpython函数传递参数的方式有两种:
% @0 ^! A' `3 l0 D% }8 o) U4 M0 J& d4 {- G' B) |
位置参数(positional argument)4 g( J0 r1 E1 }3 c
关键词参数(keyword argument), l; s5 n! I \$ ]2 ?; i
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:( e; i0 q# M7 g" A. ?
# c! e# v/ ~6 V9 H*args 表示任何多个无名参数,它本质是一个 tuple% B0 l0 A/ K j$ y: |3 T- ?+ E
**kwargs 表示关键字参数,它本质上是一个 dict9 I0 e2 U! D. j; N5 \6 N; c
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。" K8 t7 S5 x# \1 \& Q5 ~
* J, o& h+ j5 C" S8 v- ?6 A; i% Q>>> def fun(*args, **kwargs):5 j! A' p& [3 f7 v; y- j& Y
... print('args=', args)' F& j3 ^/ q+ u( a8 B
... print('kwargs=', kwargs)- \/ l4 C* S! r7 h. n4 j
...
# D. i/ k, ~& W>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
) _2 Q& a7 M8 P2 ]* Bargs= (1, 2, 3, 4)3 z! A! y) m# M; O) l. m4 N
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}
# ~- K; W: x* Z- X! B! m使用 *args
" d o5 \7 L$ `2 X
; j, X: g+ a7 a>>> def fun(name, *args):$ P5 k- v- H' Z- F! u! Y" |
... print('你好:', name)
$ x7 I# K8 ?1 Y) D1 W' m... for i in args:! L, O" V1 K, a
... print("你的宠物有:", i)
4 m' p( c/ w* k. }1 t! k...
8 q( ` F& _7 B) B5 z* [>>> fun("Geek", "dog", "cat")
" m6 q$ A: s i& l- d0 w/ D& E你好: Geek `6 J$ M9 ~ F7 c1 K
你的宠物有: dog
$ \+ i# a, E* W; `- q5 n你的宠物有: cat$ g/ u% r3 |; ^3 j/ Q5 ?; g* z7 B
使用 **kwargs
' K8 @" d2 f* X0 A4 k8 d4 {9 J' ^
. G5 N; V+ o E8 V>>> def fun(**kwargs):( c; \" i7 I5 b3 H/ B# T
... for key, value in kwargs.items():4 W- n0 y! \; v# ]: o
... print("{0} 喜欢 {1}".format(key, value)), v7 P8 _0 e$ \4 c4 g# B
... : [) T/ o: i6 O( U4 r
>>> fun(Geek="cat", cat="box")
9 z+ \# s4 c0 Z- }; t- M8 jGeek 喜欢 cat
- J7 w6 \) s) Q, Y/ lcat 喜欢 box
, D1 O; D+ y- l3. 函数实参
7 x" Y& G1 y, C6 P( k& p$ {% f4 t
2 h& G, M3 G$ v, Y) U# P9 K6 j x! ]如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:
V Z, o7 a7 i& I; v0 b4 f$ [4 R: s( p, d) O8 {4 x y
>>> def fun(data1, data2, data3):
& O( K$ Q1 l- v0 t1 d, t... print("data1: ", data1)
9 d( W% y( x& c... print("data2: ", data2)
+ f% R5 M1 d* S. O0 a... print("data3: ", data3)6 D1 K& P, ?( B9 D
... 0 T8 H! d6 X' N) c W
>>> args = ("one", 2, 3)7 _( J8 S$ X4 \5 f' a2 y/ v8 T( q$ G
>>> fun(*args)
) q) a$ g6 B3 l3 Q6 Cdata1: one, e" O6 a5 u6 s: f; A0 K
data2: 24 Z" \6 r+ A2 W# R& a
data3: 3, Q1 M0 }7 w+ y2 q" g$ O5 R8 M! Y
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}
" m) z; T' z4 U6 |, ?. [$ ]>>> fun(**kwargs)# V8 }3 N! X7 }: j) G& T. S! ]
data1: 3; h3 }! L% _- G/ w* T3 D3 R
data2: 2) I7 g+ U; [; p
data3: one4 W) d7 @+ @7 j' w8 D, a
4. 序列解包3 s' o4 O5 a4 a" j) W& y
' `2 _, m ]% L
序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。5 k% n2 v% h: D+ g4 B+ b; O
0 E, E$ g* w6 q
>>> a, b, *c = 0, 1, 2, 3 ) C0 F, D0 p6 m6 \
>>> a + K+ u! l b; J7 H1 r6 j' Q2 ~2 E/ Y
0 7 P/ N5 r" f. E, [
>>> b 7 w$ g' R& K, `; ~6 j" M
1
7 l+ k0 B$ `+ a+ [# a9 H" e>>> c 3 W* q( Q7 s: S& x
[2,3] h& c: c4 R+ _$ |3 b4 X
|
zan
|