- 在线时间
- 4 小时
- 最后登录
- 2020-9-7
- 注册时间
- 2020-4-15
- 听众数
- 1
- 收听数
- 0
- 能力
- 0 分
- 体力
- 6 点
- 威望
- 0 点
- 阅读权限
- 60
- 积分
- 4
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 5
- 主题
- 2
- 精华
- 0
- 分享
- 0
- 好友
- 0
TA的每日心情 | 开心 2020-5-30 12:37 |
|---|
签到天数: 1 天 [LV.1]初来乍到 网络挑战赛参赛者
 |
在 Python 中,* 和 ** 具有语法多义性,具体来说是有四类用法。
* p0 |: c* G% I" q9 Y+ |) J7 c# A. I- P2 C k
1. 算数运算8 q; v/ ^" k% T( n# i+ \% [
% x# }7 z- C" J' }7 L1 B* g* 代表乘法3 C8 Z4 z0 y4 i; m
% F' e) K8 J- E+ T: u! a** 代表乘方
" s! Y5 I. \' M/ ^
2 v; a& r" @- Q! I& b>>> 2 * 5
2 v* y3 F2 w6 ~) `10
! t4 A7 @' P2 N( K>>> 2 ** 50 `" ?8 H9 N( S5 e5 ~- e( N
32 K' K3 Y/ V5 G9 _: T+ U
2. 函数形参
; p- p& X, c; J8 d. s6 } }/ X8 X) V) x' P1 T) J: A% R. {+ w; i
*args 和 **kwargs 主要用于函数定义。! S4 ~# R/ ]# e$ [$ W. ?
/ }1 ^% u/ Q5 R) v! S ?
你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。 *(星号) 才是必须的. 你也可以写成 *ar 和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。- y1 S; z# {% t0 d
$ U! X' j, N+ ^ f1 |5 z% ]python函数传递参数的方式有两种:+ I/ [; U' S+ e0 F9 N/ v$ I
7 V& `+ I2 ]* @3 v: s位置参数(positional argument)3 ?& z. b2 H# Z: W5 d
关键词参数(keyword argument)
. p' W. O, G) ~% p, C*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
3 q9 i- [6 P+ s9 b K4 l6 ^1 l3 L+ Y) b0 |0 {) }2 e% y; N
*args 表示任何多个无名参数,它本质是一个 tuple
/ }/ d5 }: l( ?( a [**kwargs 表示关键字参数,它本质上是一个 dict! u% d6 |' A9 O4 s
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。( T3 [5 U$ K% D# H, D, h: g
! z6 k Q6 e- n$ ] w' F+ \
>>> def fun(*args, **kwargs):
2 Z! y& _2 ?. U2 {6 E8 ?... print('args=', args)
! F1 w% p. N5 f. F; q... print('kwargs=', kwargs)
8 w/ B/ g! A2 X0 a$ A( q...
5 o+ `5 u# q8 e8 H5 S>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')$ U/ Q' t9 e( S% v- ?, M& i
args= (1, 2, 3, 4)
$ J& }1 M# M" H4 m. dkwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}: k1 t4 e, [" B e, O4 T
使用 *args5 C2 ]+ Z3 X5 G7 m
9 C) l) ]4 Z3 g9 ]' @6 E>>> def fun(name, *args):% M1 ?0 S. x, U! i- E
... print('你好:', name)
1 I/ f) X# a7 j! P7 A9 E1 p* e... for i in args:" n/ ^& O6 l2 k+ ], j
... print("你的宠物有:", i)
0 R5 `1 \- @' d8 [6 d+ {. D... 2 W& n2 y. [) w) r, u; M
>>> fun("Geek", "dog", "cat")
! l# m+ z: s6 T: a5 \# ?" `9 o; O你好: Geek
1 N- Z& W9 V5 c* b- s8 r1 N; L2 F你的宠物有: dog
" U* t7 P i( U; l% D1 e% U你的宠物有: cat
' T0 P1 ^6 [0 _使用 **kwargs$ }# c0 `* P' N) n. l* U& b+ f
# Y; Q& i2 p/ I" v8 ~# M
>>> def fun(**kwargs):1 H+ u2 g# Z4 U: M! g
... for key, value in kwargs.items():$ F8 L$ c& [' ]. R4 D' A% ]
... print("{0} 喜欢 {1}".format(key, value))
! h: G( R! H# x9 E, G# h& O... ; ]) |0 e' S2 b7 m. K' F7 ~3 `
>>> fun(Geek="cat", cat="box")
* X" E T( g# L9 Q1 q' h- VGeek 喜欢 cat
, Q% Y* l" K$ m- K# Y2 @cat 喜欢 box& Y0 R; t; ~5 t; |( D" Z
3. 函数实参
2 o( p# `! \5 V2 y; a
% n# i ?( U: N3 t5 @" ], z- J如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:: n. L1 m8 O7 v. c
0 Z( L, U6 w9 R( v: G
>>> def fun(data1, data2, data3):6 V' v( l+ h8 }* O4 V3 X4 u
... print("data1: ", data1)
" g: l" T% M; Q. P... print("data2: ", data2)
) w( ]5 C# V9 n! {) W, }... print("data3: ", data3)
, y7 U6 N/ g: ?% \" _( |( G( R- s...
; H& `' B' T" n, D. `>>> args = ("one", 2, 3)
9 ~+ [) g4 I9 N8 B, L, z) y' D: h>>> fun(*args)
! L. H. L) x, V2 N0 n& qdata1: one, l9 s+ N( z* b1 \0 X
data2: 2
/ q \4 x' ^4 m+ w5 edata3: 3 I6 v# v# b( w0 M) _
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}
+ h8 Q$ {! {4 |$ i4 _: z>>> fun(**kwargs)$ L% g, c$ Z9 u% h) o7 v1 w
data1: 38 G9 z9 |' [. [' G6 E
data2: 23 g% u, h2 c! q4 b- ^
data3: one
+ T7 X0 I) [# n; C) a4. 序列解包
" r. C# V2 K8 o8 y' Y9 \5 R( [& d. D2 X5 n! D5 r* N
序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
+ K1 ?& E: t4 e* z+ @# p R$ J6 L6 C6 J- j
>>> a, b, *c = 0, 1, 2, 3
& R9 e, H6 y* L- B, y" z* E! M) k, n2 K>>> a 2 h b3 y& E0 k3 o' }! x
0 + k2 U. S& g5 f/ H7 r! K! i
>>> b , q! n/ T2 X/ Z+ r7 t) s0 K2 s p
1
0 T8 ?+ L E/ T6 @>>> c
5 ~* J: B+ \ v/ W. N: t1 j) m) `) B[2,3]
6 L/ @- f9 R% y |
zan
|