QQ登录

只需要一步,快速开始

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

Python中*和**运算

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

2

主题

1

听众

4

积分

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

    [LV.1]初来乍到

    网络挑战赛参赛者

    跳转到指定楼层
    1#
    发表于 2020-4-15 11:15 手机频道 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    在 Python 中,* 和 ** 具有语法多义性,具体来说是有四类用法。
    ( K7 H6 j$ Y5 U! A( p
    . a* z4 h  R' n- k9 h$ N) t; O1. 算数运算+ X& L/ Z3 F3 u
    9 a3 K: d+ N% r) Q$ R* t' P
    *  代表乘法
    & ~9 y- l- I; l) \2 ^' q2 [1 h6 [5 F, P; ]. i5 U" O. Z
    ** 代表乘方
    8 @& j6 o8 L# }
    - I0 o* i3 A# t6 e+ i" A" W>>> 2 * 55 j$ ^( `' I7 d
    104 R' N$ t2 h  ^2 g
    >>> 2 ** 5" }) x8 `$ J$ b* Y- X' n
    32: [4 r  T# ~5 U6 S! w* S
    2. 函数形参" c/ |4 @! \. Y/ d
    ' p5 C- ?' `- o- H1 B
    *args 和 **kwargs 主要用于函数定义。
    , g8 v6 w( T0 @  c1 I+ |9 y! I7 K% S( d; H& J  b) }9 ^) a* w" q
    你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args 和 **kwargs。  *(星号) 才是必须的. 你也可以写成 *ar  和 **k 。而写成 *args 和**kwargs 只是一个通俗的命名约定。; L2 ^  N) R& t5 b# [$ K% k8 i% U
    ) @: z& v( D) F
    python函数传递参数的方式有两种:7 t) \* I- F  e2 l# \* @3 |
    3 m. g* a3 _" }: c: A* t
    位置参数(positional argument)
    : W; N( n* }$ P0 K( M; z3 S2 \关键词参数(keyword argument)
    8 T1 T4 w5 v% r+ H+ k/ C*args 与 **kwargs 的区别,两者都是 python 中的可变参数:4 [& ]' r, f2 @- M" U- g

    - f! A( z  w/ }, Q2 F: u. N4 N*args 表示任何多个无名参数,它本质是一个 tuple
    , F) G5 `4 O. d  B* d* x. w**kwargs 表示关键字参数,它本质上是一个 dict
    ' m, [: p: x+ p( K. _0 s如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。" [0 m, @5 ^7 [7 _
    , S) `0 X7 v: a+ |' z& @
    >>> def fun(*args, **kwargs):9 {* b2 k: V- q! i
    ...     print('args=', args)7 ~( d, w# k" G) E$ l
    ...     print('kwargs=', kwargs)
    $ z6 ]6 ^: ]# J% w  }...
    - |* w! L/ Y- |% u+ g$ \( b. n; o>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
    ! U* g, ~; p6 l1 hargs= (1, 2, 3, 4)
    " F0 T' ^. x3 K4 N0 V7 Pkwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}, W2 q; i' m$ c( T
    使用 *args: L; B/ f# }  n/ F8 _: z

    # J& ]; v' l% I>>> def fun(name, *args):
    3 X" |9 Q& `8 m- Z5 k2 \...     print('你好:', name)
    # A2 B  y4 M' }* W" ?5 {! o...     for i in args:
    $ {; a& ^- g2 z: l" T  N( U$ t...         print("你的宠物有:", i)6 g4 M2 q, O2 ?0 a
    ... ' X6 S: u4 K' g4 W
    >>> fun("Geek", "dog", "cat")
    ! s) f) i, ?! _# @* N+ u( ]7 X7 ?  J你好: Geek
    9 I2 i. s" {0 W3 H& J你的宠物有: dog$ g' e- g; |6 _7 b& }! u* a; ?% M
    你的宠物有: cat
    7 V) z- m! d+ C, O7 E$ \使用 **kwargs) H. d5 P6 W8 b* I6 I* g

    " R1 M" N6 [7 `>>> def fun(**kwargs):7 g: v9 R* G* G4 D$ F
    ...     for key, value in kwargs.items():% q3 j5 n5 ~; H" S: u. n/ _- Y
    ...         print("{0} 喜欢 {1}".format(key, value))0 m" P( W0 W' Y
    ...
    " ]% `; M% J; J; l$ g" B* a3 B# d>>> fun(Geek="cat", cat="box"); ]. c  E, V; B: n0 W% V) r1 u
    Geek 喜欢 cat( C2 _& n3 F( i
    cat 喜欢 box
    % v& H% @. W; E, `8 Q% [3. 函数实参
    : |# E" k  P4 r% w7 C
    : U% q7 Q9 {6 d# }! p( }( }如果函数的形参是定长参数,也可以使用 *args 和 **kwargs 调用函数,类似对元组和字典进行解引用:) Y1 \9 c! R' C& e" y" T

    . I/ {8 P' p& _; s& ?$ u>>> def fun(data1, data2, data3):0 R9 b$ N; @, C; h
    ...     print("data1: ", data1)8 G+ @" E: \. ^
    ...     print("data2: ", data2): w: ]' a# w. J2 g0 ~$ \
    ...     print("data3: ", data3)  s: a; u, E. N9 o" S% c
    ... 5 D# V6 Y/ i; ?; H7 h  u. `
    >>> args = ("one", 2, 3)
    1 U+ D8 G: X/ o' W5 U/ m" l>>> fun(*args)$ E. s! \! f3 p& ~3 Q% |
    data1:  one
    1 F% Q! Z# U2 k8 gdata2:  2
    6 f) f; O3 p& v" W" ?" d5 X, @data3:  3
    ( J7 a: j+ e% U" k) y# r: m>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}/ f# h7 W8 h* c" u9 g
    >>> fun(**kwargs)7 t2 K; v# g" o) d+ X
    data1:  35 v; N+ k5 y1 `% [( o. N* |
    data2:  2
    1 \+ x$ t, v' n+ r! K! Bdata3:  one) L- H/ W  }5 `8 ?8 z4 N
    4. 序列解包
    & D' F  \! ?$ `
    & g- [$ Q$ v3 Y( A. w- V6 D: k! F序列解包 往期博客有写过,这里只列出一个例子,序列解包没有 **。
    3 s! ^! p% u6 O; ?* H
    ' W- `3 I% ^4 t+ T>>> a, b, *c = 0, 1, 2, 3  , Z; |! [5 d' U
    >>> a  5 P4 N' h. Y6 P& r4 i
    0  
    0 a* |9 V* t$ C1 h$ R# }>>> b  % O! W, j% f; ~0 U
    1  
    4 S7 |" s5 s* T$ k* M4 A>>> c  ' U' S# U- b0 C; S8 X
    [2,3]2 T/ y, v6 Y5 L* g5 m
    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, 2026-9-7 04:16 , Processed in 0.429774 second(s), 55 queries .

    回顶部