按照顺序,给没有key的参数赋值,意味着传递参数时,需按顺序匹配的参数必须出现在按key匹配的参数之前;

给按照key匹配的参数赋值;

将多余的按照顺序匹配但未匹配的参数值归入*name的tuple中;

将多余未匹配上的按照key进行匹配的参数值归入**name的dict对象中;

将为匹配上的且具有默认值的参数赋默认值

二、按key匹配参数

对于C、C++这种语言,在调用函数时,系统会首先将函数地址压入堆栈,其次按参数的从右往左的顺序,一次压入堆栈。因此,C、C++这种语言它们只支持按顺序匹配形参。而python的做法不同,参数除了可以按顺序匹配,还可以按照参数名称来匹配。如:

def func(name, age):

print(name, age)

对于这个函数,以下的调用时等价的:

func('rechar', 27)    #按顺序匹配

func(name = 'rechar', age = 27)    #按参数名称匹配,在运行时告诉系统参数name的值为‘rechar’,age的值为27

func(age = 27, name = 'rechar')    #按参数名称匹配

func('rechar', age = 27)    #name是按顺序匹配,age按名称匹配

在python中,当按照参数名称进行匹配参数是,参数传递的顺序是可以任意的,不要求按照函数定义中参数的顺序进行传递。在使用名称匹配时,如果需要混合使用按顺序匹配规则,则按顺序匹配的参数必须出现在按key匹配的参数前,否则会报错:

func(name = 'rechar', 27)

以上调用会报如下错误:

三、函数定义中的”*name“

python在给按顺序匹配和按key匹配的参数赋完值后,如果发现调用者传入的参数仍有未匹配上的会发生什么情况呢?看一下下面的例子:

func('rechar', 27, 32)

运行时我们看到如下错误:

Traceback (most recent call last):

File "E:\tmp\tt.py", line 5, in

func('rechar', 27, 32)

TypeError: func() takes 2 positional arguments but 3 were given

哦,python会抱怨我们传递的参数太多了。那如果确实在一些情况下,我们无法保证传递的参数数量一定和函数需要的参数数相等怎么办呢?这是就是*iterable这种参数该登场的时候了,假如在定义函数定义是,我们增加了一个参数,这个参数以一个”*“开始,那么这个参数实际上是一个tuple类型。假如传递的参数比需要的多,那那些多余的参数会被放入这个tuple中。例如,

def func(name, age, *other):

print(name, age, other)

那么,

func('rechar', 27, 32)

这个调用的输出如下:

>>> rechar 27 (32,)

四、函数定义中的”**name“

python在将所有未匹配上的非按名称匹配的参数装入参数中的tuple之后,假如还有未匹配上的按名称匹配的参数那情况会怎样呢?首先来看一下下面的示例:

def func(name, age):

print(name, age)

func(name = 'rechar', age = 27, pay='1800')

执行时,python又抱怨了:

Traceback (most recent call last):

File "E:\tmp\tt.py", line 5, in

func(name = 'rechar', age = 27, pay='1800')

TypeError: func() got an unexpected keyword argument 'pay'

它说func这个函数没有名称为”pay“的参数,这种情况或许出现在我们函数重构之后,原来函数时有这个参数的。而这个函数调用可能在别处没有被修改。假设即使给了”pay“这个参数,程序的正确性不受影响,没错,这就是”**name“参数的用武之地了。

假如在函数定义中,给函数增加一个以”**“开头的参数,那么这个参数实际上是一个dict对象,它会将参数调用中所有没有被匹配的按名称传递的参数都放入这个dict中。例如,

def func(name, age,**other):

print(name, age, other)

func(name = 'rechar', age = 27, pay='1800')

那么运行结果输出,

rechar 27 {'pay': '1800'}

看到了吧,这里的other就将没有匹配的”pay=‘1800’“收入囊中了。

五、规定调用必须按名称匹配

当我们在定义函数时,如果第一个参数就是”*name“参数,那么可想而知,我们无法使用按顺序匹配的方式传递,因为所有的按顺序传递的参数值最终的归宿都会是这里的tuple当中。而为了给后续的参数传递值,我们只能使用按名称匹配的方法。

六、”**“参数只能出现在最后一个形参之后

想想为什么?其实很好理解,因为出现在”**“形参之后的形参,无论使用按顺序传递还是按名称传递,最终都无法到达参数值真正应该需要到的地方。所以python规定,如果需要”**“参数,那它必须是最后一个形参。否则python会报语法错误。

七、函数调用中的”*“

在表格中我们看到了有func(*iteratable)的调用,这个调用的意思是,iteratable必须是一个可迭代的容器,比如list、tuple;作为参数传递值,它最终传递到函数时,不是以一个整体出现,而是将其中的元素按照顺序传递的方式,一次赋值给函数的形参。例如,

li = ['rechar', 27]

func(*li)

这个函数调用与

func('rechar', 27)

是等价的。

八、函数调用中的”**“

知道”*“在函数调用中的效果之后,也就很好理解”**“的作用了。它是将传递进来的dict对象分解,每一个元素对应一个按名称传递的参数,根据其中的key对参数进行赋值。

python语句中对象未被定义_python 形参没有被定义???感觉遇到鬼了。。。相关推荐

  1. python循环语句-python语句中Python循环语句(附代码)

    python语句多如牛毛,对于很多初学者来说,不知道该如何下手.今天本文将着重讲述python语句中for语句和while语句.都知道这2种语句都属于循环语句,for语句属于遍历循环,while语句属 ...

  2. python非法的_在下列Python语句中非法的是________。

    [判断题]Directions: The following exercises will test your understanding of the concepts of critical th ...

  3. python中24≤2825是否合法_在下列Python语句中非法的是() (2.0分)_学小易找答案

    [其它]统计一个文件中的字符数.单词数(单词由空格分隔)和行数,并将某个指定的字符串从该文件中所有出现的地方删除.程序应提示用户输入指定的文件名和要删除的字符串. [单选题]在下列Python语句中非 ...

  4. python语句中end=‘ ‘的作用

    python语句中end=' '的作用 print默认是打印一行,结尾加换行.end=' '意思是末尾不换行,加空格.空格数取决于引号里面的空格数 如下举例说明: 不加end="" ...

  5. python的for语句中i未被定义_python – PyLint:使用可能未定义的循环变量警告

    阅读this question后,我可以理解为什么可能输出这个警告,但是当循环变量不能被定义时我有一个特定的情况-- for i in range(0, 2): print i print i PyL ...

  6. python的for语句中i未被定义_独特的python循环语句

    1.局部变量 for i in range(5): print i, print i, 运行结果: 0 1 2 3 4 4 i是for语句里面的局部变量.但在python里面,在同一方法体内,定义了一 ...

  7. Python如何在循环语句中加入两个变量_Python基础知识

    一.Python关键字 共:31个.注意:如果要现在自己电脑中运行我写的这些代码,需要在第一行加上 #coding:utf-8,因为我的输出中有中文.1.and:表示逻辑'与'2.del:用于list ...

  8. python中def之间变量传递_Python def函数的定义、使用及参数传递实现代码

    Python编程中对于某些需要重复调用的程序,可以使用函数进行定义,基本形式为: def 函数名(参数1, 参数2, --, 参数N): 执行语句函数名为调用的表示名,参数则是传入的参数,可以更具需要 ...

  9. python缩进可以用在任何语句之后_Python程序中,缩进表达所属关系,在缩进的前一行最后,需要使用符号 Python 语句中增...

    Python程序中,缩进表达所属关系,在缩进的前一行最后,需要使用英文冒号 : 符号. 缩进在python代码中的重要性,缩进不规范程序就不能运行.这也是python比其他编程语言简单的地方,用缩进来 ...

最新文章

  1. AI一分钟|特斯拉宣布裁员9%;Facebook启动隐私设计实验室;百度Apollo与宝马拜腾联姻...
  2. Scala关系运算符的一览图
  3. C++多态案例二-制作饮品
  4. [置顶] 总结工作中常用到的linux命令
  5. java 识别手机_java – 如何识别手机闲置?
  6. python- 属性 静态方法,类方法
  7. 【剑指offer】Java版代码(完整版)
  8. 《游戏设计师修炼之道:数据驱动的游戏设计》一1.4 来自政府和产业的挑战...
  9. Springboot 整合CXF框架
  10. 移动前端开发之viewport的深入理解
  11. (二)Java并行程序基础
  12. w13scan 扫描器的安装及应用
  13. Cesium各类实体的添加
  14. 知道python程序设计基础期末答案_Python程序设计基础_知到答案章节作业期末答案...
  15. CSS3 弹性布局/伸缩布局 flex
  16. Linux I2C驱动框架(超详细)
  17. 人工智能在绘画方面傻瓜相机_傻瓜智能合约
  18. 电路图上的DNP是什么意思
  19. c语言10个选手10个评委,求教C语言题:在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。...
  20. Cesium基础知识-创建图层

热门文章

  1. 开源cms - 资料收集
  2. 移动端适配(必须要知道的,亲测有效)
  3. path.join 和 path.resolve的区别
  4. Springboot 2.x版本 RedisCacheManager 类的配置,【与1.x 略有不同】
  5. 单硬盘上mac + win7双系统,GUID-GPT分区
  6. 电脑延迟关机命令Shutdown详解
  7. [转]给控件做数字签名
  8. Android项目目录结构
  9. I/O多路转换 select
  10. Leetcode刷题(2)回文数