QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6440|回复: 1
打印 上一主题 下一主题

Python中*和**运算

[复制链接]
字体大小: 正常 放大
hfyxr        

2

主题

1

听众

4

积分

  • TA的每日心情
    开心
    2020-5-30 12:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    网络挑战赛参赛者

    跳转到指定楼层
    1#
    发表于 2020-4-15 11:15 手机频道 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    在 Python 中,* 和 ** 具有语法多义性,具体来说是有四类用法。1 e; `: W( w/ m: P9 b* I8 G
    ) a7 x3 l# P* E3 n( A0 i
    1. 算数运算. H+ _4 g0 P- B) J, m4 _$ p3 j
    : [) Z" I6 ?2 |
    *  代表乘法
    , y( Y/ [$ l0 D& p
    : R# ^: W; u7 B) t4 ?" q# j+ g** 代表乘方
    " X8 A) B3 n$ E# E3 L
    * U. Q- A. e! r" E/ r7 ]/ S1 r>>> 2 * 5+ h" w6 m8 q) J* P1 g
    10
    3 d; j0 O" k. f$ P>>> 2 ** 5$ I, C7 A# N! S* r# T
    32
    + d. N: M* T" {* C) ^1 Y2. 函数形参' m4 s3 o; x& Z0 H5 k

    6 u. }9 r9 B8 }* ^2 o1 C*args 和 **kwargs 主要用于函数定义。
    9 m& F  I9 o* A% `+ x& ^7 t4 U
    & u2 L4 K7 ]( b你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。  *(星号) 才是必须的. 你也可以写成 *ar  和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。, H; R( [2 w* Q

    ) v' T1 L# q. ^7 v/ r  @python函数传递参数的方式有两种:* P( D. ^- ?# f" E5 F

    : F' D8 J2 s( M+ D; i位置参数(positional argument)
    ' m9 L% ~9 E$ `3 h+ D8 P( O# @8 K关键词参数(keyword argument)
    ' A" T: [4 z' L+ Y' t7 {4 e*args 与 **kwargs 的区别,两者都是 python 中的可变参数:. ^: k$ Z1 R* u5 C; f" n, a  i
    4 ?" p4 ~+ o  w5 ?7 r. M
    *args 表示任何多个无名参数,它本质是一个 tuple
    6 [- w1 S9 e. G9 U% z**kwargs 表示关键字参数,它本质上是一个 dict7 q/ m' S0 i$ v
    如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。' ~! ~# N' M! n7 T, l

    5 V3 _  O1 l$ h# Z# {>>> def fun(*args, **kwargs):
    / L# b" A" |8 K! ^* P4 H3 E# n' g( Y...     print('args=', args)6 ~. p4 B5 A; ]& x* b  r
    ...     print('kwargs=', kwargs)/ |8 S; P5 A0 e9 P- U! n; T
    ...
    2 h9 X7 N- _; J; {6 k: Y>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
    7 p) s3 j) F0 q7 Vargs= (1, 2, 3, 4)) a$ A; p$ _1 _  ]0 s
    kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}! {6 P3 [% a& Z4 S& h( r0 a6 @
    使用 *args
    . d+ C6 s( E2 _5 K! t5 c# h
    0 X# l/ }$ ^! O/ S. f>>> def fun(name, *args):6 Y: a! Y3 F+ W
    ...     print('你好:', name)/ Z$ a2 z( `7 Z8 o/ k6 `
    ...     for i in args:
    4 |* {! R: z: H* V+ ?...         print("你的宠物有:", i)
    " j3 k; m4 q) E... " V" B% m* g& ]" h5 p" ?/ v
    >>> fun("Geek", "dog", "cat")2 j3 _; K1 t0 l6 b1 N
    你好: Geek
    : P; `9 F; ?7 Q: O+ w你的宠物有: dog
    ' I; Q) d3 O  w" P7 }8 I你的宠物有: cat
    1 t( M2 n+ Y- y) a使用 **kwargs
    2 w9 E6 F. {, ?5 G( q  Y
    : Z, {; m, G8 }% }>>> def fun(**kwargs):2 x1 g% ^9 l" a$ U( b; r2 t
    ...     for key, value in kwargs.items():
    ( H5 p' E0 F" q5 ]1 U! T+ c...         print("{0} 喜欢 {1}".format(key, value)); q, q' t  L! D" @. ?) L/ a* Y
    ...
    6 K- F, [  O& O6 b>>> fun(Geek="cat", cat="box")
    & \2 j+ r; v) R& j3 s: fGeek 喜欢 cat  d( Q4 g) W! v1 f! i6 Z2 a9 @: A% W
    cat 喜欢 box
    & G& `& L. T+ k2 h3 x5 P7 d1 s+ {3. 函数实参4 [! e; D) W" w+ T# Q, p, N3 p
    ( w5 n5 g4 T- i3 ?- c
    如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:
    . u$ X2 s# Z8 K
    9 X% B$ J- {3 k$ G, j$ T>>> def fun(data1, data2, data3):0 Q. K* u- A5 I; o. {* X
    ...     print("data1: ", data1)! x2 H5 x+ |$ s: I! Y
    ...     print("data2: ", data2)1 K1 n* ]( Y$ m& e6 p
    ...     print("data3: ", data3)
    0 |: K9 O( p3 [7 Y... 2 `: ]. s: U5 K4 w: |
    >>> args = ("one", 2, 3)
    . }, s* `4 J: u* _>>> fun(*args)
    % S- r3 P; |; Pdata1:  one8 k& F% z8 t8 A; M2 J1 }+ g
    data2:  20 }" }6 b" M" Q8 L% h( s& F5 q; o
    data3:  33 ~* D9 Y) Y; ^/ d- I
    >>> kwargs = {"data3": "one", "data2": 2, "data1": 3}# c9 G& b! H' l8 v6 X7 @
    >>> fun(**kwargs)
    ; s. H7 _  Q8 r) p$ o" ?& Qdata1:  3$ y( P3 H0 C5 [1 `3 G6 N+ b
    data2:  2, }' K* m6 N5 E) X4 |, ~) [, J
    data3:  one
    ' ~4 b' ?8 ^- N8 P5 J4. 序列解包
    " k, r; S& U) R( F$ r4 w5 D( t- A1 f7 o& W9 G: i
    序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
    " a1 @" v& N( d( {! p$ z& t0 g
    * R; u8 \0 E& g! q: u' `>>> a, b, *c = 0, 1, 2, 3  
    + L) m  g- M% T9 t' _& H>>> a  4 \$ K# l; S5 q' n8 [
    0  : z, }! l, `+ G; B8 L3 H" M
    >>> b  
    4 I! ]- ]. f/ G% h4 n1  
    3 V$ s* L( l% w! k' x* `>>> c  & L3 w+ i) d0 r' I. h( @  e
    [2,3], i; n$ L! D  B/ V
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    69

    主题

    3

    听众

    661

    积分

    升级  15.25%

  • TA的每日心情
    开心
    2020-9-13 05:34
  • 签到天数: 149 天

    [LV.7]常住居民III

    网络挑战赛参赛者

    群组2013认证赛C题讨论群组

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-12-29 03:18 , Processed in 0.777653 second(s), 54 queries .

    回顶部