- 在线时间
- 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 中,* 和 ** 具有语法多义性,具体来说是有四类用法。# u3 e2 U3 k4 O0 A& P- l
4 D+ G1 A1 I# S1. 算数运算
4 ~' a; t- k# ?9 t: |% J4 v/ }, s2 _; |8 E8 y& I
* 代表乘法% K T) _# F6 x% B" G
, }6 L7 M( ]! n3 e+ S
** 代表乘方
% w% M7 s: n) z9 G) L- \7 J
2 w+ U0 |" ~' X* D7 K e; V2 B+ C>>> 2 * 5
# g3 b6 P. ~+ b9 m e9 n' u10- l$ G/ K) i: Q4 y5 N) {
>>> 2 ** 5
- V w& G( E7 x5 T324 o9 n7 ^1 e/ W( _, A3 K' U9 Q
2. 函数形参: b* J" l6 ]# L c
# H' g& W( R2 q
*args 和 **kwargs 主要用于函数定义。
2 {: ~7 U$ x- Y3 i1 b! v0 y* v7 t5 a- I, Z
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。$ Q! E$ e- i) L
4 O( |8 B+ Z0 a! lpython函数传递参数的方式有两种:8 x5 K+ j. V/ _, F
7 I/ [8 H- ^( ?5 v3 \4 d: z
位置参数(positional argument)5 j4 u$ D# q" }' z# s" J
关键词参数(keyword argument)
6 R" h% d. j# L7 W+ h*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
) V, N' r; I. w( Y6 r. s& U5 @8 ?' c$ s3 ?) r! R5 D6 M j
*args 表示任何多个无名参数,它本质是一个 tuple1 l& Q6 P. D1 y0 c
**kwargs 表示关键字参数,它本质上是一个 dict7 K% Y# n" ]9 t- W2 d4 d: x
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。. ~3 S* H; y, ~, K2 U. n; H
( n9 C6 ]5 Y( K, V) \1 T
>>> def fun(*args, **kwargs):' G }) q7 j* @- |4 d! S) B& \
... print('args=', args)1 p7 d. s7 l7 F7 |6 n: a4 G1 I2 W) O
... print('kwargs=', kwargs)
/ \ k0 c# P/ y) a5 g...
# h& d0 s% ~. k( b( {+ r) H4 k>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
5 f% \9 o4 Z- N; Aargs= (1, 2, 3, 4)
/ X0 b9 w( R; E# U) D% l! [5 \kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}
1 x) L% t8 n* j/ K" ^使用 *args& ]% v T/ f0 G: _ Q( a3 G" U
, g2 F( h$ P; A7 j>>> def fun(name, *args):
+ ?& P2 D' N9 z2 [0 y- y... print('你好:', name)
# w3 T. Y1 H+ T% G8 t$ l... for i in args:
4 N" P9 H4 m1 W8 Q6 f... print("你的宠物有:", i) b3 O, d. j7 R$ ~5 a* o1 b' O
...
8 V1 R$ X8 d( F. ^3 c>>> fun("Geek", "dog", "cat")5 ~. c* ]( ?8 ^4 X! V9 z0 Y
你好: Geek7 k3 r3 Q5 \) w% Z5 P
你的宠物有: dog& x% i6 j0 Y( l# W
你的宠物有: cat
# w1 q% U, \+ v" m/ [使用 **kwargs
5 C, r4 _ ^, l4 y, n) n: O, F W6 q
; p" C6 t. L; H+ A, G>>> def fun(**kwargs):
$ l7 Y; W* S' I" x5 q) p... for key, value in kwargs.items():
/ B2 V5 ^# E5 w... print("{0} 喜欢 {1}".format(key, value))
. k/ r. p& ?( R; p) q0 }0 N3 B...
' h0 }1 ~% q9 p6 a' c( O" H>>> fun(Geek="cat", cat="box")' X6 W2 L9 Y0 K. b" D r6 P
Geek 喜欢 cat0 H& @! f% E, u2 ]; C: I \
cat 喜欢 box
- Z5 S) k- t1 X( V7 ~; y3 t3. 函数实参/ H1 B0 V5 p9 K' V8 V
- w9 G/ _9 I( G' F- h* |8 U
如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:7 y5 f* N6 O' ^& ]4 E4 p
1 `) N$ w9 H6 k$ e7 j6 E+ L9 X# [
>>> def fun(data1, data2, data3):
! d' |, H( c$ |* I- `" V( g... print("data1: ", data1)
2 } g' s$ i! u7 {... print("data2: ", data2)! @; O- K+ V7 H, Y3 T4 t6 C
... print("data3: ", data3)
6 z9 [* w8 H; G& w; z...
1 s }$ a2 i+ {) z; Y>>> args = ("one", 2, 3)9 d/ ?0 J5 H" }2 E
>>> fun(*args)2 a4 L' w0 W; `
data1: one
H2 T" J4 p( h( i }" Ldata2: 28 _4 N6 C1 Q5 b7 T* _
data3: 38 m3 P' I7 a- r) r8 B6 b
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}
: M z9 }7 j) h( `9 U) J5 k; ^>>> fun(**kwargs)
0 a/ a9 R0 G8 q& b/ d4 Udata1: 3
* b) P$ h" A& g5 @) w3 }data2: 2
: A' v- d% j% h7 udata3: one
" c1 q5 I2 B5 K. e4. 序列解包
3 Z9 @; y0 R* G4 m1 |5 _! W% ^
; }' L, v+ o6 K6 p0 J9 L: H9 T+ X序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。% I2 g! n- V& V: ]& h6 O. Q
. |) i) t! P+ G6 s3 f8 t6 w* `>>> a, b, *c = 0, 1, 2, 3
+ E' g: z0 a1 K q; |/ Z3 d. o>>> a
% ~3 t; Q6 o2 z( k6 `0 x' Z0 7 _6 }2 F3 S6 `
>>> b
% Z/ h+ r! r3 h$ B) B: H1 9 r! o0 C- g3 ^' R+ n9 @& d' G; ^
>>> c # o1 y' f; d5 o1 ~! u9 o) m
[2,3]
% w* k) P) t) [$ Z6 j1 Q |
zan
|