- 在线时间
- 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 中,* 和 ** 具有语法多义性,具体来说是有四类用法。6 X4 \+ R# ^1 e: D7 K& R" g6 H& M3 e
& N. B# f" T& G+ ]# x
1. 算数运算
( J8 k: M/ u- K$ y
. ^; I; r% Z" o* 代表乘法4 @$ O% x/ ]$ f7 n5 J$ [- O/ z
# _4 i: l, |: E8 Z# X8 h2 |, e3 X** 代表乘方$ M3 i* R$ B8 ^0 o* L0 z
7 t9 d7 p- O; D8 X: J' k
>>> 2 * 5
% v9 M8 }5 d3 I1 \: h6 `( z10- ?. }( d* \4 ^) r' J4 Y
>>> 2 ** 53 O- S y, I3 p4 j1 o
32
! ~8 O9 K+ W- f$ X. L1 H" C2. 函数形参+ h% z# O2 D: B# m
$ K9 _$ a. h% S: w' S) b2 c
*args 和 **kwargs 主要用于函数定义。
: r5 c8 Y, U& J: @+ C. K8 r; [8 G: c# W7 ?, ]
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。& M Y0 O4 G6 V1 Z+ F% x' @7 J9 z
9 Q% N" n P1 g, l P
python函数传递参数的方式有两种:
+ F% ~- r7 _: \. _5 Y% M! {
& w9 N1 m8 e5 L; W. b6 P% j位置参数(positional argument)
( n, i: y m+ g2 ^* z- t% ?2 c关键词参数(keyword argument)
- k6 v4 k0 ^* I4 n*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
) p" p/ G1 o& k' P" g7 p9 ]5 _1 n, G P* g' ]
*args 表示任何多个无名参数,它本质是一个 tuple
- m6 r* j: |0 E* i**kwargs 表示关键字参数,它本质上是一个 dict
! {1 E) f) n: r* v: t/ L如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。
9 I8 [% p$ L% [$ a% y! x9 K( F; ~: k6 v1 N! ~! f6 B
>>> def fun(*args, **kwargs):
% ~* t# G$ `: t g... print('args=', args)
% L* b( ]" {7 S/ P& l) q' A# E... print('kwargs=', kwargs)
6 ^% C, c3 `6 p+ e...
0 { ~8 `' A& m>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
( X' G$ }6 A) Dargs= (1, 2, 3, 4)2 w+ ?- |9 U( U+ M4 k
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}; s: ?5 ~4 Y) ]. r" _9 `) H- [
使用 *args
0 J V; r! h" a! T7 G( d0 y: y7 \- t) l( r5 K
>>> def fun(name, *args):6 X4 Q- ]1 ~! D) W1 k. P; u
... print('你好:', name)
6 Q5 ~4 ?+ D+ U/ a6 a& O9 n, P... for i in args:
1 q6 m% i# ~# I# I# F1 T... print("你的宠物有:", i)& b% H0 f/ R9 R1 L
... ( @% Z& f( R0 R0 Z a
>>> fun("Geek", "dog", "cat")% n* J' j& E( |6 O6 y8 x* i. Y
你好: Geek
5 @3 _8 t. j) n9 O# n5 n6 V! S2 D你的宠物有: dog
3 d' `5 H0 v" b1 ^( I你的宠物有: cat# x/ Z" k) G; s! |! w4 Z( q
使用 **kwargs% e9 d3 A, l+ S- J; g
8 P( _0 w; Y: e( o. [& q, W>>> def fun(**kwargs):4 E3 ~- i, m0 v' G% j
... for key, value in kwargs.items():
. x; c: [- k5 D. Z... print("{0} 喜欢 {1}".format(key, value))
* T* N8 o- ]" |& L...
3 {* K- M3 U$ P* U! w>>> fun(Geek="cat", cat="box")
6 J( K% ^6 H9 h8 lGeek 喜欢 cat
+ t+ B+ X% D. {6 O7 kcat 喜欢 box1 i; B% m, I% R9 I
3. 函数实参3 ]7 _0 {% W- O6 K- d8 q
6 S. [$ t R/ N2 v% O如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:8 _1 n6 Y7 e, X- V+ N! U$ V
3 c9 N6 r/ {( x4 Q
>>> def fun(data1, data2, data3):
1 A) x. Y. y+ F- J. p& I... print("data1: ", data1)
8 n% Q3 `1 ` d3 W8 U2 |... print("data2: ", data2)
# N) z" [7 _# b6 z( @' G... print("data3: ", data3)* ~. K( {8 l% {1 U- y7 w
...
$ }: n S; t- S" a- }3 Q2 g" z>>> args = ("one", 2, 3)
- z: R" W$ r9 o# }+ c9 M% Z/ d }>>> fun(*args)1 q8 x U- Y" f0 z- B$ B. h% P
data1: one
& ]9 R, j) i7 _( k) I9 [8 r i/ R0 ~data2: 2
) Y" w9 i* t+ O1 I3 V( _data3: 3
% g4 N- F4 L3 g" H! |. }>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}
% T# n4 {! O( X9 q, N>>> fun(**kwargs)
. k. L. L7 \6 g# U& r6 t- vdata1: 3) u+ Z; K. i8 w8 M8 y
data2: 2
" } [: b2 E- Z0 ^+ [data3: one
. T& e( u0 E- v, |7 q4. 序列解包1 A% m- T* w) P6 S4 ? Y7 m
9 }! P, @( H' _5 C! o4 K; C序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。- w* k" l8 u/ t6 o9 x
. [% K6 S, c& m) B9 G* g
>>> a, b, *c = 0, 1, 2, 3
1 t3 Z5 b& y H! s9 t* X. m>>> a 4 v6 q: X; @% y/ [
0
9 C/ p* n- g. K>>> b
, F4 T' U/ p. z* p0 z1 5 R$ s5 R. h% m4 v1 c
>>> c 8 h4 b8 v; o. S* R( q' T( j
[2,3]/ J) ~$ v* e' F0 `) ?
|
zan
|