百科问答小站 logo
百科问答小站 font logo



Python函数中*和**的内涵究竟是什么呢? 第1页

  

user avatar   pengwk 网友的相关建议: 
      

这个问题基本弄清楚了,星号(asterisk)主要在函数定义和函数调用的时候使用。

  1. 函数定义时
    1. 使用单个*会将所有的参数,放入一个元组(tuple)供函数使用。
    2. 使用两个 **会将所有的关键字参数,放入一个字典(dict)供函数使用。
  2. 函数调用时
    1. 在list,tuple,set前加一个星号会把容器中的所有元素解包(unpack)变成位置参数。
    2. 在dict前加一个星号会把字典的键变成位置参数。
    3. 在dict前加两个星号会把字典的键值对变成关键字参数。
      a={'a':'Ass','b':'We','c':'Can'}

具体到描述中的函数:

Aniki(*a)

等同于Aniki("a", "b", "c")

Aniki(**a)

等同于 Aniki(a="Ass", b="We", c="Can")

Aniki(**a,b=(1,2))

等同于 Aniki(a="Ass", b="We", c="Can",b=(1,2))


希望说清楚了。

Stack Overflow上这个问题的回答更全面,提到了星号的其他作用,推荐看一看What does ** (double star/asterisk) and * (star/asterisk) do for parameters?


Python3中新增的两种用法:

  1. Keyword-Only Arguments 仅关键字参数
  2. Extended Iterable Unpacking 扩展迭代解包

仅关键字参数

*args后加入关键字参数,就可以要求这个参数必须以关键字的方式赋值。

       def keyword_only(a, *args, b):     print[a, args, b]     

在调用的时候,必须用关键字的方式赋值。单个星号*也有相同作用,只不过不能接收无限位置参数了。

       def keyword_only(a, *, b):    print[a, args, b]     

扩展迭代解包

许多算法要求以第一个元素剩下的全部 这种方式分割一个序列。即

       first, rest = seq[0], seq[1:]     

现在可以这样:

       first, *rest = seq     

或者这样:

       a, *b, c = seq     

a取得第一个元素,c取得最后一个元素,b取得剩下的全部。

PEP文档:

  1. PEP 3102 -- Keyword-Only Arguments
  2. PEP 3132 -- Extended Iterable Unpacking

可以用这个在线的Python3解释器试一试,Online Python3 Compiler - Online Python3 Editor - Online Python3 IDE - Python3 Coding Online - Practice Python3 Online - Execute Python3 Online - Compile Python3 Online - Run Python3 Online




  

相关话题

  Python中一个字符串的所有字母用它的后继字母代替(比如,a用b代替,b用c代替),怎么搞? 
  python如何理解map,reduce,filter? 
  如何用python来统计MacPro的圆圈个数? 
  为什么人工智能用 Python? 
  如何看待物理学家 Lee Phillips 对 Python 的批评? 
  Python有哪些杀手级超厉害框架或库或应用? 
  Python中一个字符串的所有字母用它的后继字母代替(比如,a用b代替,b用c代替),怎么搞? 
  各个编程语言都有哪些「亮点」? 
  零基础如何学爬虫技术? 
  我想学Python,结果买了Python3.4.3的书,可以在Python3.6.4上用吗? 

前一个讨论
马化腾给 3300 名员工发价值11 亿股份,对员工能带来多大激励效果?为什么各大厂纷纷提升福利待遇?
下一个讨论
生化环材四大天坑,来说说毕业都干了啥,天坑专业的封顶是干啥?





© 2024-12-26 - tinynew.org. All Rights Reserved.
© 2024-12-26 - tinynew.org. 保留所有权利