在之前的章节中,针对各类对象调用了非常多的函数,这些都是Python的内建函数。这些函数的功能都是预先设计好的,但在实际生产过程中,使用最多的还是自定义函数。
创建函数的目的是封装业务逻辑,实现代码的重用。本小节主要介绍如何创建和调用函数。
1.创建函数
一个完整的函数由函数名、参数列表、返回值构成。创建函数有以下规则。
(1)一个函数若是没有名称,则称为匿名函数。
(2)Python中使用def关键字定义命名函数。
(3)函数可以没有参数,也可以有多个不同类型的参数。
(4)函数可以有多个返回值,也可以不指定返回值,此时默认的返回值为None。
(5)在其他语言中,有函数签名和函数定义的区别,而在Python中,这两个概念统一后,即一个没有具体业务逻辑的函数,在代码块中使用" pass "代替。
创建函数的方式,如下
执行结果如下
2.调用函数
与大多数编程语言一样,通过函数名加一对小括号并正常传递参数,即可完成函数调用。需要注意的是,函数调用需要在函数申明之后,否则会触发异常,如下
执行结果如下,为什么在第6行调用了sub报错,而第2行调用sub就能正常执行了呢?原因是代码是从上往下解析的,调用sub时,sub方法还未创建。sub方法是在第10行创建的,在第13行调用add方法时,sub方法已经创建完成,因此得到正确的结果。
Python函数的参数具有灵活性,其定义的方法可以接受各种形式的参数,也可以简化函数调用方法的代码。
1.位置参数
如下,func1函数具有1个位置参数,func2函数具有2个位置参数。在对函数进行调用的时候,有几个位置参数就需要传递几个参数,否则会触发异常。并且,传入参数与函数参数列表是一一对应的,如第13行,a等于10,b等于20。
执行结果如下
2.可选参数
如下,可选参数是指带有默认值的参数,在对该函数进行调用的时候,可以不必显示传递该函数。当不传递默认函数,函数将使用默认值,如第6行;若传递默认函数,函数将使用传入的值,如第8行。可选参数常用于修改一个现有的函数,避免该函数在其他调用的地方出错。
执行结果如下
可选参数在定义的时候,需要写在位置参数的后面,否则会报错。另外,在设计多个可选参数的时候,建议将经常变化的参数写在前面,长期不变的写在后面。在调用有多个可选参数的函数是,参数的对应关系是优先根据传递位置来决定的,除非显示指定参数名。若是没有传递的参数,该参数仍然使用默认值,如下
执行结果如下
对参数提供默认值,可以提高调用方代码的灵活性,但也有可能出现bug,如下
执行结果如下,调用方认为每次都只应该输出一个" hello ",然而实际上输出的内容会随着调用次数的增加而增加。原因是在创建函数时,a对象就已经被创建好了,等于一个空列表。在调用过程中修改了a对象,那么a的默认值就变了,因此每次调用a对象都会使用上次调用改变后的值。
解决办法是将默认参数修改为不可变对象,如下
执行结果如下
3.可变参数与关键字参数
可变参数是指在传递参数时,可以传递任意个数的参数;关键字参数是指可以传递任意个包含名字的参数。如下,func1函数定义的可变参数,适用于传递列表、元组,使用" * “;func2函数适用于传递字典,字典中的键名即为参数名称,使用” ",这一点和参数解包的逻辑是一样的。
执行结果如下
以上是对于已有列表、元组、字典对象进行传递,还可以不使用" * ",直接传递,如下
如下,第2行参数列表中有一个" * “,之后的参数就是关键字参数,其名称是” c " 和" d “,调用方式如第12行所示。当” * “后面紧接着名称,如第7行,则不必单独写一个” * "。
执行结果如下
Python中的函数可以使用return返回数据,也可以不用return返回,则默认返回" None "。在Python中,所有事物都被当做对象,函数也是一个对象,因此函数的返回值可以是另一个函数。
1.返回零到多个值
如下,func1函数,没有使用return返回数据,因此默认返回值为" None "。func2函数有多个返回值,默认情况下,这些返回值将构成一个元组进行返回,因此在倒数第5行,变量a是一个元组类型。func2函数返回了两个值,因此在倒数第2行定义了两个变量,分别接收这两个值,这成为返回值解包。
执行结果如下
2.返回函数
如下,在fun1函数中返回了fun2的函数名称。那么在第7行,变量fun就是一个函数对象,因此输出fun的类型为<class’function’>。既然fun是函数,那么在fun后面加一对小括号就能对其进行调用,如第9行
执行结果如下
全局变量和局部变量是一个相对的概念,在函数内部的变量,称为局部变量;在该函数外的变量,称为全局变量。若是需要将变量对所有函数可见,则需要加global关键字进行修饰。如下,global将var1、var2、var3都变成了全局变量,因此在fun方法外,还能正常访问,访问变量var4,程序则会触发异常。
执行结果如下
注意,在Python中,使用global方法,可以获取当前程序内部所有的全局变量
本篇文章就到这里结束了,希望能给小伙伴们一些帮助,喜欢的小伙伴们可以三连支持一下博主!!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/pythonbc/20556.html