- 在线时间
- 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 中,* 和 ** 具有语法多义性,具体来说是有四类用法。8 D' l* P& {& t
) t8 Z6 O0 }0 B4 X; M1. 算数运算
: `0 r! `" S/ d7 b9 h! o9 \/ b) ^/ v8 W2 J; C) R3 K, W
* 代表乘法4 M6 m: g/ m7 S4 f9 ]2 f* ]
# g6 t- Y+ l) M2 K
** 代表乘方
. T0 P: q! F7 e. ~0 ?1 k
p: L# ?1 B& y4 X" a8 q$ ^>>> 2 * 5! F; s$ R5 M" u/ I4 N
10
* V n( k* m i* A i, d>>> 2 ** 5; d' Z0 Z4 k( U5 Q1 S- U; U
32; r( E; |& U) P z5 E- ^( g% U) b
2. 函数形参
2 u& M% C$ v! f9 w
a) G# }% E) w S+ s: g5 S*args 和 **kwargs 主要用于函数定义。
" e: Y; V Z$ N T: B( O
1 B- J" l" u$ Q" y你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。
/ m I; a, a4 h2 @% U6 C0 t& X
) s \/ g/ p3 N1 apython函数传递参数的方式有两种:
[* v0 F) k9 l3 I' n* m+ N: Y- a
位置参数(positional argument)/ |5 Z; A' e- h7 E4 M
关键词参数(keyword argument)$ N; I0 \ _" ^% ^! |% W0 @ b
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
" ~; C4 L" S b6 P% ]5 i, m4 Y+ F2 Q% {- O+ ` {- X
*args 表示任何多个无名参数,它本质是一个 tuple) W, r% L0 x- l$ E$ i/ n9 G
**kwargs 表示关键字参数,它本质上是一个 dict
# \5 [0 W. i! H; w! _) b7 Q如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。
& y1 y b- k3 P9 N% L {! D9 S9 s% G+ J7 m8 n8 c, e6 Z
>>> def fun(*args, **kwargs):3 q$ X) v1 M$ d$ ^ g
... print('args=', args)3 l5 u# q# V0 ^2 w
... print('kwargs=', kwargs)
* W' T: l0 b. i- L...
. N6 K$ H2 S. q, w>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
# {# o# X( f; B! y% Y' U0 E) xargs= (1, 2, 3, 4)
7 M. f* }) n' ~# jkwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}8 j8 a9 c+ H, l" [& i
使用 *args
" m1 p* ~) x; S$ I' B8 o
1 E9 ^7 L" }* J: Y/ ~>>> def fun(name, *args):
, |* g s3 P, i: j... print('你好:', name)6 M) A9 J7 Q& Y3 `: F; X3 A# a0 c
... for i in args:) G- a% h& g0 Y* R+ @
... print("你的宠物有:", i)
, f" r% b$ F6 z( ]% k' b) w... , H. m% v+ B' A
>>> fun("Geek", "dog", "cat")
) F8 l5 @- L. I% J+ U+ W/ H0 \你好: Geek7 ^. f8 W6 f% Y0 h7 o% t8 z; i5 O
你的宠物有: dog
7 q0 i1 B& j' X8 b1 O* ^( `你的宠物有: cat
3 D6 @# j7 V+ m8 `使用 **kwargs* y) J! ]7 {, `+ g0 F9 z
6 M3 A7 }: f- v8 z8 |
>>> def fun(**kwargs):0 |3 T; W7 q2 [2 I
... for key, value in kwargs.items():; \8 p' c) O: K& C( q
... print("{0} 喜欢 {1}".format(key, value))3 K+ Q5 ?6 j% O2 ]* Z
...
* v" h B# _+ \ u) ]>>> fun(Geek="cat", cat="box")+ L& {- I' S9 a9 B4 H) J
Geek 喜欢 cat& x7 {$ _$ x6 {6 S. v) p
cat 喜欢 box
% V* T; a3 w) ]9 h7 Q- n3. 函数实参
$ f$ h5 r( o7 x u9 a! R
. ?# a% i& y6 [如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:
3 |0 _" I2 r7 B8 I1 U& B
2 r8 k; u# l* L# s* [>>> def fun(data1, data2, data3):
1 b/ H {# Z/ \1 f) Y1 P/ J' ^4 F... print("data1: ", data1)
* S7 J0 h1 f5 z... print("data2: ", data2)
, D& S0 X/ H3 ]... print("data3: ", data3)
: S. l2 o/ e- G$ ^. }1 l$ J...
" r( G' h" N( s4 q>>> args = ("one", 2, 3)
" _$ f5 {9 o/ B" z>>> fun(*args)! b5 e5 M4 B7 } G7 d F2 |4 ^
data1: one$ k$ d; a/ m% v% N: q& y: G% e
data2: 22 g* O) Z/ t0 ^6 }9 _
data3: 3" y) v" O/ G8 m# z8 X3 P
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}% h8 o0 C9 k' J8 _ m- |1 Y" q9 x
>>> fun(**kwargs)$ _, ~; d. y6 z
data1: 3& P5 W) x' R6 I4 G
data2: 24 D! G" N3 L$ C
data3: one: d6 s7 t3 F8 ^
4. 序列解包
7 g6 j5 E/ x6 ?: Q8 h* p( ^" p: Y# [$ ]' o' @ s" B) N3 d
序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
7 `# A$ j( D' {6 i
* h3 w3 P9 h& p2 R5 J/ {+ V" c>>> a, b, *c = 0, 1, 2, 3 6 i4 ~2 t9 I+ p! ^; k. i5 p# z& o0 ~
>>> a 3 t: }, p2 n) _. _0 T' w
0 ) N: U$ O$ Y$ j7 j7 P
>>> b
5 M0 Y5 W* g; H; ?; |& B6 {; Z1 - h! ~) h; I; R
>>> c 2 o4 N. r* _- C" c' i
[2,3]
' }0 d7 F/ S/ u6 l |
zan
|