- 在线时间
- 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 中,* 和 ** 具有语法多义性,具体来说是有四类用法。& E2 g4 ?7 N2 R3 t; u
5 J* U! {0 K% o% H+ X1 r4 V0 K1. 算数运算" t) @2 J4 D7 S2 |/ d5 n
8 j5 n+ N! d$ o2 e
* 代表乘法3 o* P3 b& Z% ~# G" n& _/ x' C* w
5 O2 j+ L& k8 p$ Z$ _0 R4 F+ [, [** 代表乘方
, V- e/ R1 R8 \- N
+ t" L4 ~" `* ^>>> 2 * 5
6 w9 Z" e: M R% |+ r" w10' k1 E T9 \8 f. o7 x4 X' z! D
>>> 2 ** 5; j! x5 a* v% C! P- M# R: _
32# b& f+ k/ B w8 [& e
2. 函数形参2 U& t* j7 {+ r: ]
' M& c' Q. |' B% }6 ?* g- [
*args 和 **kwargs 主要用于函数定义。
; }1 s5 H0 N, C* m, z
. L5 K; y2 Y4 M K, y; H- x你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。9 R9 q1 P- }/ v, L" k7 ^ M. {
1 W( B$ o( m9 A) D u Z5 O( |; m0 ]python函数传递参数的方式有两种:
" Y9 _6 T! ]3 z T5 O! h- s! K6 N4 d" m1 b0 y
位置参数(positional argument)
" h; L# L3 A# p7 g, y关键词参数(keyword argument)4 ^0 D7 y3 q7 H+ |" b
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:* v7 v# `5 M0 H! ~! z- V
/ p5 B, o0 u" J/ `" w- E: O3 m*args 表示任何多个无名参数,它本质是一个 tuple
7 q* [+ O) ?4 v% w3 L& R**kwargs 表示关键字参数,它本质上是一个 dict
+ i. c5 C/ g7 i: A6 N如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。* ?2 z* E9 B4 x7 P: N
`5 H' n- Z" y( H; W6 ^>>> def fun(*args, **kwargs):4 g9 |7 W4 O* k5 {$ P
... print('args=', args)
- ^9 _ t# H& ` A( `! |... print('kwargs=', kwargs)
1 {+ V0 i' d( U$ O- [... . o$ S7 O- X. Y5 K0 l
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')* \! t) n# P* p& l" n. V8 j
args= (1, 2, 3, 4)$ j7 K0 {8 Z1 M4 W
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}( g( w L3 n& r( d0 I }
使用 *args
0 z) q* [, G/ ]& U. r9 ^4 q' B; C* M
>>> def fun(name, *args):7 S1 Q5 L% k) ^) A1 U. M
... print('你好:', name)
: R! p N4 r% c$ G+ H' l... for i in args:: `' X( \ X# Y7 ?
... print("你的宠物有:", i)$ j7 }, p3 ?3 V2 g' f) @
... + C3 z% ^3 ^1 H, q3 F* u- u
>>> fun("Geek", "dog", "cat")
& S2 f: S* k! i你好: Geek$ Q, T2 z: [: c3 u7 ~7 \" t: j
你的宠物有: dog
- R4 k' I) ^+ n# J. J% a' f0 r你的宠物有: cat6 T( [ y) E7 [8 X5 R' s& x
使用 **kwargs( J4 _+ X' O" j+ I5 e5 c8 O
# A" U' {2 }# @! Y# J6 O. M- l4 s. P>>> def fun(**kwargs):
& P+ C% c) b4 R' A... for key, value in kwargs.items():
6 V) w6 p& u$ R; D9 S- r' i. d8 k) s... print("{0} 喜欢 {1}".format(key, value))
6 i4 Q' f" r7 @% r+ R...
$ B3 R$ u$ ^- I2 v% |% R7 ~>>> fun(Geek="cat", cat="box")) L/ j: L! E# i- Z: J5 T
Geek 喜欢 cat
' |" T2 P6 e, m b( {cat 喜欢 box* Q3 Q6 t- ^* c! _# }
3. 函数实参
& a( i- x# W$ s4 J! S; T
; `" _4 w9 I! b如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:3 y7 x+ {; o, a2 @4 m% E1 r. r
7 |, n( _8 e5 }
>>> def fun(data1, data2, data3):
) i$ O$ b& Z6 u8 f6 [... print("data1: ", data1)- z' ^" V; T1 t* {, E& e, V
... print("data2: ", data2)1 \' K+ D! X# b: W" m
... print("data3: ", data3)
2 M4 a) g- a0 y/ m; ~) [& i6 V... 7 N9 }; o" [, ~/ W- B, }
>>> args = ("one", 2, 3)4 a0 n6 Y7 F9 y* x
>>> fun(*args)
7 ^( |) @8 }1 Q$ T8 Adata1: one" e- V3 j' e6 ` }( E2 c
data2: 2( H7 I Y% a0 c0 p. k s' [
data3: 37 s/ O& I- }0 H% l, U6 `, X( o! a
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}5 m8 x. l2 @" h$ r& |) z1 w
>>> fun(**kwargs)
! f% e8 q' S/ Ldata1: 3
# O# x1 W' o5 g! w/ q. qdata2: 2, L x4 l$ N) |* y# _8 e( c
data3: one5 _$ y- _3 v# |
4. 序列解包
% m2 B) ~. Z- |# P) Y( s
( `7 R5 ]1 x* O! i序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
7 |; C H% I( ~. J e0 F( n! w3 p7 ?1 x9 a+ S* \" p# P& a
>>> a, b, *c = 0, 1, 2, 3
6 H% d7 ~0 E0 g$ C6 R$ @: J>>> a $ u/ ]% h5 E# G) x: F' j* a" o, S9 ?
0 # {2 L: d# p9 [
>>> b
# \& D. b i/ r0 _6 }1
) u4 [2 k% I" U3 \ E$ w: D3 h! M>>> c
1 ?: U/ J- _; c" ~[2,3]6 m7 F( @2 q+ L7 W$ R
|
zan
|