数学建模社区-数学中国

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

作者: hfyxr    时间: 2020-4-15 11:15
标题: Python中*和**运算
在 Python 中,* 和 ** 具有语法多义性,具体来说是有四类用法。
. R* k/ ?( k) i( i9 x0 b
0 k2 q1 E/ {. E* A$ y1. 算数运算
3 N! v( g4 U( Q* Y- |9 }/ `/ T! P
*  代表乘法; H! R/ o% K7 C2 j% ?
! I4 P. K  V$ P
** 代表乘方
3 {* f( b4 K- X1 q1 g6 i) @, e
. p; j/ A, q6 \) }>>> 2 * 5' E6 Y: h2 d( P
10
$ p# P/ z, @, X& B+ }) x>>> 2 ** 5
7 `% `$ F1 l4 Y. q  p32' Z$ ~. _$ C% S& z- _
2. 函数形参/ `. ?5 V2 V' Q5 l. g: H% k

* A& j" p; J% s3 H$ R7 W*args 和 **kwargs 主要用于函数定义。
7 P9 _% d" K- Y3 W- K8 h
' {2 o3 d1 ~! z8 h1 j你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。  *(星号) 才是必须的. 你也可以写成 *ar  和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。# e2 J2 w5 q" Y/ d. f# F( C. u
+ k6 Y* s6 m' [; L, w+ U5 D+ d
python函数传递参数的方式有两种:1 n2 f8 r) l2 x, A
" Z5 ?1 l  M  R$ ?! u2 v& a
位置参数(positional argument)
% A  p6 y4 o, U0 t: b9 F5 X关键词参数(keyword argument)) O6 E0 m$ q+ X2 d6 Z* k8 r
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
1 c  w6 {7 w. o+ p; p0 D
# q; z% \' J$ Q9 [*args 表示任何多个无名参数,它本质是一个 tuple6 d0 M: \" ]9 t( N
**kwargs 表示关键字参数,它本质上是一个 dict
: b% D9 H' V4 R* \如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。
' @4 G9 t2 p3 S3 V0 C( i
1 A' |# `: G& D>>> def fun(*args, **kwargs):
$ u, R3 ]' q4 d6 r7 Q7 q...     print('args=', args)' F7 _( i- n4 U& W9 N+ h
...     print('kwargs=', kwargs)! {8 m; @& Q" C- p6 k
... 4 m* @: o$ |' J4 ]
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
: W6 x% r7 J8 Iargs= (1, 2, 3, 4)
& [3 T: U5 t+ f, }7 b! K* ykwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}. V/ b: {; Q0 h* b/ s* @% _  X
使用 *args, C, l& ~  a, P/ Q0 u' n3 w; i9 I! c

- @, w3 R- I( t3 J) L; o>>> def fun(name, *args):( s! A! x9 p7 s  [' _  @2 X+ N' [
...     print('你好:', name)
. J* D6 c, ?" F- K; U) s...     for i in args:
9 N  r5 r  |& ]' S$ x...         print("你的宠物有:", i)
8 G7 X/ U9 C& @$ i...
5 \6 H/ G0 {0 f  Y2 {2 m>>> fun("Geek", "dog", "cat")- q& }+ U) C+ j
你好: Geek" z" @' h/ b% K+ I  J# q
你的宠物有: dog" {5 s& M) v3 y, `8 X0 v8 [
你的宠物有: cat8 O4 Q. N$ l  q* ?* p
使用 **kwargs
8 R, Q- G: J+ j: C8 u$ t
/ `0 I0 y. i8 @>>> def fun(**kwargs):0 h) W- M; x: S3 C! S
...     for key, value in kwargs.items():
$ n1 S" ?6 i  H, `5 [* }...         print("{0} 喜欢 {1}".format(key, value)). [. Z/ ^$ H( o; h" b
... + x; }) I) z( D# H8 F; ?7 x
>>> fun(Geek="cat", cat="box")
8 U* j/ j) n4 u7 o8 SGeek 喜欢 cat( G: t% ~% @# ]# s8 U
cat 喜欢 box
- w3 j+ U1 O* u& N5 F3. 函数实参
' p8 Q  q( t. t+ C: j2 M9 W" ]7 \/ B9 H
如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:# \5 f& h+ a/ E1 `- _+ Y

7 r- L$ u' |! E  Z7 V& G7 j/ G1 g>>> def fun(data1, data2, data3):
- Y% s' b4 _" s; E...     print("data1: ", data1)
' U' F3 [9 K; E- J$ J" T- B! z...     print("data2: ", data2)
6 n/ G% v( o5 U3 Q/ M# i! l# ]9 _...     print("data3: ", data3)
( O8 B/ Y$ h- M. [... & h+ P/ c, z9 V8 g
>>> args = ("one", 2, 3)) j7 S" D  M& j
>>> fun(*args): V* Z4 k5 P6 L  b0 F
data1:  one, O6 x* t9 g. [/ s$ L
data2:  2
& I2 e" U, j% K( \4 I: n+ M7 gdata3:  3
1 |7 A* {; K/ }  [  L, f( q: H>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}' A3 u3 [, X' g* `& O# g& d& G3 [
>>> fun(**kwargs)
" ^4 p2 T3 h0 {- o/ Qdata1:  3& a8 u0 r. o. L
data2:  2# W+ {' d2 Z6 F
data3:  one7 l: K$ [4 c( J% b! L! A' ]7 Y
4. 序列解包% O0 E0 y2 O( Q2 |. e6 T
2 ]6 i6 s& J4 _8 k8 A  w
序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。9 t: J( J) M  Z. ?

3 q% G9 Z# p; a7 D>>> a, b, *c = 0, 1, 2, 3  
; {+ z, Z/ P# k) S' L$ e8 M>>> a  & O0 j5 Z6 c8 c) C) E# B- s1 Y# c
0  
" Y5 p9 ~# R- a' L7 j2 q>>> b  + W" f$ R, F% f7 `( M  u, k2 h/ h
1  
7 P, d; A3 m' R5 y7 A, o: [/ c>>> c  
2 C( Z3 h( t  m3 I* L/ Z0 |% Z, P[2,3]
3 l% S; }  Z+ B- v' D
作者: 2863358207    时间: 2020-4-16 14:39
这么多**号我还以为说了什么脏话呢哈哈哈' z4 S4 i( V+ Y





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5