数学建模社区-数学中国

标题: Python中*和**运算 [打印本页]

作者: hfyxr    时间: 2020-4-15 11:15
标题: Python中*和**运算
在 Python 中,* 和 ** 具有语法多义性,具体来说是有四类用法。) q+ b5 i* |: B, D9 z+ k

3 ^& L; q/ O- u% M$ ?+ C1. 算数运算
- 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; c10
5 ~% y" e% w+ `4 s7 L>>> 2 ** 5
$ r( U7 c# c% H# x+ o  u" t! w32$ i4 k1 j# M) p( ^
2. 函数形参
) o* p. b8 K; D+ p0 _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 vpython函数传递参数的方式有两种:
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 Fargs= (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
使用 *args2 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你的宠物有: dog9 ^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 cGeek 喜欢 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 \* K1 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:  one1 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:  35 o6 v- p1 y! y& N5 C
data2:  2
5 P% k' P- O+ t8 }) Pdata3:  one2 D$ q/ r/ h# ]* j+ r
4. 序列解包
0 n1 Z' D% z1 ^, @) b7 ]  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  h0  , 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