理解函数及其执行过程、函数的参数,以及匿名函数的使用。
在写程序的时候,我们会遇到这样一种情况:需要多次使用相同的功能。如果每次都把实现这个功能的代码写一遍,那也太麻烦了;而且在需要修改的时候,也很麻烦,非常容易遗漏。
为了解决这类麻烦,我们把实现相同功能的代码只写一遍,并且把它作为一个代码块封装起来,再给封装好的代码块起个合适的名字。在任何需要使用该功能的地方,只需要使用之前起好的名字即可,不用重新写一遍相同的代码。
实际上,上面就是创建函数的过程。实现功能的代码块就是函数主体,代码块的名称就是函数名。定义(或创建)函数使用def关键字。示例如下:
使用之前定义好的函数,简称“函数调用”。当我们在调用函数的时候,系统会根据函数名找到对应的函数,然后执行函数的主体代码。
注意:函数要先创建才能调用,所以,调用函数的代码一定要写在定义函数之后;否则,会提示函数未定义。
说明:“函数”也叫作“方法”,在面向过程编程中,通常叫作“函数”;在面向对象编程中,通常叫作“方法”。
上面定义的是最简单、最基本的函数。如果想实现更灵活、更高级的功能,就得给函数设定参数。
定义函数的时候,函数名后面有一对小括号,设定的参数都要写在这对小括号里。
参数的数量根据实际需要进行设定,多个参数使用逗号分隔。在调用函数传参的时候,多个参数之间也要用逗号分隔。
注意:调用函数的时候,一定要注意被调用函数的参数设定,如果只设定了一个参数,调用的时候也要传入一个参数;如果设定了两个参数,调用的时候也要传入两个参数。传入参数的数量和设定函数的数量一定要对应,不能多也不能少。同时还要保持参数数据类型一致。
以自我介绍函数为例,在定义函数的时候,设定了两个参数,一个参数名叫“name”,另一个参数名叫“age”,这里的name和age并不是两个实际意义上的变量,并不占用内存地址,它们只是从形式上表达函数主体执行时所需的变量,叫作“形式参数”,简称“形参”。
在调用自我介绍函数时,传入了两个参数,一个参数值为“张三”,另一个参数值为3,这两个数据都会占用内存地址,并且它们是本次函数调用实际使用的参数,叫作“实际参数”,简称“实参”。
可以简单归纳如下:函数定义时类似变量名的参数,叫作形参;函数调用时实际传入的参数,叫作实参。
函数除了函数名、参数,还有一个重要要素——返回值。
如果函数体内没有return语句,返回值默认为None。如果想让函数返回指定的内容,需要使用return语句。
上面的return语句后面是变量c,就会返回变量c中存放的数据。如果只有return关键词,后面什么都不写,那就是返回None,跟不写return语句是一个效果。
注意:函数的返回值只有一个,默认返回值为None。
函数的返回可以用变量来接收,用于后续操作。
思考一下:函数的形参叫作“num”,函数返回值存入的变量也是“num”,这两个“num”会相互影响吗?动手实验一下。
这里牵扯到“作用域”的概念。所谓“作用域”,就是作用范围(或生效区域)的意思。变量只有在自己作用域之内才会执行。
形参的作用域只在函数主体代码范围内生效,是局部生效的变量,简称“局部变量”。上面函数返回值存入的变量,在整个Python文件中都生效,是全局生效的变量,简称“全局变量”。
1、位置参数
位置参数是一种传参方式,是指函数调用时实参以“value”的形式传入函数,被调用函数会根据实参传入的顺序依次赋值给形参。实参顺序的改变会导致函数运行结果的改变。
2、关键字参数
关键字参数也是一种传参方式,是指函数调用时实参以“key=value”的形式传入函数,这样就算打乱实参的传入顺序,也不会影响最终结果。
总结如下:
位置参数和关键字参数的本质区别就是实参的赋值逻辑不同,位置参数根据顺序赋值,关键字参数根据名称赋值。
3、位置参数和关键字参数的混用
在实际使用中,以上两种传参方式可以混合使用。但是,关键字参数必须放在位置参数之后,否则会报错。
4、默认参数
默认参数是在定义函数的时候,为形参指定默认值,在函数调用的时候,如果传入实参,Python就会使用指定的实参;如果没有传入实参,Python将自动调用默认值。因此,默认参数的出现,使得函数的调用更加简化、更加灵活。
注意:默认参数必须放在参数列表的最右端。
5、可变参数
有些时候,参数的数量无法预知。比如:分别打印每个班的学生成绩。有的班人数多,有的班人数少,也就是说,需要处理的参数的个数是动态变化的,简称“可变参数”。
根据调用函数时传入参数的方式不同,又分为“可变位置参数”和“可变关键字参数”。
在定义形参时,可变位置参数通常使用“*args”表示,可变关键字参数通常使用“kwargs”表示。
注意:定义函数或调用函数的时候,一定要确保可变位置参数在前,可变关键字参数在后!
通过多次试验,不难发现,Python会把可变位置参数封装成一个元组,把可变关键字参数封装成一个字典。既然如此,我们可不可以传入一个列表当做可变位置参数,传入一个字典当做可变位置参数呢?
动手操作一下,验证自己的猜想。
我们希望把实参列表里的元素封装进args原则里面,把实参字典里的元素封装进kwargs字典里面。但是,运行结果和预期的不一样,Python把传入的列表和传入的字典一起封装进了一个args元组里面,kwargs字典是空的。这是为什么呢?
我们再来重新思考一下:无论列表、元组、字典还是集合,都是对若干数据的一种“打包处理”,Python中简称“封包”,封包之后,里面的所以元素对外就变成了一个整体,可以使用列表名、元组名、字典名或集合名直接访问。传入可变参数的时候,我们希望将列表里的每个元素都重新封包到args元组中,将字典里的元素重新封包到kwargs字典中,而不是将实参的整个列表和整个字典分别看作一个整体;所以,首先要把实参列表的“包装”拆开,取出里面的每一个元素,这个过程在Python中简称“解包”,然后,将解包出来的每个元素重新封包进args元组。同理,实参字典也是需要先解包,再封包,最后形成kwargs字典。
这很简单,模仿可变参数的形参定义,只需在实参列表前面加上1个“*”号,在实参字典前面加上2个“*”号,Python识别到解包信号之后,会自动执行解包操作。
现在的运行结果符合预期。实际上,可变位置参数,不一定非要传入列表,只要是一个可迭代对象都行,比如:字符串或元组。
思考:
2、对于不带参数的函数,输入并运行以下代码:
3、对于带参数的函数,输入并运行以下代码:
匿名函数,就是没有函数名的函数。此外,匿名函数还是有一个特点:它的主体程序只有一个表达式,表达式的结果,就是匿名函数的返回值。所以,匿名函数最显著的特点就是简短、灵活,随用随定义,也叫“一句话函数”。
匿名函数使用lambda关键字定义,参数列表和表达式之间使用“:”分隔,多个参数之间使用“,”分隔,具体语法格式如下:
lambda 参数1,参数2[, 参数3 ...]:表达式
lambda匿名函数的参数可以有0个或多个,但表达式有且只能有一个。
以上示例中,给每一个匿名函数都起了一个名字,这和一般函数其实没啥两样。实际上,匿名函数通常作为参数,传递给内建函数map()、filter()、reduce()使用,这样才能充分发挥匿名函数的灵活与便捷。
请回看上一节的有关内容:Pyhton少儿编程(16)核心函数(方法)
(一)单选题:
1、以下选项哪一个不属于函数的作用( )。
A、提高代码的执行速度
B、提高代码的重复利用率
C、增强代码的可读性
D、降低编程的复杂程度
A、lambda r: 3. * r * r
B、result = lambda r: 3. * r * r
C、lambda r, 3. * r * r
D、result = lambda r,3. * r * r
(二、判断题)1、以下代码:
运行结果如下:( )
<完>
-->参考答案往下翻<--
-->参考答案<--
一、单选题:
1~4:A、B
二、判断题:
1:对
到此这篇python函数总结(python函数总结报告)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/pythonbc/15849.html