百科问答小站 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是儿童才学的低端编程? 
  知乎上这么多推崇学 Python 入 IT 行的,如果他们学完 Python 这一套找不到工作怎么办? 
  对于学习代码困难的人来说,应该如何学习代码比较合适? 
  在2019年这个时候,总体而言,Python程序员是不是编程水平最差的程序员? 
  你写过哪些真正生产可用的 Python 装饰器? 
  如何看待 PyPy 与 Pyston 的未来? 
  有什么好的自学 Python 的书籍推荐? 
  Python是不是被严重高估了? 
  Python 怎么二次封装一个系统函数? 
  站在 2020 年回看,如何评价 Python 2 到 3 的升级? 

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





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