数学建模社区-数学中国
标题:
Python中*和**运算
[打印本页]
作者:
hfyxr
时间:
2020-4-15 11:15
标题:
Python中*和**运算
在 Python 中,* 和 ** 具有语法多义性,具体来说是有四类用法。
) q+ b5 i* |: B, D9 z+ k
3 ^& L; q/ O- u% M$ ?+ C
1. 算数运算
- v3 x g; J# V! c; L& x
+ ` G- l, g5 ]4 ^( l* [
* 代表乘法
4 s/ Q% p& Z; d' y7 Q( m6 @; O
' h) K/ p L7 W! K" @
** 代表乘方
- p# o! F0 V5 ~ q g9 \
u; |! s: k5 ?: }" F
>>> 2 * 5
0 s9 }$ X! C: s; h% M; c
10
5 ~% y" e% w+ `4 s7 L
>>> 2 ** 5
$ r( U7 c# c% H# x+ o u" t! w
32
$ i4 k1 j# M) p( ^
2. 函数形参
) o* p. b8 K; D+ p
0 _0 f( _+ i% C0 f+ w3 t5 U
*args 和 **kwargs 主要用于函数定义。
9 F4 v4 d9 w4 [/ H- Z: Q# F) Z. `
* K B5 }; W. I2 @9 M' T4 L
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。
% c: b |- B9 \+ u9 @0 Y
- R# n" M' R6 v
python函数传递参数的方式有两种:
5 [- e d; Q% ~5 R% @, p& z! M
! Q$ F' g: T) f7 G
位置参数(positional argument)
! j" ^4 |1 L% p3 S
关键词参数(keyword argument)
3 J9 e T1 _. v/ n9 ]8 R
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
- R2 V, e7 n0 C; O
) M' q+ T1 V8 S' o9 G+ C
*args 表示任何多个无名参数,它本质是一个 tuple
p2 U- Z6 ]3 d
**kwargs 表示关键字参数,它本质上是一个 dict
( U; v3 h( w8 }, D+ n
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。
# e* q$ k, `3 S
' _+ U% Z9 e/ y( a4 R$ W$ V
>>> def fun(*args, **kwargs):
" F/ r Y! i. c3 n& {! r1 H
... print('args=', args)
" U6 U5 M! t. p* k# n
... print('kwargs=', kwargs)
2 I/ L* ~- i; s6 y/ h! W
...
k& P7 e" b3 R2 ?" E
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
. a2 v' Q- K1 D3 X3 }6 F
args= (1, 2, 3, 4)
. s. Z6 P8 \* e- W2 A" H
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}
H1 _3 i, ?* g: E7 J3 R$ J0 i
使用 *args
2 d/ X4 A8 e' a: \0 n$ J
! c1 D5 I; n/ @0 f' `# |' ^5 s" `
>>> def fun(name, *args):
/ l" E. I- v, @) m
... print('你好:', name)
) J/ X$ H: Z: ]
... for i in args:
?4 \# u; A4 H4 a6 R
... print("你的宠物有:", i)
: z' Y9 }. G' e( N2 X( F3 ^7 w
...
$ y1 B4 ?) V) M! Z# J; V/ ?& Z8 d
>>> fun("Geek", "dog", "cat")
/ Z8 L. X+ g! ~3 l
你好: Geek
5 ~5 a0 s/ r4 u! L
你的宠物有: dog
9 ^9 X5 `: s& h) w6 F/ M( M | [
你的宠物有: cat
3 ]! \* M3 g5 }5 u0 V( l8 H4 T8 u
使用 **kwargs
7 V2 `" \0 L, j
. C" n/ X1 Z$ d) w
>>> def fun(**kwargs):
% a, R0 P" F) V8 {6 r9 d
... for key, value in kwargs.items():
5 r9 s9 L" ]: f% p
... print("{0} 喜欢 {1}".format(key, value))
6 p4 {: ]3 b- ?6 H+ U) i
...
* M8 p" `: _4 u% n( F
>>> fun(Geek="cat", cat="box")
; Y, s. f% g9 o" w: d8 c
Geek 喜欢 cat
( V* l& J% [7 H: H
cat 喜欢 box
: Z4 ]0 F: |6 T; S9 k" ?
3. 函数实参
; L2 q1 q- v, T6 ?
+ L" p9 s+ G7 j$ Q3 p$ o) ?( \6 Y2 g
如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:
$ a! ^! `4 \* K
1 i6 v9 N! K# {! y" F6 b# H9 j9 P
>>> def fun(data1, data2, data3):
9 H% ?- L% F, h. P8 n
... print("data1: ", data1)
+ Z, k* N" R' F& J
... print("data2: ", data2)
" q0 Y; R( b2 C+ x) h. z* S
... print("data3: ", data3)
1 P5 F. J! J( D2 D* Y0 @
...
$ L4 v6 x5 X# q# J% Q; Q" z, F
>>> args = ("one", 2, 3)
! A2 A2 z c# c* I& k! J- d9 a
>>> fun(*args)
$ [) ]9 z- @- p6 V% H# @
data1: one
1 i( l; m( f9 S
data2: 2
% `6 v/ M# ^" U( E
data3: 3
$ Y* J: @# k8 S# W( c/ p, q! b8 |
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}
2 k/ c! B. O0 b$ |
>>> fun(**kwargs)
9 G S9 N) B6 ]# b' g# ` b
data1: 3
5 o6 v- p1 y! y& N5 C
data2: 2
5 P% k' P- O+ t8 }) P
data3: one
2 D$ q/ r/ h# ]* j+ r
4. 序列解包
0 n1 Z' D% z1 ^, @) b
7 ] h9 V# J( e! h4 j' {. _
序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
% Y9 N4 {, w6 @
0 `' O* G7 x. p* {$ S# h3 }5 t
>>> a, b, *c = 0, 1, 2, 3
8 D2 ~8 ^9 U4 u
>>> a
& ]4 M' D% w, M8 R h
0
, d5 P4 e) P2 a+ n5 \, o
>>> b
2 |4 n2 W( i& X+ y4 J
1
+ y9 ^" i L7 M8 k( Y. c2 ~# A
>>> c
0 e/ p2 d ~9 G4 t1 ~0 @0 q0 D6 h- p
[2,3]
2 E1 ]/ A6 c* O+ C
作者:
2863358207
时间:
2020-4-16 14:39
这么多**号我还以为说了什么脏话呢哈哈哈
9 w( c( I5 U& D6 j( d7 E5 A
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5