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

按照顺序,给没有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对参数进行赋值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Silverlight 写了一个2D仿3D的柱状图表

技术上主要用了上一篇博客里关于自定义控件的绑定解决方案,然后就是在blend里做一些简单的颜色动画的调整。 先传个效果出来: 转载于:https://www.cnblogs.com/v-jing/archive/2011/12/01/2270918.html

认识Web.config文件

Web.config文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。当你通过VB.NET新建一个Web应用程序后,默认情…

labview在2048中添加时间滚动条_Chrome优化深色模式:滚动条颜色也能跟随变化 使上网更具沉浸感...

为了让谷歌浏览器的深色模式(Dark Mode)变得更加一致,谷歌在 Chrome 的滚动条中添加了对深色模式的支持。虽然我们很多人在上网过程中可能不太关注滚动条,但这毕竟是个可喜的变化,从而让 Chrome 的深色模式更具沉浸感。滚动条并不跟随网页浏览…

linux环境安装tomcat8,启动时,报not touch:/user/tomcat/tomcat8/logs/catalina.out:not a file or directory...

问题原因:我的jdk和tomcat都放在root目录下新建的user目录中,但是在配置JAVA_HOME时,路径没有配对。配置如下: export JAVA_HOME/user/jdk/jdk1.7.0_80 export JRE_HOME/user/jdk/jdk1.7.0_80/jre export CLASSPATH.:$JAVA_HOME/l…

中国软件20年,向金山和中国软件英雄致敬!

原文题目:中国软件20年,向金山和不能忘却的中国软件英雄致敬! 12日,“中国软件20年,知识英雄再聚首”高峰论坛于在北京召开。此次活动原本是由金山软件发起组织,是金山20周年庆典活动的重要组成部分。但是活…

python prettytable_让python的print变得更好看——prettytable和colorama

【小宅按】python在输出信息的时候,通常会使用print,有没有方法可以美化一下输出的格式呢?这里介绍两个包:prettytablecolorama这两个包都不是Python的标准库,因此在使用之前,需要安装它们。pip install pr…

[html] 你有使用过output标签吗?说说它的用途有哪些?

[html] 你有使用过output标签吗?说说它的用途有哪些? 执行计算然后在 元素中显示结果个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

rational rose 逆向工程

这一节主要介绍用户如何使用Rose的逆向工程生成UML模型,并用来进行C代码的结构分析。 Rational Rose可以支持标准C和Visual C的模型到代码的转换以及逆向工程。下面将详细地说明这两种C project的逆向工程的步骤和具体操作。 2.1 ANSI C(标准C&#xff0…

springboot指定注解扫描范围

springboot注解扫描范围是由ComponentScan指定的;默认情况下为启动程序所在目录及其子包; 如果需要指定扫描路径,在启动程序中添加修改 ComponentScan(basePackages{"org.jstudio.a","org.jstudio.b"}) SpringBootApplication public class xxx…

rabbitmq中默认unack超时时间_RabbitMQ 与 Kafka 的技术差异以及使用注意点

导言作为一个有丰富经验的微服务系统架构师,经常有人问我,“应该选择RabbitMQ还是Kafka?”。基于某些原因, 许多开发者会把这两种技术当做等价的来看待。的确,在一些案例场景下选择RabbitMQ还是Kafka没什么差别&#x…

[html] 你有使用过meter标签吗?说说它的用途有哪些?

[html] 你有使用过meter标签吗&#xff1f;说说它的用途有哪些&#xff1f; <meter> 标签定义已知范围或分数值内的标量测量。也被称为 gauge&#xff08;尺度&#xff09;。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持…

Linux环境安装zookeeper3.5.5后,总是启动不了

问题原因&#xff1a;我的jdk是1.7的&#xff0c;刚开始安装完zookeeper3.5.5之后&#xff0c;总是启动不了。查看所有的配置信息都没有问题。最后怀疑是jdk版本和zookeeper3.5.5不兼容&#xff0c;所以换了一个zookeeper3.4.14&#xff0c;终于启动成功了。好坑&#xff0c;就…

五桌面工具来创建优秀的Windows环境

很多工具并不实用&#xff0c;都说能解压文件什么的&#xff0c;今天我给你们几个牛逼的 文件修复 文件修复软件是一个功能强大的工具来修复损坏的文件。它可以扫描损坏的文件&#xff0c;并提取到一个新的可用文件的最大数据。您可以修复Word文档&#xff0c;Excel电子表格&am…

wxpython下载很慢_为什么WxPythons运动检测速度如此之慢?

我设置on_motion来处理EVT_MOTION.我希望鼠标位置以交互方式生成特定于坐标的图像,但是WxPython在注册连续的运动事件时有大约400ms的延迟.这使界面变得迟钝.为什么EVT_MOTION如此缓慢以及如何解决&#xff1f;我在Ubuntu 11.10和WinXP中试过它,延迟是可比的吗&#xff1f;我需…

假设以邻接矩阵作为图的存储结构_图的存储

因为图的结构特点&#xff0c;使得其在存储、遍历也相对复杂一些。邻接矩阵存储图最简单的方式就是将图的顶点用一维数组存储进来&#xff0c;然后将边信息存储在二维矩阵中&#xff0c;这两个数组合称为图的邻接矩阵&#xff08;Adjacency Matrix&#xff09;。无向图的邻接矩…

博客主题正在修改....

博客主题正在修改.... 转载于:https://www.cnblogs.com/lingqingxue/p/11330198.html

哎呀!小晖

哎呀&#xff01;丁俊晖又输了&#xff0c;怎么一看丁俊晖的比赛&#xff0c;他就得不了冠军呢&#xff01;不过输给了萝卜丝&#xff0c;不算丢人。 这次英锦赛傅家俊&#xff0c;虽然和小晖一样止步于八强&#xff0c;但发挥的很不错了&#xff0c;终于走出了低迷&#xff0c…

python中ndarray对象实例化_Python数据分析之Numpy学习 2——NumPy 基础 ndarray对象

Python数据分析之Numpy学习 2 —— NumPy 基础学习NumPy(Numerical Python)是高性能科学计算和数据分析的基础包。NumPy的主要对象是同构数据多维容器(homogeneous multidimensional array)——ndarray&#xff0c;也就是说每一个ndarray都是一个相同类型元素组成的表格(二维)。…

PHP常见设计模式

简单工厂<?php# 简单工厂abstract class mycoach{public function __construct(){}}class cultivatecpc extends mycoach{public function __construct(){echo "把陈培昌培养为搏击教练"."\n";}}class cultivatecj extends mycoach{public function __…

[html] 如何使用html5进行图片压缩上传?

[html] 如何使用html5进行图片压缩上传&#xff1f; 1.获取到图片的base64格式&#xff1b; 2.图片加载完成后&#xff0c;把图片转化为canvas&#xff1b; 3.使用canvas的toDataURL按照自己的需要进行压缩&#xff1b; 4.把dataURL转化成blob对象&#xff1b; 5.把blob对象转…