版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Python程序设计与应用第5章函数5.1
函数的概念5.2函数的定义和调用5.3
函数的参数和参数传递5.4
变量的作用域5.5
迭代器和生成器
本章小结熟练掌握函数。理解函数及函数参数的分类并能够灵活使用。掌握函数的嵌套调用。掌握函数的递归调用。掌握变量的作用域。函数可以看成是语句的集合,程序通过函数调用来执行其包含的语句。函数可以返回一个计算结果,根据每次函数调用的参数返回不同的计算结果。Python利用函数提高代码的重用率,减少了代码冗余。学习目标:
“函数”这个术语来自数学,最早见于1692年德国教学家Leibniz的著作。一般来说,如果在某一变化过程中有两个变量x和y,对于变量x在研究范围内的每一个确定的值,变量y都有唯一确定的值和它对应,那么变量x就称为自变量,而变量y则称为因变量,或变量x的函数,记为y=f(x),f称为函数名。记号(x)则是由瑞士数学家Euler于1724年首次使用的。在计算机领域,也继承了这种思维方式,把一段经常需要使用的代码片段封装起来,记为y=f(x),f称为函数名,x称为参数,y称为返回值,在需要使用时可以直接调用,并且返回结果。要注意的是,Python语言的函数并不完全等同于数学函数。5.1
函数的概念
函数是为了完成某项任务而组合在一起的相关语句的集合,并被指定了一个名字。在实际开发中,有很多操作是完全相同或者是非常相似的,仅仅是处理的数据不同而已,因此经常会在不同的代码位置多次执行相似或完全相同的代码块。从软件设计和代码复用的角度来讲,很显然,直接将该代码块复制到多个相应的地方然后进行简单修改绝对不是一个好主意。虽然这样可以使得多份复制的代码可以彼此独立地进行修改,但这样不仅增加了代码量,使得程序文件变大,也增加了代码理解和代码维护的难度,更重要的是为代码测试和纠错带来了很大麻烦。一旦被复制的代码块将来某天被发现存在问题而需要修改,则必须将所有的复制都做同样正确的修改,这在实际中是很难完成的一项任务。由于代码量的大幅度增加,导致代码之间的关系更加复杂,很可能在修补了旧漏洞的同时又引入了新漏洞。
5.1
函数的概念
解决上述问题的一个常用的方式是设计和编写函数。将可能需要反复执行的代码封装为函数,并在需要执行该段代码功能的地方进行调用,不仅可以实现代码的复用,更重要的是可以保证代码的一致性,只需要修改该函数代码则所有调用位置均受到影响。当然,在实际开发中,需要对函数进行良好的设计和优化才能充分发挥其优势。在编写函数时,有很多原则需要参考和遵守,例如,不要在同一个函数中执行太多的功能,尽量只让其完成一个功能,以提高模块的内聚性。另外,尽量减少不同函数之间的隐式耦合,如减少全局变量的使用,使得函数之间仅通过调用和参数传递来显式体现其相互关系。5.1
函数的概念
解决上述问题的一个常用的方式是设计和编写函数。将可能需要反复执行的代码封装为函数,并在需要执行该段代码功能的地方进行调用,不仅可以实现代码的复用,更重要的是可以保证代码的一致性,只需要修改该函数代码则所有调用位置均受到影响。当然,在实际开发中,需要对函数进行良好的设计和优化才能充分发挥其优势。在编写函数时,有很多原则需要参考和遵守,例如,不要在同一个函数中执行太多的功能,尽量只让其完成一个功能,以提高模块的内聚性。另外,尽量减少不同函数之间的隐式耦合,如减少全局变量的使用,使得函数之间仅通过调用和参数传递来显式体现其相互关系。5.1
函数的概念
在Python中,定义函数的语法如下:使用def关键字来定义函数,然后是一个空格和函数名称,接下来是一对圆括号,在圆括号内是形式参数列表,如果有多个参数则使用逗号分隔开,圆括号之后是一个冒号,最后以换行开始的函数体代码。定义函数时需要注意的问题是:①函数形参不需要声明其类型;②即使该函数不需要接受任何参数,也必须保留一对空的圆括号;③函数体相对于def关键字必须保持一定的空格缩进。def函数名([参数列表]):
函数体
函数包括函数头和函数体。函数头以关键字def开始,紧接着函数名、形式参数表并以冒号结束。5.2
函数的定义和调用5.2
函数的定义和调用5.2
函数的定义和调用5.2
函数的定义和调用
在定义Python函数时可定义形参(形式参数的意思),这些形参的值要等到调用时才能确定下来,由函数的调用者负责为形参传入参数值。简单来说,就是谁调用函数,谁负责传入参数值。5.3.1函数的形参和实参
函数定义时圆括弧内是使用逗号分隔开的形参列表,一个函数可以没有形参,但是定义时一对圆括弧必须要有,表示该函数不接受参数。雨数调用时向其传递实参,根据不同的参数类型,将实参的值或引用传递给形参。
在定义函数时,对参数个数并没有限制,如果有多个形参,则需要使用逗号进行分隔。5.3
函数的参数和参数传递5.3.2位置参数
位置参数:在调用函数时,要求实参按形参在函数头中的定义顺序(即位置)进行传递。实参默认采用位置参数的形式传递给函数。5.3.3关键字参数关键参数主要指实参,即调用函数时的参数传递方式,而与函数定义无关。通过关键参数传递,实参顺序可以和形参顺序不一致,但不影响传递结果,避免了用户需要牢记参数位置与顺序的麻烦,使得函数的调用和参数传递更加灵活方便。关键字参数:使用“形参名=值”的形式传递参数。使用关键字参数,参数意义明确,传递的参数与顺序无关。5.3
函数的参数和参数传递5.3.4默认值参数
在Python中,可以在函数定义时为一个或多个形参提供明确的初始值。这种形参被称为默认参数,其初始值被称为默认值。如果函数调用时未给出实参,默认值将作为实参传递给函数。5.3.5参数传递
传递参数时,可以使用Python列表、元组、集合、字典以及其他可迭代对象作为实参,并在实参名称前加一个星号,Python解释器将自动进行解包,然后传递给多个单变量形参。但需要注意的是,如果使用字典作为实参,则默认使用字典的键,如果需要将字典中的键值对作为参数则需要使用items()函数,如果需要将字典的值作为参数则需要调用字典的values()函数。最后,请保证实参中元素个数与形参个数相等,否则将出现错误。
如果实参是数字或字符串或布尔值或元组,那么不管函数中的形参有没有变化,实参都是不受影响的。因为数字、字符串、布尔值和元组是不可变对象,不可变对象的内容是不能被更改的,相当于通过“值传递”来传递对象。5.3
函数的参数和参数传递
变量起作用的代码范围称为变量的作用域.不同作用域内同名变量之间互不影响。一个变量在函数外部定义和在函数内部定义,其作用域是不同的.函数内部定义的变量一般为局部变量.而不属于任何函数的变量一般为全局变量。一般而盲,局部变量的引用比全局变量速度快,应优先考虑使用。除非真的有必要,应尽量避免使用全局变量,因为全局变量会增加不同函数的耦合度,从而降低代码的可读性,并使得代码测试和纠错变得很困难。
在函数内定义的普通变量只在该函数内起作用,称为局部变量。当函数运行结束后,在该函数内部定义的局部变量被自动删除。如果想要在函数内部修改一个定义在函数外的变量值,那么这个变量就不能是局部的,其作用域必须为全局的,能够同时作用于函数内外,称为全局变量,可以通过global来声明或定义。这分两种情况。5.4
变量的作用域
(1)一个变量已在函数外定义,如果在函数内需要修改这个变量的值,并要将这个赋值结果反映到函数外,可以在函数内用global声明这个变量,明确声明使用同名的全局变量。
(2)在函数内部直接将一个变量声明为全局变量,在函数外没有声明,在调用这个函数之后,将增加为新的全局变量。5.4.1局部变量
在函数内部定义的变量称为局部变量。局部变量只能在函数内部使用,在函数外部是无法访问局部变量的。函数调用结束局部变量将不存在。函数形式参数拥有和局部变量一样的性质。5.4
变量的作用域
5.4.2
全局变量
在函数外部声明的变量称为全局变量。在程序执行的全过程中均有效。在函数的内部可以访问全局变量。
如果在一个函数内定义的局部变量与全局变量重名,则重名的局部变量是新生成的局部变量,在函数中局部变量优先,即函数中使用的是新生成的局部变量,而不是全局变量。要避免上述问题,可以使用global语句。
在函数中,要为定义在函数外的全局变量赋值,必须使用global语句限定该变量是全局变量。
全局变量可以在函数中使用,看上去挺有吸引力,实际上是一种不好的编程习惯。尤其在函数中修改全局变量的值,可能会导致隐蔽的错误。应尽量避免使用全局变量。此外,在for语句中定义的循环变量,循环结束后,仍然有效。5.4
变量的作用域
5.5.1
迭代器
迭代(iterate)意味着重复多次,就像循环那样。本书前面只使用for循环迭代过序列和字典,但实际上也可迭代其他对象:实现了函数_iter_的对象。
方法_iter_返回一个迭代器,它是包含方法_next_的对象,而调用这个方法时可不提供任何参数。当你调用方法_next_时,迭代器应返回其下一个值。如果迭代器没有可供返回的值,应引发StopIteration异常。你还可使用内置的便利函数next,在这种情况下,next(it)与it._next_()等效。5.5
迭代器和生成器
5.5.1
迭代器
注意:在Python3中,迭代器协议有细微的变化。在以前的选代器协议中,要求迭代器对象包含函数next而不是_next_。
这有什么意义呢?为何不使用列表呢?因为在很多情况下,使用列表都有点像用大炮打蚊子。例如,如果你有一个可逐个计算值的函数,你可能只想逐个地获取值,而不是使用列表一次性获取。这是因为如果有很多值,列表可能占用太多的内存。但还有其他原因:使用迭代器更通用、更简单、更优雅。下面来看一个不能使用列表的示例,因为如果使用,这个列表的长度必须是无穷大的!5.5
迭代器和生成器
5.5.2
生成器
生成器是一个相对较新的Python概念。由于历史原因,它也被称为简单生成器(simplegenerator)。生成器和迭代器可能是近年来引人的最强大的功能,但生成器是一个相当复杂的概念,你可能需要花些功夫才能明白其工作原理和用途。虽然生成器让你能够编写出非常优雅的代码,但请放心,无论编写什么程序,都完全可以不使用生成器。生成器是一种使用普通函数语法定义的迭代器。生成器的工作原理到底是什么呢?通过示例来说明最合适。下面先来看看如何创建和使用生成器,然后再看看幕后的情况。5.5
迭代器和生成器
5.5.2
生成器
递归式生成器:前一节设计的生成器只能处理两层的嵌套列表,这是使用两个for循环来实现的。如果要处理任意层嵌套的列表,该如何办呢?例如,你可能使用这样的列表来表示树结构(也可以使用特定的树类,但策略是相同的)。对于每层嵌套,都需要一个for循环,但由于不知道有多少层嵌套,你必须修改解决方案,使其更灵活。该求助于递归了。
调用flatten时,有两种可能性(处理递归时都如此):基线条件和递归条件。在基线条件下,要求这个函数展开单个元素(如一个数)。在这种情况下,for循环将引发TypeError异常(因为你试图迭代一个数),而这个生成器只生成一个元素。
然而,如果要展开的是一个列表(或其他任何可迭代对象),你就需要做些工作:遍历所有的子列表(其中有些可能并不是列表)并对它们调用flatten,然后使用另一个for循环生成展开后的子列表中的所有元素。这可能看起来有点不可思议,但确实可行。5.5
迭代器和生成器
5.5.2
生成器
递归式生成器:前一节设计的生成器只能处理两层的嵌套列表,这是使用两个for循环来实现的。如果要处理任意层嵌套的列表,该如何办呢?例如,你可能使用这样的列表来表示树结构(也可以使用特定的树类,但策略是相同的)。对于每层嵌套,都需要一个for循环,但由于不知道有多少层嵌套,你必须修改解决方案,使其更灵活。该求助于递归了。
5.5
迭代器和生成器
对于生成器的函数返回的迭代器,可以像使用其他迭代器一样使用它。生成器的函数:在生成器开始运行后,可使用生成器和外部之间的通信渠道向它提供值。这个通信渠道包含如下两个端点。
外部世界:外部世界可访问生成器的函数send,这个函数类似于next,但接受一个参数(要发送的“消息”,可以是任何对象)。
生成器:在挂起的生成器内部,yield可能用作表达式而不是语句。换而言之,当生成器重新运行时,yield返回一个值,通过send从外部世界发送的值。如果使用的是next,yield将返回None。
请注意
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四年级数学:三角形基本特性认知学习与探索
- 护理标识的心理学应用
- ISO9001-2026之“4.4质量管理体系”过程方法在“10改进”条款中的应用指南(雷泽佳编制-2026A0)
- 2026年学校学校安全风险清单和责任清单
- 2026年社保中心招聘考试题及答案
- 2026年河北省小学教师资格证考试模拟试卷
- 2026年注册环保工程师考试题及答案
- 不宁腿综合征诊断和治疗指南 (2025 版)
- 建筑电气设计辅助技师考试试卷及答案
- 机器人装配系统方案设计师岗位招聘考试试卷及答案
- oa安全保密管理制度
- 篮球兴趣小组活动记录宗宏利
- 工厂运输管理制度
- DB33- 1001-2003:建筑地基基础设计规范
- 惊恐障碍急救医学课程课件
- 车辆配装配载方案
- GB/T 14233.3-2024医用输液、输血、注射器具检验方法第3部分:微生物学试验方法
- 《数学课程标准》义务教育2022年修订版(原版)
- 2024年汕头市龙湖区教育局招考聘用机关聘用人员高频500题难、易错点模拟试题附带答案详解
- 智研数据中心部分可吸收止血材料市场调研分析报告
- HG+20231-2014化学工业建设项目试车规范
评论
0/150
提交评论