- 在线时间
- 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 中,* 和 ** 具有语法多义性,具体来说是有四类用法。
0 \! G3 I |7 T+ B2 e
+ B F) s' A7 E& S0 J1. 算数运算
3 w3 ~. G2 J! G& M% i$ C) [3 e$ i" ^ \& W
* 代表乘法( [0 ~- [( v: _5 M! G+ r
# B$ E% `! i! S d0 G9 O: K
** 代表乘方2 v0 ]9 i2 J7 V2 i
0 M$ z0 ~5 Q9 V/ z8 I. b" A2 V% }
>>> 2 * 5
8 ?6 D# n5 ]6 ]10
" u+ F# j% }% [$ p! `>>> 2 ** 59 h( _- @+ g! J0 M1 U+ o
327 c+ {8 z1 l$ M# A9 q8 U# p
2. 函数形参
# B! r+ x/ f, _8 U+ z9 E5 b
0 Q3 H% G6 J3 G- y3 ^ k* C*args 和 **kwargs 主要用于函数定义。/ J. R2 \7 Q2 G! W/ l
4 p; L7 \& m- O4 o) }* t
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。% Z+ v; p6 @0 A1 ^
3 x! s! l, b: R; r; J
python函数传递参数的方式有两种:( J$ o' @4 M, _! P" x) K, r
) I5 M. @' h/ C5 D" C3 V
位置参数(positional argument)( [2 q u) e) I9 h+ ^6 o
关键词参数(keyword argument)
: }& g' w$ H7 T( P5 w*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
. Q9 T6 F2 m# @$ a( ], C1 L
2 N2 d' D2 u" Q% G ]2 ?" }) j3 W*args 表示任何多个无名参数,它本质是一个 tuple
: f0 M1 ]2 Y2 t7 M**kwargs 表示关键字参数,它本质上是一个 dict1 z5 H. W, h( k }" T
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。- C: @ W! Y' Z# o2 d1 c w* \
$ f/ E4 Z9 b1 S7 P
>>> def fun(*args, **kwargs):$ d" _+ R" u2 s" s' i. {
... print('args=', args)( M8 o( @- Z+ _6 g! G5 ~" ?" t
... print('kwargs=', kwargs)
; a) B' a& Z2 }( g2 r/ u0 z V... - k2 Q/ {& k B: h* R! a( c! S% W
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')/ g; c- L* ~% i6 p8 r5 c* G
args= (1, 2, 3, 4)
3 a7 C' ?2 ]# B0 o6 Akwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}5 C. `. T* V: }, l9 n3 H
使用 *args
8 ]6 R2 D- e5 z' v" f7 D. A/ s1 c g7 y' B2 o
>>> def fun(name, *args):9 M4 }$ K5 u9 u! ~3 U
... print('你好:', name)
: O! a9 o; G) x& @ H; r+ Y... for i in args:1 s" `1 {8 h+ ?. X( B( U
... print("你的宠物有:", i)
& z5 `* O/ A2 m, z...
# v+ G( a8 w5 p c1 `! ~* E$ l>>> fun("Geek", "dog", "cat")
( d: V1 v* A+ |5 {你好: Geek. Z" C5 s. N! }! {" |3 X
你的宠物有: dog2 S7 D$ z5 w' h# s
你的宠物有: cat
9 u# o: u) k2 A% j, _4 S使用 **kwargs
( }/ R, v: W5 I6 W3 i( a) h1 O9 u4 y# G. l2 r$ l" i/ G5 @
>>> def fun(**kwargs):% v, v1 ?/ T6 h6 j$ C
... for key, value in kwargs.items():
: B$ ?$ ]: A7 |4 r2 f b. N... print("{0} 喜欢 {1}".format(key, value))) ]. F, P1 n5 C2 I# W9 r
... : O" `) k7 s* E. t$ R
>>> fun(Geek="cat", cat="box")9 o8 |5 `9 Q* ~- W1 n
Geek 喜欢 cat! e) ^7 B6 l/ L! q6 i4 C* ~) n
cat 喜欢 box
% C" e* W _) O: y3. 函数实参1 w8 V: W' K1 c. u
( y: v; V; ], D7 T如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:( W5 A. k& z" T$ {1 m* Y0 e( p
, R+ j8 X- E8 S1 Y# I" {>>> def fun(data1, data2, data3):
9 j8 y1 f$ Q& |4 q9 B+ Z... print("data1: ", data1)& O3 k1 [. O6 B5 X& [6 V/ }
... print("data2: ", data2). ?- W: q# U. T7 n" z8 Z! ^
... print("data3: ", data3)9 z$ P/ g5 a Q
...
: W" a7 S: R1 x) M$ w! J! @3 Y1 Q8 h>>> args = ("one", 2, 3)
. | \: }7 t1 t0 A5 X2 C! n) Q>>> fun(*args)' j( x+ ~* j! [9 s1 ^, m; Q
data1: one
; I6 H0 O( ?; Z4 B6 Bdata2: 2( v$ ]& C" f2 H( @* {5 d( ?: z
data3: 3
; N" a0 {( r" D" {>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}8 F! b# b( E. F
>>> fun(**kwargs)
8 W$ z7 d' N4 N% _: m! adata1: 3
% [2 z0 f( x. y+ m/ F Qdata2: 2
( E9 g( T6 E: ^* d, v% h0 v4 _data3: one6 O; r7 c, i: z8 K' I4 u. N, }9 j
4. 序列解包
: m: g2 u* }: N h" [2 v# u5 ?+ }7 W% `
序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
5 z8 w) U0 @) o4 [' F
, A* f% q8 N7 ?0 f>>> a, b, *c = 0, 1, 2, 3
) ?# ^% S, l. f: [1 K) I, _8 v>>> a
, W1 q# M$ B0 o2 p0 r9 L0
' p) H" O2 |# [>>> b
! p- u2 D5 D6 m& s+ }* w1
" G! d7 \( w7 \4 K4 Z>>> c 6 V5 b5 g7 E7 k" b; Z. Q: {
[2,3]
/ \2 v- c4 C5 y. [1 y0 H# k5 M |
zan
|