参数匹配模型——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学习之参数(二)相关推荐

  1. 参数匹配顺序——Python学习之参数(三)

    参数匹配顺序--Python学习之参数(三) 文章目录 参数匹配顺序--Python学习之参数(三) 函数参数匹配表 参数匹配顺序 keyword-only 参数的位置 参考资料 这篇博文是对上一篇博 ...

  2. Python学习之参数(一)

    Python学习之参数(一) 文章目录 Python学习之参数(一) 参数的传递 避免可变参数的修改 参考资料 参数的传递 所有的参数实际上都是通过指针进行传递的.作为参数被传递的对象从来不自动拷贝. ...

  3. Python学习笔记(二):标准流与重定向

    Python学习笔记(二):标准流与重定向 - SamWei - 博客园 Python学习笔记(二):标准流与重定向 Posted on 2012-02-19 22:36 SamWei 阅读(176) ...

  4. Python学习笔记(二)——Python基本图形绘制

    Python学习笔记(二)--Python基本图形绘制 文章目录 Python学习笔记(二)--Python基本图形绘制 不同编程语言的初心和适用对象 Python蟒蛇绘制 五星红旗绘制 这次笔记主要 ...

  5. python学习笔记(二)之列表

    python学习笔记(二)之列表 说明:列表是python的苦力 特点:列表是可以修改的.这种修改,不是复制一个新的,而是在原地进行修改.append()和extend() 常用的列表函数:appen ...

  6. GUI的演化和python编程——Python学习笔记之二十二

    GUI的演化和python编程--Python学习笔记之二十二 写完了有关长寿的两篇博文,本该去完成哥德尔那个命题六的.对计算机图形界面的好奇,让我把注意力暂时离开那个高度抽象难读的哥德尔,给转到计算 ...

  7. 第四单元 用python学习微积分(二十七)积分-部分分式-分部积分

    本文内容来自于学习麻省理工学院公开课:单变量微积分-分部积分-网易公开课 开发环境准备:CSDN 目录 一.多项式部分分式方法求积分 1.效果 2.步骤 (1)  长除法 (2)  分解因式 (fac ...

  8. python参数类型_Python 参数类型和参数匹配模型

    Python 方法的参数种类有很多,而不是通常语言定义的那样, Python 方法的传参能力要比想象的强大很多.很多初学者可能对一些库中带 * 带 ** 的参数类型非常奇怪,但是其实这些语法正是保证 ...

  9. Python函数参数匹配模型(上)

    概述 Python3中函数参数一般都是通过赋值进行传递的,而调用者只需要知道如何正确的传递参数即可直接使用函数, 位置参数 即我们使用最频繁的参数传递方法,通过参数的默认位置从左到右进行匹配 def ...

最新文章

  1. vue 怎么全局到入常量_vue定义全局变量和全局方法的方法示例
  2. 在职计算机答辩没有通过,在职研究生论文答辩没通过可以重新申请吗?
  3. 报表移动端app如何实现页面自适应?
  4. .NET 指南:实现 Equals 方法
  5. 科目三场外考试易出错的环节
  6. 海王什么意思,海王是什么意思梗,网络流行词海王介绍
  7. 语音情感识别研究进展综述
  8. Python实现中文转化为对应的拼音以及拼音转化为相应的中文
  9. 【滤波器】基于matlab低通滤波器(LPF)设计【含Matlab源码 323期】
  10. 再谈Redis应用场景
  11. Gradle全版本资源下载
  12. 由于ORACLE_SID未设定造成的ora-12162 错误
  13. 测试睡眠质量软件,测睡眠质量的app排行榜:推荐10款有趣又有效的睡眠APP
  14. linux下打开xls文件怎么打开方式,xls是什么文件格式?xls文件怎么打开?
  15. Ansible最佳实践之委派任务和事实
  16. 迅捷网络路由器服务器无响应怎么办,迅捷(FAST)300M无线路由器设置后不能上网怎么办?...
  17. MSDC 4.3 接口规范(5)
  18. 用 Python 创建属于自己的网易云音乐
  19. lect02_project
  20. 我们说的那些培训班,到底要不要报?自学编程VS培训报班

热门文章

  1. NYOJ 题目68 三点顺序
  2. Arrays(Chapter 6 of JavaScript: The Good Parts)
  3. Git初始配置【一】
  4. springboot系列八、springboot整合kafka
  5. ARC 100 C - Linear Approximation题解---三分法
  6. iis 防火墙防止恶意ip攻击
  7. 正则表达式 2. 单字符或
  8. 为何被主流抛弃-江西IDC机房价格为何居高不下缺少竞争力-2014年5月江西IDC排行榜...
  9. 【linux】虚拟机安装centos后ping ip地址出现错误:Network is unreachable
  10. 财务管理的革新带动财务软件的变革