数学建模社区-数学中国
标题:
Python中*和**运算
[打印本页]
作者:
hfyxr
时间:
2020-4-15 11:15
标题:
Python中*和**运算
在 Python 中,* 和 ** 具有语法多义性,具体来说是有四类用法。
. R* k/ ?( k) i( i9 x0 b
0 k2 q1 E/ {. E* A$ y
1. 算数运算
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 p
32
' 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 表示任何多个无名参数,它本质是一个 tuple
6 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 I
args= (1, 2, 3, 4)
& [3 T: U5 t+ f, }7 b! K* y
kwargs= {'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 [
你的宠物有: cat
8 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 S
Geek 喜欢 cat
( G: t% ~% @# ]# s8 U
cat 喜欢 box
- w3 j+ U1 O* u& N5 F
3. 函数实参
' 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 g
data3: 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/ Q
data1: 3
& a8 u0 r. o. L
data2: 2
# W+ {' d2 Z6 F
data3: one
7 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