Python中函数调用时*和**的作用
8. Compound statements
If the form “*identifier” is present, it is initialized to a tuple receiving any excess positional parameters, defaulting to the empty tuple. If the form “**identifier” is present, it is initialized to a new ordered mapping receiving any excess keyword arguments, defaulting to a new empty mapping of the same type. Parameters after “*” or “*identifier” are keyword-only parameters and may only be passed used keyword arguments.若存在“*identifier”形式,则它被初始化成一个收取任何多出的位置形参的元组,默认是空元组。若存在“**identifier”形式,则它被初始化成一个收取任何多出的关键词实参的新映射,默认是同类型的新空映射。“*”或“*identifier”后的形参是仅限关键词的形参,而且只能用关键词实参传递。
6. Expressions - Python 3.6.2rc2 documentation
If the syntax *expression appears in the function call, expression must evaluate to an iterable. Elements from these iterables are treated as if they were additional positional arguments. For the call f(x1, x2, *y, x3, x4), if y evaluates to a sequence y1, ..., yM, this is equivalent to a call with M+4 positional arguments x1, x2, y1, ..., yM, x3
若语法 *expression 出现于函数调用中,则 expression 必须求值为可迭代(类型)。来自这些可迭代(类型)的元素被处理成如同它们是附加的位置实参。对于调用 f(x1, x2, *y, x3, x4) ,若 y 求值为序列 y1, ..., yM ,则这等价于有 M+4 个位置实参 x1, x2, y1, ..., yM, x3 的调用。
If the syntax **expression appears in the function call, expression must evaluate to a mapping, the contents of which are treated as additional keyword arguments. If a keyword is already present (as an explicit keyword argument, or from another unpacking), a TypeError exception is raised.
若语法 **expression 出现于函数调用中,则表达式必须求值为映射,其内容被当做附加的关键词实参。若以存在关键词(如显式关键词实参,或来自另一解包),则引发 TypeError 异常。
还有很多细节先不引用了……
简言之,函数头里的 * 和 ** 是把有对应参数以外的实参打包成一个形参。类似一个类型修饰符。
【Python中函数调用时*和**的作用】 而函数调用表达式里的 * 和 ** 则是把恰当类型的表达式解包成多个实参。类似一个运算符。
然后!
2. Built-in Functions
(iterable , * )
你引用的这东西根本就不是调用函数时的形式,它是函数调用方式的一个说明。
(我百度一下后发现这段是写在注释里的……)
实际调用时 default 和 key 不用方括号括着,也没有额外的逗号。
■网友
这也是python中非常有特色的,分两种情况讨论:
1、当*和**符号出现在函数定义的参数中时,表示任意数目参数收集。
先说说*,他是用元组的形式收集不匹配的位置参数。当这个函数调用时,python将所有位置相关的参数收集到一个新的元组中,并将这个元组赋值给变量args。def f(a,*args): print(args)f(1,2,3,4)(2, 3, 4)再说说**的特性,他只对关键字参数有效。在这种情况下,**允许将关键字参数转化为字典,你能够在之后使用键调用来进行步进或字典迭代def f(**kargs): print(kargs)f(a=1,b=2){\u0026#39;b\u0026#39;: 2, \u0026#39;a\u0026#39;: 1}最后我们来概况一下最一般的形式。即在函数头部能混合一般参数、*参数以及**去实现更加灵活的调用方式。
推荐阅读
- 怎样成为一名合格的Python程序员?
- python 爬虫,咋获得输入验证码之后的搜索结果
- python的html5lib这个库咋使用啊我在网上也没有找到相关文档
- win7中本地连接跟无线网卡同时使用时是怎么样的模式
- 零基础入门学习啥语言好
- Python3.4和3.5区别大么
- python 中 def_():...... return _有啥作用
- 新互联网网站用Java还靠谱么对比Php,Python,Ruby的话
- 30岁男,创业失败转行学python,是否很晚?也不好找工作?
- Python 的开发速度比 C#.net 或 Vb.net 更快吗?
