数学建模社区-数学中国
标题:
Python中*和**运算
[打印本页]
作者:
hfyxr
时间:
2020-4-15 11:15
标题:
Python中*和**运算
在 Python 中,* 和 ** 具有语法多义性,具体来说是有四类用法。
. C3 R+ m- c5 P; y. b, A+ D
4 ]# M! j8 b! w) f8 W( y
1. 算数运算
+ F8 p# A& E9 I2 q. t+ r7 i6 i$ u
) t) c* [% j" @4 n9 j) u. G
* 代表乘法
: c0 a, k& i" G! e- z7 S+ `
" _& I* P1 P# \, h
** 代表乘方
1 [7 g' w% V% w# @
' n: k) q7 Y9 ^; V% Y$ H( K
>>> 2 * 5
! n) n! z/ _9 K0 e. M1 i
10
' q, t% S8 @1 R7 y* u) l
>>> 2 ** 5
N8 M9 G# K5 o( E0 p( g* w
32
) K3 C( r) B4 S4 ~
2. 函数形参
( o. B$ w; |6 S, N* A
- \5 ]- B0 n! W9 H
*args 和 **kwargs 主要用于函数定义。
9 u+ |# a0 A" ?$ l
$ e9 D" w7 A) b' c- d
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。
* B5 |" @, J% {
. i8 r- a9 q# S# W/ P8 o' G3 l
python函数传递参数的方式有两种:
+ [( ]* ^0 r$ S9 I+ [
5 Y/ R3 Y* ?" R o- i6 M
位置参数(positional argument)
* J/ K0 p4 S% L7 G4 t* V
关键词参数(keyword argument)
o( j5 P9 @ Y. Q( j1 T4 T* O- I
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
0 G: ]: C ~' E+ Q7 {2 r7 R
4 c1 N8 H/ p2 G# V) G+ I9 u& L
*args 表示任何多个无名参数,它本质是一个 tuple
7 O2 m7 D: e2 K1 L4 ~4 n* f: F0 F
**kwargs 表示关键字参数,它本质上是一个 dict
9 J: n1 N7 G! |& O
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。
& }" L: j8 i2 L! h9 V! s
7 [4 h `% P7 i
>>> def fun(*args, **kwargs):
+ `0 Z3 D# B. ]0 z
... print('args=', args)
& r1 j4 q6 ^/ p, o4 }1 x+ \
... print('kwargs=', kwargs)
% o: n! a1 n' w1 V2 l2 ?
...
+ o4 V0 P9 h2 ~- \& Q9 N+ O: O
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
8 C/ J9 h* [, a" L3 c7 k
args= (1, 2, 3, 4)
7 A3 ]; J# b/ u* R
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}
* H" }5 G7 F5 K. _2 |
使用 *args
7 y# }' N$ m$ L! I2 o
& ^- e/ A% ~1 y; y$ k+ z- Q
>>> def fun(name, *args):
0 S2 M9 x/ ^7 D
... print('你好:', name)
/ }7 g Q8 J6 U6 @6 [; `
... for i in args:
6 J7 q9 Z0 W9 C; l! l
... print("你的宠物有:", i)
; G4 U& @4 i9 X' w X; @1 Y
...
+ y6 @ F: i* A& F
>>> fun("Geek", "dog", "cat")
; Q; ?& n6 E5 [! R; w
你好: Geek
1 o* v; ~6 N' U+ D, M4 s% W* u, V: k
你的宠物有: dog
9 C; q7 b8 p* h0 g0 R
你的宠物有: cat
6 Z7 y/ W* Q* F/ x" D
使用 **kwargs
9 G! P7 `1 ~" U' ~% {
% `/ A% d8 q4 u4 Q
>>> def fun(**kwargs):
% s+ S5 c; V* y9 B
... for key, value in kwargs.items():
% `, h+ }# k: b l9 X
... print("{0} 喜欢 {1}".format(key, value))
% V* t! W, v, l# e9 ?5 @7 {( W
...
' i. a/ u) m# v4 g5 n% k
>>> fun(Geek="cat", cat="box")
: \0 c! j6 p3 }& S
Geek 喜欢 cat
, o" G2 Q7 b+ s7 }# t
cat 喜欢 box
- p I. i: X: f2 q
3. 函数实参
6 H! ~$ M9 I% J
1 o& T- e+ y8 W% F9 @9 {6 p5 Z
如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:
: C+ `4 ]& l, Z7 ?1 M* P% W
" K6 E0 v! q/ X# y1 Q1 [; B X
>>> def fun(data1, data2, data3):
* M' @6 G4 X ?8 M1 J- t
... print("data1: ", data1)
. L) L( c |1 E# T2 n- y0 Z
... print("data2: ", data2)
3 T& U( R% G3 \( ~) ]
... print("data3: ", data3)
3 B2 N# j' N! @* V& K8 @( Q& ]
...
1 i( S1 h( o$ S
>>> args = ("one", 2, 3)
: A* {/ q! k3 ?' w8 X" S3 A# W* l
>>> fun(*args)
* e& v$ \- S" j- p `) A
data1: one
+ y8 u6 L% `% X' {8 u4 a8 }7 z
data2: 2
, W, c/ I4 v B$ @ Z
data3: 3
& X; `/ m9 y% i, g( W, b, h! U
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}
$ \# x) V/ Y7 ?. v
>>> fun(**kwargs)
" K7 y; d( M' f3 r$ o5 Z6 `
data1: 3
6 J4 Y' @- }. T) L" o* P2 [* j7 h
data2: 2
, B4 k4 n% w+ U; [
data3: one
% G3 ]" Q6 s; p" k3 r
4. 序列解包
5 \3 Y% J% P, r) _* |2 |
) h7 b9 ~5 @. N$ ~
序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
* ~3 j1 k& A: F1 B, ?+ t. \8 h. U8 F
# Q3 c3 Q1 x. N
>>> a, b, *c = 0, 1, 2, 3
2 }8 K4 ^1 K- @: ~7 _6 `
>>> a
2 Z( r, j5 }) ~# s
0
# j) ] m+ k5 h5 M
>>> b
( e- d) q# p) A+ z
1
( F1 @- [, J& j2 I6 H3 w
>>> c
]2 Q9 _: G( H8 S& m! L
[2,3]
! e; e, q2 J% J( |& H+ M4 s, n' @
作者:
2863358207
时间:
2020-4-16 14:39
这么多**号我还以为说了什么脏话呢哈哈哈
. R- L, ?( M$ |) Q
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5