数学建模社区-数学中国
标题:
Python中*和**运算
[打印本页]
作者:
hfyxr
时间:
2020-4-15 11:15
标题:
Python中*和**运算
在 Python 中,* 和 ** 具有语法多义性,具体来说是有四类用法。
' @; n0 Q) b# h6 P M6 R2 V
i" G/ r9 H3 E+ a* }( k
1. 算数运算
6 o1 x; R. B/ w/ r
8 k, S9 Q5 }( v b
* 代表乘法
' c+ j. t+ n: `* s
! F6 \8 P3 ?9 F9 x! ~! x9 @2 S
** 代表乘方
5 S- J) H0 l* p( M* A! n) {! Z
8 f8 M' q3 R' Y* Q0 d. U
>>> 2 * 5
+ \3 m q5 F& o' o } ~
10
0 N. r3 l% R O9 {+ y
>>> 2 ** 5
$ v2 m, T ?/ }6 p9 j: C6 g9 o) q
32
. C4 O- X( L1 b' h! S
2. 函数形参
8 C: \7 q: _2 ]+ }) W
% u( z# e1 i8 n+ L! I' A
*args 和 **kwargs 主要用于函数定义。
3 p! S+ q$ P9 _4 J- \
0 P5 o5 e! U2 L/ e' |( Q
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。
2 R- n2 Z9 r% u7 ~+ z& c
: b3 l( p# N4 Q# T$ V! l2 t
python函数传递参数的方式有两种:
7 x( l& T# s- J9 T/ z2 L
" a) _8 E0 K( z# ^
位置参数(positional argument)
, y( O2 O' k- \9 ^4 | L' {. d) o
关键词参数(keyword argument)
b+ h! X# B6 X
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
) e; k( j) L' u, J
2 B8 i" ?& J4 H4 d2 u
*args 表示任何多个无名参数,它本质是一个 tuple
' g9 T# {- {3 i$ ?1 G
**kwargs 表示关键字参数,它本质上是一个 dict
0 s8 t& K2 n# R) Q
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。
h; h9 C: `! X. n: R! n" ?6 w
P9 E- a) ~1 W0 P9 c7 z
>>> def fun(*args, **kwargs):
7 {1 R; h, b8 a0 |2 K3 W
... print('args=', args)
; I" r# {- U: h. Q( U9 X% o- g
... print('kwargs=', kwargs)
6 J. X! x2 k" H9 b6 M$ D
...
5 \5 x& b) l$ V7 p
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
1 g, J* Y7 \, C4 n. J8 C8 E
args= (1, 2, 3, 4)
1 ?: I" I- y4 J: i& j8 h
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}
* y j( d- d7 | o3 I' _& _
使用 *args
& e+ J- H; J8 a4 [
& f; l0 K( k4 K6 J
>>> def fun(name, *args):
) E6 u3 `7 N m: d8 S
... print('你好:', name)
, j, @0 o8 W1 I% C. W+ h
... for i in args:
, S* Q$ |+ }' e, r
... print("你的宠物有:", i)
0 F: S* z* u6 O; j, M! F8 r! R
...
) ^6 I4 z3 r& j# f2 M
>>> fun("Geek", "dog", "cat")
4 c/ }) S1 ^! ~2 O: a. Q m
你好: Geek
9 y$ |& k) f' i
你的宠物有: dog
' h# x6 D' V/ z. ]1 V
你的宠物有: cat
9 g u" g" t1 z" E- ]' h7 g( T
使用 **kwargs
8 b5 I( K1 M" E* r9 I# u9 v
' h- `5 F+ t2 @, c; s, x
>>> def fun(**kwargs):
* A8 \0 [. O/ R
... for key, value in kwargs.items():
7 G6 u" R2 ?6 }1 X4 v- d
... print("{0} 喜欢 {1}".format(key, value))
- J4 C! O; u7 d5 r X
...
& V- e9 U6 y' f2 m, }
>>> fun(Geek="cat", cat="box")
, q, x) i4 I5 c: P
Geek 喜欢 cat
0 |4 O$ y- _) o* Z
cat 喜欢 box
, D: ?- V2 x5 f2 p/ I
3. 函数实参
5 a: L# J' e/ R( d+ \
7 p/ ?' o i, Z0 C
如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:
+ S1 ~+ d- O5 p9 M, V; e
* W! q, ]9 }9 e+ n& q0 C
>>> def fun(data1, data2, data3):
$ k& C9 ^# ^- e9 t
... print("data1: ", data1)
& K. I# j0 Z& `5 A6 e
... print("data2: ", data2)
9 [/ n9 R V- N% g
... print("data3: ", data3)
: s0 C- S5 b. R* u: t" [5 @
...
% p7 ]' }+ Q4 [. W: D" j9 w
>>> args = ("one", 2, 3)
o' Y7 T/ X9 A/ O# S+ R( [
>>> fun(*args)
( I& ]$ F2 Y, g3 ^4 B
data1: one
: l, m! k5 g, f
data2: 2
' F5 a% Z: i: ^8 A# m. L9 p
data3: 3
3 L2 ?) H8 l7 ?1 a7 N
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}
7 [3 E' ^, z4 _$ N
>>> fun(**kwargs)
& v1 g/ ]% v8 A9 |
data1: 3
( T- u3 J& `1 |$ v# y: y1 b
data2: 2
- r3 X% [) ~% A5 Q6 ?, U% }
data3: one
% [9 y! c; D' C7 L' ~ M5 w t
4. 序列解包
" M! _& D2 ?. j: j$ U
, v8 C" n- c7 x+ K0 o
序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
4 I/ q8 I% i3 y$ `6 A V" k
2 ~$ v5 M, m' t, q# f! y( R) C
>>> a, b, *c = 0, 1, 2, 3
3 F( ]3 M; V p6 ^# w
>>> a
% Q- R" [6 l# c( m4 g; U
0
* C9 r" D" c& @: y9 V
>>> b
8 X. f( C& V N& I# @
1
4 O8 \* u6 ?, D5 S
>>> c
3 q% w, S3 |+ i; M% ^" i- v
[2,3]
* q% T" Z. K$ z! L9 O; Y* c9 g
作者:
2863358207
时间:
2020-4-16 14:39
这么多**号我还以为说了什么脏话呢哈哈哈
( T; V6 Z. g, Q$ B* z% }1 D
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5