参数匹配模型——Python学习之参数(二)
参数匹配模型——Python学习之参数(二)
文章目录
- 参数匹配模型——Python学习之参数(二)
- 位置参数:从左至右进行匹配
- 关键字参数:通过参数名进行匹配
- 默认参数:为没有传入值的参数定义参数值
- 可变参数:收集任意多于基于位置或关键字的参数
- 可变参数解包:传递任意多的基于位置或关键字的参数
- Keyword-only参数:参数必须按照名称传递
- 参考资料
位置参数:从左至右进行匹配
一般情况下,也是我们最常使用的那种方法,通过位置进行匹配,把参数值传递给参数头部的参数名称,匹配顺序从左到右。
例如:
def func(name, father_name):print("%s's father is %s"%(name, father_name))func('Xiaowang', 'Laowang')
func('Laowang', 'Xiaowang')
运行结果是:
Xiaowang's father is Laowang
Laowang's father is Xiaowang
关键字参数:通过参数名进行匹配
调用者可以定义哪一个参数接受这个值,通过在调用时使用参数的变量名,即 name=value
这种语法。
例如:
def func(name, father_name):print("%s's father is %s"%(name, father_name))func(name='Xiaowang', father_name='Laowang')
func(father_name='Laowang', name='Xiaowang')
运行结果是:
Xiaowang's father is Laowang
Xiaowang's father is Laowang
默认参数:为没有传入值的参数定义参数值
如果调用时传入的值过于少的话,函数能够为参数指定默认值,这里再次使用语法 name=value
.
例如:
def func(name, age=10):print("%s's age is %d"%(name, age))func('Wang', 20)
func('Wang') # age使用默认值10
运行结果是:
Wang's age is 20
Wang's age is 10
可变参数:收集任意多于基于位置或关键字的参数
如果参数名称以字符*
开头,则表示收集任意多的额外参数(这个特性常常叫做可变参数)。
例如:
def print_params(*params): print(params)
这里好像只指定了一个参数,但它前面有一个星号。这是什么意思呢?尝试使用一个参数来调用这个函数,看看结果如何。
>>> print_params('Testing')
>>> ('Testing',)
注意到打印的是一个元组,因为里面有一个逗号。也就是说前面有星号的参数将被放在元组中?咱们再试试。
>>> print_params(1, 2, 3)
(1, 2, 3)
可见,参数前面的星号将提供的所有值都放在一个元组中,也就是将这些值收集起来。
再看一个例子:
def print_params_2(title, *params): print(title) print(params)
>>> print_params_2('Params:', 1, 2, 3)
Params:
(1, 2, 3)
因此星号意味着收集余下的位置参数。如果没有可供收集的参数,params将是一个空元组。
>>> print_params_2('Nothing:')
Nothing:
()
带星号的参数也可放在其他位置(而不是最后),但不同的是,在这种情况下你需要做些额外的工作:使用名称来指定后续参数。
>>> def in_the_middle(x, *y, z):
... print(x, y, z)
...
>>> in_the_middle(1, 2, 3, 4, 5, z=7)
1 (2, 3, 4, 5) 7
>>> in_the_middle(1, 2, 3, 4, 5, 7)
Traceback (most recent call last): File "<stdin>", line 1, in <module>
TypeError: in_the_middle() missing 1 required keyword-only argument: 'z'
第9行的keyword-only argument
后文会讲。
星号不会收集关键字参数。
def print_params_2(title, *params): print(title) print(params)
>>> print_params_2('Hmm...', something=42)
>>> Traceback (most recent call last):
>>> File "<stdin>", line 1, in <module>
>>> TypeError: print_params_2() got an unexpected keyword argument 'something'
要收集关键字参数,可使用两个星号。
>>> def print_params_3(**params):
... print(params)
...
>>> print_params_3(x=1, y=2, z=3)
{'z': 3, 'x': 1, 'y': 2}
如你所见,这样得到的是一个字典而不是元组。
可变参数解包:传递任意多的基于位置或关键字的参数
调用者能够再使用*
语法将参数集合打散,分成参数。这个*
与在函数头部的*
恰恰相反:在函数头部它意味着收集任意多的参数,而在调用者中意味着参数解包。
例如,我们能够通过一个元组给一个函数传递4个参数。
>>> def func(a, b, c, d):
... print(a, b, c, d)
...
>>> args = (1, 2, 3, 4)
>>> func(*args)
1 2 3 4
类似地,如果在调用函数时,**会以键值对的形式解包一个字典,使其成为关键字参数。
>>> def func(a, b, c, d):
... print(a, b, c, d)
...
>>> args = {'a':2, 'b':4, 'c':6, 'd':8}
>>> func(**args)
2 4 6 8
提示
不要混淆函数头部或函数调用时
*
或者**
的语法:在函数头部它意味着收集任意数量的参数,在函数调用时,它解包任意数量的参数。
Keyword-only参数:参数必须按照名称传递
Python3.0 把函数头部的排序规则通用化了,允许我们指定 keyword-only 参数,即必须只按照关键字传递并且不会由一个位置参数来填充的参数。
从语法上讲, keyword-only 参数编码为命名的参数,出现在参数列表中的 *args 之后,所有这些参数都必须在调用中使用关键字语法来传递。例如,在下面的代码中, a 可能按照名称或者位置来传递,b 收集任何额外的位置参数,并且 c 必须只按照关键字传递:
>>> def kwonly(a, *b, c):print(a, b, c)
>>> kwonly(1, 2, c=3)
1 (2,) 3
>>> kwonly(a=1, c=3)
1 () 3
>>> kwonly(1, 2, 3)
TypeError: kwonly() missing 1 required keyword-only argument: 'c'
我们也可以在参数列表中使用一个*
字符,来表示一个函数期待跟在*
后面的所有参数都作为关键字参数传递。在下面的例子中,a 可能按照位置或者名称传递,但是 b 和 c 必须按照关键字传递。
>>> def kwonly(a, *, b, c):print(a, b, c)
>>> kwonly(1, c=3, b=2)
1 2 3
>>> kwonly(c=3, b=2, a=1)
1 2 3
>>> kwonly(1, 2, 3)
TypeError: kwonly() takes 1 positional argument but 3 were given
>>> kwonly(1)
TypeError: kwonly() missing 2 required keyword-only arguments: 'b' and 'c'
仍然可以对 keyword-only 参数使用默认值,即便它们出现在函数头部中的*后面。在下面的例子中,a 可能按照名称或位置传递,而 b 和 c 是可选的,但是如果使用的话必须按照关键字传递。
>>> def kwonly(a, *, b='spam', c='ham'):print(a, b, c)
>>> kwonly(1)
1 spam ham
>>> kwonly(1, c=3)
1 spam 3
>>> kwonly(a=1)
1 spam ham
>>> kwonly(c=3, b=2, a=1)
1 2 3
>>> kwonly(1, 2)
TypeError: kwonly() takes 1 positional argument but 2 were given
实际上,带有默认值的 keyword-only 参数是可选的,但是,那些没有默认值的 keyword-only 参数真正地变成了函数必须的 keyword-only 参数。咱们再看几个例子:
>>> def kwonly(a, *, b, c='spam'):print(a, b, c)
>>> kwonly(1, b='eggs')
1 eggs spam
>>> kwonly(1, c='eggs')
TypeError: kwonly() missing 1 required keyword-only argument: 'b'
>>> kwonly(1, 2)
TypeError: kwonly() takes 1 positional argument but 2 were given
>>> def kwonly(a, *, b=1, c, d=2):print(a, b, c, d)
>>> kwonly(3, c=4)
3 1 4 2
>>> kwonly(3, c=4, b=5)
3 5 4 2
>>> kwonly(3)
TypeError: kwonly() missing 1 required keyword-only argument: 'c'
>>> kwonly(1, 2, 3)
TypeError: kwonly() takes 1 positional argument but 3 were given
相关文章:Python学习之参数(一)
参考资料
《Learning Python,5th Edition》
《Python基础教程》人民邮电出版社,第3版
参数匹配模型——Python学习之参数(二)相关推荐
- 参数匹配顺序——Python学习之参数(三)
参数匹配顺序--Python学习之参数(三) 文章目录 参数匹配顺序--Python学习之参数(三) 函数参数匹配表 参数匹配顺序 keyword-only 参数的位置 参考资料 这篇博文是对上一篇博 ...
- Python学习之参数(一)
Python学习之参数(一) 文章目录 Python学习之参数(一) 参数的传递 避免可变参数的修改 参考资料 参数的传递 所有的参数实际上都是通过指针进行传递的.作为参数被传递的对象从来不自动拷贝. ...
- Python学习笔记(二):标准流与重定向
Python学习笔记(二):标准流与重定向 - SamWei - 博客园 Python学习笔记(二):标准流与重定向 Posted on 2012-02-19 22:36 SamWei 阅读(176) ...
- Python学习笔记(二)——Python基本图形绘制
Python学习笔记(二)--Python基本图形绘制 文章目录 Python学习笔记(二)--Python基本图形绘制 不同编程语言的初心和适用对象 Python蟒蛇绘制 五星红旗绘制 这次笔记主要 ...
- python学习笔记(二)之列表
python学习笔记(二)之列表 说明:列表是python的苦力 特点:列表是可以修改的.这种修改,不是复制一个新的,而是在原地进行修改.append()和extend() 常用的列表函数:appen ...
- GUI的演化和python编程——Python学习笔记之二十二
GUI的演化和python编程--Python学习笔记之二十二 写完了有关长寿的两篇博文,本该去完成哥德尔那个命题六的.对计算机图形界面的好奇,让我把注意力暂时离开那个高度抽象难读的哥德尔,给转到计算 ...
- 第四单元 用python学习微积分(二十七)积分-部分分式-分部积分
本文内容来自于学习麻省理工学院公开课:单变量微积分-分部积分-网易公开课 开发环境准备:CSDN 目录 一.多项式部分分式方法求积分 1.效果 2.步骤 (1) 长除法 (2) 分解因式 (fac ...
- python参数类型_Python 参数类型和参数匹配模型
Python 方法的参数种类有很多,而不是通常语言定义的那样, Python 方法的传参能力要比想象的强大很多.很多初学者可能对一些库中带 * 带 ** 的参数类型非常奇怪,但是其实这些语法正是保证 ...
- Python函数参数匹配模型(上)
概述 Python3中函数参数一般都是通过赋值进行传递的,而调用者只需要知道如何正确的传递参数即可直接使用函数, 位置参数 即我们使用最频繁的参数传递方法,通过参数的默认位置从左到右进行匹配 def ...
最新文章
- vue 怎么全局到入常量_vue定义全局变量和全局方法的方法示例
- 在职计算机答辩没有通过,在职研究生论文答辩没通过可以重新申请吗?
- 报表移动端app如何实现页面自适应?
- .NET 指南:实现 Equals 方法
- 科目三场外考试易出错的环节
- 海王什么意思,海王是什么意思梗,网络流行词海王介绍
- 语音情感识别研究进展综述
- Python实现中文转化为对应的拼音以及拼音转化为相应的中文
- 【滤波器】基于matlab低通滤波器(LPF)设计【含Matlab源码 323期】
- 再谈Redis应用场景
- Gradle全版本资源下载
- 由于ORACLE_SID未设定造成的ora-12162 错误
- 测试睡眠质量软件,测睡眠质量的app排行榜:推荐10款有趣又有效的睡眠APP
- linux下打开xls文件怎么打开方式,xls是什么文件格式?xls文件怎么打开?
- Ansible最佳实践之委派任务和事实
- 迅捷网络路由器服务器无响应怎么办,迅捷(FAST)300M无线路由器设置后不能上网怎么办?...
- MSDC 4.3 接口规范(5)
- 用 Python 创建属于自己的网易云音乐
- lect02_project
- 我们说的那些培训班,到底要不要报?自学编程VS培训报班
热门文章
- NYOJ 题目68 三点顺序
- Arrays(Chapter 6 of JavaScript: The Good Parts)
- Git初始配置【一】
- springboot系列八、springboot整合kafka
- ARC 100 C - Linear Approximation题解---三分法
- iis 防火墙防止恶意ip攻击
- 正则表达式 2. 单字符或
- 为何被主流抛弃-江西IDC机房价格为何居高不下缺少竞争力-2014年5月江西IDC排行榜...
- 【linux】虚拟机安装centos后ping ip地址出现错误:Network is unreachable
- 财务管理的革新带动财务软件的变革