数学建模社区-数学中国

标题: 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( y1. 算数运算+ 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* w32
) 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 lpython函数传递参数的方式有两种:
+ [( ]* ^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 表示任何多个无名参数,它本质是一个 tuple7 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 kargs= (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 |
使用 *args7 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你好: Geek1 o* v; ~6 N' U+ D, M4 s% W* u, V: k
你的宠物有: dog9 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 }& SGeek 喜欢 cat
, o" G2 Q7 b+ s7 }# tcat 喜欢 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  `) Adata1:  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 hdata2:  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+ z1  ( 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