【知识点】第5章:函数和代码复用
文章目录
- 知识点整理
- 函数的基本使用
- 函数的定义
- 函数的调用
- 函数的参数传递
- 参数类型:1. 带有默认值的参数
- 参数类型:2. 可变数量的参数
- 参数的传递:位置/名称传递
- 函数的返回值
- 函数对变量的作用
- 代码复用和模块化设计
- 递归
- 练习题
- 判断题
- 简答题
- 填空题
- 选择题
知识点整理
函数的基本使用
函数是一段具有特定功能的、可重用的语句组。
函数是一段具有特定功能的、可重用的语句组,用函数名来表示并通过函数名进行功能调用。函数也可以看作是一段具有名字的子程序,可以在需要的地方调用执行,不需要在每个执行的地方重复编写这些语句。每次使用函数可以提供不同的参数作为输入,以实现对不同数据的处理;函数执行后,还可以反馈相应的处理结果。
函数能够完成特定功能,与黑盒类似,对函数的使用不需要了解函数内部实现原理,只要了解函数的输入输出方式即可。严格地说,函数是一种功能抽象。有些函数是用户自己编写的,称为自定义函数;Python安装包也自带了一些函数和方法,包括Python内置的函数(如abs()
、eval()
)、Python标准库中的函数(如math库中的sqrt()
)等。
使用函数主要有两个目的:降低编程难度和代码重用。
函数的定义
Python使用 def
保留字定义一个函数,语法形式如下:
- 函数名可以是任何有效的Python标识符;
- 参数列表是调用该函数时传递给它的值,可以有零个、一个或多个,当传递多个参数时各参数由逗号分隔,当没有参数时也要保留圆括号。函数定义中参数列表里面的参数是形式参数,简称为 “形参”;
- 函数体是函数每次被调用时执行的代码,由一行或多行语句组成;
- 当需要返回值时,使用保留字return和返回值列表,否则函数可以没有return语句,在函数体结束位置将控制权返回给调用者;
函数的调用
函数调用的一般形式如下:
参数列表中给出要传入函数内部的参数,这类参数称为实际参数,简称为 “实参”。
程序调用一个函数需要执行以下4个步骤。
- 调用程序在调用处暂停执行;
- 在调用时将实参复制给函数的形参;
- 执行函数体语句;
- 函数调用结束给出返回值,程序回到调用前的暂停处继续执行。
函数的参数传递
函数可以定义可选参数、使用参数的位置或名称传递参数值,根据函数中变量的不同作用域有不同的函数返回值方式。
参数类型:1. 带有默认值的参数
在定义函数时,如果有些参数存在默认值,即部分参数不一定需要调用程序输入,可以在定义函数时直接为这些参数指定默认值。当函数被调用时,如果没有传入对应的参数值,则使用函数定义时的默认值替代。
参数类型:2. 可变数量的参数
在函数定义时,也可以设计可变数量参数,通过在参数前增加星号(*)实现。带有星号的可变参数只能出现在参数列表的最后。调用时,这些参数被当作元组类型传递到函数中。
vfunc()
函数定义了可变参数b,调用vfunc()
函数时输入的(2,3,4,5)
被当作元组传递给b,与a累加后输出。
参数的传递:位置/名称传递
函数调用时,实参默认采用按照位置顺序的方式传递给函数,例如dup("knock~",4)
中第一个实参默认赋值给形参string
,第二个实参赋值给形参times
。当参数较多时,这种调用参数的方式可读性较差。
举例:
对于函数 func,它的一个实际调用如下:
存在问题:如果仅看实际调用而不看函数定义,很难理解这些输入参数的含义。在规模稍大的程序中,函数定义可能在函数中,也可能与调用相距甚远,带来的可读性较差。
为了解决上述问题,Python提供了按照形参名称输入实参的方式,此时函数调用如下:
由于调用函数时指定了参数名称,所以参数之间的顺序可以任意调整。
函数的返回值
return
语句用来退出函数并将程序返回到函数被调用的位置继续执行。return 语句可以同时将0个、1个或多个函数运算后的结果返回给函数被调用处的变量。
函数可以没有return,此时函数并不返回值。函数也可以用return返回多个值,多个值以元组类型保存。
函数对变量的作用
一个程序中的变量包含两类:全局变量和局部变量。
- 全局变量指在函数之外定义的变量,一般没有缩进,在程序执行全过程有效。
- 局部变量指在函数内部使用的变量,仅在函数内部有效,当函数退出时变量将不存在。
这个例子说明,当函数执行完退出后,其内部变量将被释放。
如果希望让func()
函数将n
当作全局变量,需要在变量n
使用前显式声明该变量为全局变量。
代码复用和模块化设计
程序由一系列代码组成,如果代码是顺序但无组织的,不仅不利于阅读和理解,也很难进行升级和维护。因此,需要对代码进行抽象,形成易于理解的结构。当代编程语言从代码层面采用函数和对象两种抽象方式,分别对应面向过程和面向对象编程思想。
函数是程序的一种基本抽象方式,它将一系列代码组织起来通过命名供其他程序使用。函数封装的直接好处是代码复用,任何其他代码只要输入参数即可调用函数,从而避免相同功能代码在被调用处重复编写。代码复用产生了另一个好处,当更新函数功能时,所有被调用处的功能都被更新。
面向过程是一种以过程描述为主要方法的编程方式,该方法要求程序员列出解决问题所需要的步骤,然后用函数将这些步骤一步一步实现,使用时依次建立并调用函数或编写语句即可。面向过程编程是一种基本且自然的程序设计方法,函数通过将步骤或子功能封装实现代码复用并简化程序设计难度。
对象是程序的一种高级抽象方式,它将程序代码组织为更高级别的类。对象包括表征对象特征的属性和代表对象操作的方法。例如,汽车是一个对象,其颜色、轮胎数量、车型是属性,代表汽车的静态值;前进、后退、转弯等是方法,代表汽车的动作和行为。在程序设计中,如果<a>代表对象,获取其属性<b>采用<a>.<b>,调用其方法<c>采用<a>.<c>()。对象的方法具有程序功能性,因此采用函数形式封装。简单地,对象是程序拟解决计算问题的一个高级别抽象,它包括一组静态值(属性)和一组函数(方法)。从代码行数角度来看,对象和函数都使用了一个容易理解的抽象逻辑,但对象可以凝聚更多代码。因此,面向对象编程更适合代码规模较大,交互逻辑复杂的程序。
递归
函数定义中调用函数自身的方式形成递归。
练习题
判断题
- 函数必须有返回语句。(×)
- 函数使用保留字 global 声明全局变量。(√)
- 函数定义中调用函数自身的方式形成递归。(√)
- 函数内定义的变量默认为全局变量。(×)
简答题
说说你对函数或者程序模块化设计的理解?
言之有理即可。
填空题
- Python 使用 ___ 关键字定义函数。(def)
- Python 函数使用 ___ 关键字返回函数值。(return)
- Python 函数在返回多个值时使用 ___ 数据类型。(元组)
选择题
1.以下哪个关键字用于定义Python函数?
A. def
B. function
C. define
D. func
答案:A
2.Python函数中,return语句的作用是?
A. 终止函数执行
B. 返回一个值并退出函数
C. 打印输出结果
D. 循环执行函数
答案:B
3.以下哪个是函数的正确调用方式?
A. my_function()
B. call my_function
C. function my_function
D. run my_function
答案:A