内容正文:
任务5.1 函数的定义与调用
名片管理器
各位同学,下面我们来讲解一下函数的定义与调用。
5.1 函数的定义与调用——名片管理器
【任务描述】
名片管理器是一种实用的生活工具,用来帮助管理手机中的各类名片。它需要实现以下功能:名片的添加、名片的删除、名片的修改、名片的查询、获取所有名片信息、系统退出等,其管理界面如图5-1所示。
5.1 函数的定义与调用——名片管理器
【任务分析】
名片管理器的实现需要用到函数的定义和调用。每个功能的实现都需要定义一个函数,可以先设计4个子函数来实现添加名片、删除名片、修改名片信息和显示所有名片的功能;然后定义一个主函数来调用这些子函数,主函数同时要实现系统的退出功能。
5.1 函数的定义与调用——名片管理器
函数及其作用
函数的定义
函数的调用
什么是函数?函数对我们来说其实并不陌生,在前面的章节我们或多或少地使用过函数,只不过它们都是已经定义好的,我们直接调用就可以了。其实函数可以理解为一段功能或者说一段代码的表示。它对应一段可重用的特定的语句组,它是一种功能的抽象,表达特定的含义。在程序设计中,函数通常有两个作用,一个是降低编码的难度,一个是提高代码的重用率。比如一个数学函数ABS(),它用来求实数的绝对值,我们只管拿来用就是了,而不用管它的内部是如何实现的。另外当我们定义了一个函数,在编程中需要用到相关功能,我们可以直接调用函数就可以了,实现代码的复用。下面我们来讲一下如何定义一个函数
5.1 函数的定义与调用——名片管理器
5.1.1 函数的定义与调用
5.1.2 函数参数
5.1.3 函数返回值
5.1.4 变量作用域
5.1.5 任务实现——名片管理器
5.1.3 函数返回值
各位同学,下面我们来讲解一下函数的返回值的作用域
所谓“返回值”,就是在调用函数之后返回给调用者的结果。以下代码定义一个函数,并把值返回给调用者。
5.1.3 函数返回值
def add(a,b):
c=a+b
return c
m=add(2,3)
print(m)
random: 160
【例5-6】函数返回值。
random模块包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果要求真正的随机(如用于加密或实现与安全相关的功能),则应考虑使用os模块中的函数urandom。random模块中的systemRandom类功能与urandom类似,可提供接近于真正的随机数据。random.random():生成一个[0.0,1.0)之间的小数。代码如下,运行结果为0到1之间的小数。random.uniform(a,b):生成一个[a,b]之间的随机小数。如果a的值小于b的值,则生成的随机浮点数N的取值范围为a<=N<=b;如果a的值大于b的值,则生成的随机浮点数N的取值范围为b<=N<=a。大家看它的运行结果。random.randint(a,b):从a和b(包括b)之间随机生成一个整数,需要注意的是,a和b的取值必须为整数,并且a的值一定要小于b的值。 random.randint(100,200),运行结果为125。
(1)无参数、无返回值
无参数、无返回值的函数既不能接收参数,又没有返回值。在一般情况下,打印提示信息等类似的功能,就可以使用这类函数来实现。
5.1.3 函数返回值
def printMenu():
print('---------------------')
print('progrnm start')
print('program end' )
print('---------------------')
printMenu()
---------------------
progrnm start
program end
---------------------
【例5-7】定义一个无参数、无返回值函数。
random模块包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果要求真正的随机(如用于加密或实现与安全相关的功能),则应考虑使用os模块中的函数urandom。random模块中的systemRandom类功能与urandom类似,可提供接近于真正的随机数据。random.random():生成一个[0.0,1.0)之间的小数。代码如下,运行结果为0到1之间的小数。random.uniform(a,b):生成一个[a,b]之间的随机小数。如果a的值小于b的值,则生成的随机浮点数N的取值范围为a<=N<=b;如果a的值大于b的值,则生成的随机浮点数N的取值范围为b<=N<=a。大家看它的运行结果。random.randint(a,b):从a和b(包括b)之间随机生成一个整数,需要注意的是,a和b的取值必须为整数,并且a的值一定要小于b的值。 random.randint(100,200),运行结果为125。
(2)无参数、有返回值
无参数、有返回值的函数不能接收参数,但是可以返回某个数据。在一般情况下,采集数据等功能可以用此类函数实现。
5.1.3 函数返回值
def getTemperature():
#获取温度的一些处理过程
return 24
temperature = getTemperature()
print('当前的温度为:%d'%temperature)
当前的温度为:24
【例5-8】定义一个无参数、有返回值的函数。
random模块包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果要求真正的随机(如用于加密或实现与安全相关的功能),则应考虑使用os模块中的函数urandom。random模块中的systemRandom类功能与urandom类似,可提供接近于真正的随机数据。random.random():生成一个[0.0,1.0)之间的小数。代码如下,运行结果为0到1之间的小数。random.uniform(a,b):生成一个[a,b]之间的随机小数。如果a的值小于b的值,则生成的随机浮点数N的取值范围为a<=N<=b;如果a的值大于b的值,则生成的随机浮点数N的取值范围为b<=N<=a。大家看它的运行结果。random.randint(a,b):从a和b(包括b)之间随机生成一个整数,需要注意的是,a和b的取值必须为整数,并且a的值一定要小于b的值。 random.randint(100,200),运行结果为125。
(3)有参数、无返回值
有参数、无返回值的函数能接收参数,但不可以返回数据。在一般情况下,对某些变量设置数据而不需要结果时,可以用此类函数实现。
5.1.3 函数返回值
def test(num1,num2):
result=num1+num2
print(’两者之和为:%d’%result)
test(4,5)
两者之和为:9
【例5-9】定义一个有参数、无返回值的函数。
random模块包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果要求真正的随机(如用于加密或实现与安全相关的功能),则应考虑使用os模块中的函数urandom。random模块中的systemRandom类功能与urandom类似,可提供接近于真正的随机数据。random.random():生成一个[0.0,1.0)之间的小数。代码如下,运行结果为0到1之间的小数。random.uniform(a,b):生成一个[a,b]之间的随机小数。如果a的值小于b的值,则生成的随机浮点数N的取值范围为a<=N<=b;如果a的值大于b的值,则生成的随机浮点数N的取值范围为b<=N<=a。大家看它的运行结果。random.randint(a,b):从a和b(包括b)之间随机生成一个整数,需要注意的是,a和b的取值必须为整数,并且a的值一定要小于b的值。 random.randint(100,200),运行结果为125。
(4)有参数、有返回值
有参数、有返回值的函数不仅能接收参数,还能返回某个数据。在一般情况下,用于数据处理并需要结果的应用可以用此类函数实现。
5.1.3 函数返回值
def calculateNum(num): # 计算1~num的累积和
result = 0
i = 1
while i <= num:
result = result + i
i += 1
return result
result = calculateNum(100)
print('1~100的累积和为:%d' % result)
1~100的累积和为:5050
【例5-10】定义一个有参数、有返回值的函数。
random模块包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果要求真正的随机(如用于加密或实现与安全相关的功能),则应考虑使用os模块中的函数urandom。random模块中的systemRandom类功能与urandom类似,可提供接近于真正的随机数据。random.random():生成一个[0.0,1.0)之间的小数。代码如下,运行结果为0到1之间的小数。random.uniform(a,b):生成一个[a,b]之间的随机小数。如果a的值小于b的值,则生成的随机浮点数N的取值范围为a<=N<=b;如果a的值大于b的值,则生成的随机浮点数N的取值范围为b<=N<=a。大家看它的运行结果。random.randint(a,b):从a和b(包括b)之间随机生成一个整数,需要注意的是,a和b的取值必须为整数,并且a的值一定要小于b的值。 random.randint(100,200),运行结果为125。
5.1.4 变量作用域
各位同学,下面我们来讲解一下函数的返回值的作用域
1.局部变量和全局变量
局部变量是在函数内部定义的变量。在定义函数时,往往需要在函数内部对变量进行定义和赋值。局部变量只能在函数内部使用,如果超出使用范围(函数外部),则会报错。
5.1.4 变量作用域
A = 100 # 全局变量一般用大写字母表示
def func():
a = 50 # 局部变量一般用小写字母表示
print(a+A)
func()
150
【例5-11】局部变量的使用。
random模块包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果要求真正的随机(如用于加密或实现与安全相关的功能),则应考虑使用os模块中的函数urandom。random模块中的systemRandom类功能与urandom类似,可提供接近于真正的随机数据。random.random():生成一个[0.0,1.0)之间的小数。代码如下,运行结果为0到1之间的小数。random.uniform(a,b):生成一个[a,b]之间的随机小数。如果a的值小于b的值,则生成的随机浮点数N的取值范围为a<=N<=b;如果a的值大于b的值,则生成的随机浮点数N的取值范围为b<=N<=a。大家看它的运行结果。random.randint(a,b):从a和b(包括b)之间随机生成一个整数,需要注意的是,a和b的取值必须为整数,并且a的值一定要小于b的值。 random.randint(100,200),运行结果为125。
全局变量指的是能作用于函数内部和外部的变量,即全局变量既可以在各个函数的外部使用,又可以在各个函数的内部使用
5.1.4 变量作用域
a =3
def f3(v2):
return a+1 #外部的全局变量在函数内部使用
print(f3(1))
4
【例5-12】局部变量的使用。
【例5-12】在函数内部使用了全局变量a。如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量。以下代码演示在局部变量和全局变量名字相同的情况下变量的使用。
random模块包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果要求真正的随机(如用于加密或实现与安全相关的功能),则应考虑使用os模块中的函数urandom。random模块中的systemRandom类功能与urandom类似,可提供接近于真正的随机数据。random.random():生成一个[0.0,1.0)之间的小数。代码如下,运行结果为0到1之间的小数。random.uniform(a,b):生成一个[a,b]之间的随机小数。如果a的值小于b的值,则生成的随机浮点数N的取值范围为a<=N<=b;如果a的值大于b的值,则生成的随机浮点数N的取值范围为b<=N<=a。大家看它的运行结果。random.randint(a,b):从a和b(包括b)之间随机生成一个整数,需要注意的是,a和b的取值必须为整数,并且a的值一定要小于b的值。 random.randint(100,200),运行结果为125。
全局变量指的是能作用于函数内部和外部的变量,即全局变量既可以在各个函数的外部使用,又可以在各个函数的内部使用
5.1.4 变量作用域
a =3
def f3(v2):
return a+1 #外部的全局变量在函数内部使用
print(f3(1))
4
【例5-12】局部变量的使用。
【例5-12】在函数内部使用了全局变量a。如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量。以下代码演示在局部变量和全局变量名字相同的情况下变量的使用。
random模块包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果要求真正的随机(如用于加密或实现与安全相关的功能),则应考虑使用os模块中的函数urandom。random模块中的systemRandom类功能与urandom类似,可提供接近于真正的随机数据。random.random():生成一个[0.0,1.0)之间的小数。代码如下,运行结果为0到1之间的小数。random.uniform(a,b):生成一个[a,b]之间的随机小数。如果a的值小于b的值,则生成的随机浮点数N的取值范围为a<=N<=b;如果a的值大于b的值,则生成的随机浮点数N的取值范围为b<=N<=a。大家看它的运行结果。random.randint(a,b):从a和b(包括b)之间随机生成一个整数,需要注意的是,a和b的取值必须为整数,并且a的值一定要小于b的值。 random.randint(100,200),运行结果为125。
5.1.4 变量作用域
sum =5
def f2(v2):
sum =0
while v2 < 10:
sum += v2 #这里sum使用的是局部变量的初始值0,而不是全局sum=5
v2 += 1
return sum
print(sum)
print(f2(0))
5
45
【例5-13】在局部变量与全局变量名字相同时变量的使用。
从【例5-13】可知,在全局变量和局部变量名字相同的情况下,函数访问的是局部变量
random模块包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果要求真正的随机(如用于加密或实现与安全相关的功能),则应考虑使用os模块中的函数urandom。random模块中的systemRandom类功能与urandom类似,可提供接近于真正的随机数据。random.random():生成一个[0.0,1.0)之间的小数。代码如下,运行结果为0到1之间的小数。random.uniform(a,b):生成一个[a,b]之间的随机小数。如果a的值小于b的值,则生成的随机浮点数N的取值范围为a<=N<=b;如果a的值大于b的值,则生成的随机浮点数N的取值范围为b<=N<=a。大家看它的运行结果。random.randint(a,b):从a和b(包括b)之间随机生成一个整数,需要注意的是,a和b的取值必须为整数,并且a的值一定要小于b的值。 random.randint(100,200),运行结果为125。
5.1.4 变量作用域
注意:
1.全局变量可以在这整个程序范围内访问。
2.如果出现全局变量和局部变量名字相同的情况则访问的是局部变量。
3.全局变量不能在函数体内直接被赋值否则就会报错。
random模块包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果要求真正的随机(如用于加密或实现与安全相关的功能),则应考虑使用os模块中的函数urandom。random模块中的systemRandom类功能与urandom类似,可提供接近于真正的随机数据。random.random():生成一个[0.0,1.0)之间的小数。代码如下,运行结果为0到1之间的小数。random.uniform(a,b):生成一个[a,b]之间的随机小数。如果a的值小于b的值,则生成的随机浮点数N的取值范围为a<=N<=b;如果a的值大于b的值,则生成的随机浮点数N的取值范围为b<=N<=a。大家看它的运行结果。random.randint(a,b):从a和b(包括b)之间随机生成一个整数,需要注意的是,a和b的取值必须为整数,并且a的值一定要小于b的值。 random.randint(100,200),运行结果为125。
2.global和nonlocal关键字
使用global关键字可以将局部范围内(如函数)的局部变量提升为全局变量。
5.1.4 变量作用域
b2 = 22 #全局变量
def fun():
global b2
print(b2)
b2 = 99 #将全局变量重新赋值
print(b2)
fun()
print(b2)
22
99
99
【例5-14】global关键字的使用。
random模块包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果要求真正的随机(如用于加密或实现与安全相关的功能),则应考虑使用os模块中的函数urandom。random模块中的systemRandom类功能与urandom类似,可提供接近于真正的随机数据。random.random():生成一个[0.0,1.0)之间的小数。代码如下,运行结果为0到1之间的小数。random.uniform(a,b):生成一个[a,b]之间的随机小数。如果a的值小于b的值,则生成的随机浮点数N的取值范围为a<=N<=b;如果a的值大于b的值,则生成的随机浮点数N的取值范围为b<=N<=a。大家看它的运行结果。random.randint(a,b):从a和b(包括b)之间随机生成一个整数,需要注意的是,a和b的取值必须为整数,并且a的值一定要小于b的值。 random.randint(100,200),运行结果为125。
使用nonlocal关键字可以修改嵌套的上级函数作用域中的变量。
5.1.4 变量作用域
def outer():
num = 10
def inner():
nonlocal num
num = 100
print(num)
inner()
print(num)
outer()
100
100
【例5-15】global关键字的使用。
在【例5-15】中,上级函数有一个变量num,其初始值为10。函数inner()嵌套在outer()中,通过nonlocal关键字定义num,设置其初始值为100,并打印。通过调用outer()函数,上级函数中的变量num由10变为了100。
random模块包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果要求真正的随机(如用于加密或实现与安全相关的功能),则应考虑使用os模块中的函数urandom。random模块中的systemRandom类功能与urandom类似,可提供接近于真正的随机数据。random.random():生成一个[0.0,1.0)之间的小数。代码如下,运行结果为0到1之间的小数。random.uniform(a,b):生成一个[a,b]之间的随机小数。如果a的值小于b的值,则生成的随机浮点数N的取值范围为a<=N<=b;如果a的值大于b的值,则生成的随机浮点数N的取值范围为b<=N<=a。大家看它的运行结果。random.randint(a,b):从a和b(包括b)之间随机生成一个整数,需要注意的是,a和b的取值必须为整数,并且a的值一定要小于b的值。 random.randint(100,200),运行结果为125。
5.1.4 变量作用域
即学即答:
执行以下代码后,结果是( )。
A.5 B.3
C.2 D.1
def fun(): global a a += 2a = 1fun() print(a)
5.1.5 任务实现——名片管理器
同学们,这一节,我们结合章节一开始提出的任务,讲解如何用函数来实现名片管理器。
5.1 函数的定义与调用——名片管理器
【任务描述】
名片管理器是一种实用的生活工具,用来帮助管理手机中的各类名片。它需要实现以下功能:名片的添加、名片的删除、名片的修改、名片的查询、获取所有名片信息、系统退出等。
5.1 函数的定义与调用——名片管理器
【任务分析】
以上功能的实现,需要先为每个功能定义一个函数,共5个子函数,分别是添加名片、删除名片、修改名片信息、获取名片信息、退出管理器;然后定义一个主函数来调用这些子函数,主函数同时要实现系统的退出功能。
5.1.5 任务实现——名片管理器
-------------------------------------------------------------------------------
名片管理系统V1.0
1. 添加名片
2. 删除名片
3. 修改名片
4. 获取名片信息
5. 退出管理器
―――――――――――――――――――
名片管理器界面
名片管理器是一种生活实用工具,这是它的管理界面,用来帮助管理手机中的各类名片。它需要实现以下功能:名片的添加、名片的删除、名片的修改、名片的查询、获取所有名片信息、系统退出等。
(1)定义列表
#用来保存名片的所有信息
carInfos=[]
【例5-16】任务实现:名片管理器。
5.1.5 任务实现——名片管理器
首先我们需要定义一个列表carInfos,该列表用来保存名片的信息。添加名片,删除名片,修改名片等操作都是通过对该列表的操作来实现的 。接下来我们根据功能分别来定义子函数。
(1)定义列表
#用来保存名片的所有信息
carInfos=[]
【例5-16】任务实现:名片管理器。
5.1.5 任务实现——名片管理器
首先我们需要定义一个列表carInfos,该列表用来保存名片的信息。添加名片,删除名片,修改名片等操作都是通过对该列表的操作来实现的 。接下来我们根据功能分别来定义子函数。
(2)定义printMenu()
#打印功能提示
def printMenu():
print("="*30)
print(" 名牌管理系统V1.0 ")
print("1.添加名片")
print("2.删除名片")
print("3.修改名片信息")
print("4.显示所有名片")
print("5.退出系统")
print("="*30)
------------------------------------------------------------
名片管理系统V1.0
1. 添加名片
2. 删除名片
3. 修改名片
4. 获取名片信息
5. 退出管理器
――――――――――――――――――――
5.1.5 任务实现——名片管理器
除了功能子函数外,我们还需要定义一个界面函数。该函数会打印系统的界面,同时进行功能提示。单独运行的效果就是我们刚刚看到的界面。
(3)定义添加名片函数
#添加一张名片信息
def addCarInfo():
# 提示并获取姓名
newName = input("请输入名片姓名:")
# 提示并获取性别
newSex = input("请输入人员性别:(男/女)")
# 提示并获取手机号码
newPhone = input("请输入手机号码:")
newInfo = {}
newInfo['name'] = newName
newInfo['sex'] = newSex
newInfo['phone'] = newPhone
carInfos.append(newInfo)
5.1.5 任务实现——名片管理器
除了功能子函数外,我们还需要定义一个界面函数。该函数会打印系统的界面,同时进行功能提示。单独运行的效果就是我们刚刚看到的界面。
(4)定义修改名片信息函数
#修改名片的信息
def modifyCarInfo():
carId=int(input("请输入要修改的名片序号:"))
newName = input("请输入新的名字:")
newSex = input("请输入新的性别:(男/女)")
newPhone = input("请输入新的手机号码:")
carInfos[carId - 1]['name'] = newName
carInfos[carId - 1]['sex'] = newSex
carInfos[carId - 1]['phone'] = newPhone
5.1.5 任务实现——名片管理器
除了功能子函数外,我们还需要定义一个界面函数。该函数会打印系统的界面,同时进行功能提示。单独运行的效果就是我们刚刚看到的界面。
(5)定义显示所有名片信息的函数
# 定义一个显示所有名片信息的函数
def showCarInfo():
print("=" * 30)
print("名片信息如下:")
print("=" * 30)
print("序号 姓名 性别 手机号码")
i = 1
for tempInfo in carInfos:
print("%d %s %s %s" % (i, tempInfo['name'],tempInfo['sex'], tempInfo['phone']))
i += 1
5.1.5 任务实现——名片管理器
除了功能子函数外,我们还需要定义一个界面函数。该函数会打印系统的界面,同时进行功能提示。单独运行的效果就是我们刚刚看到的界面。
(6)定义主函数并调用它
def main():
while True:
printMenu()
key = input("请输入功能对应的数字")
if key == '1':
addCarInfo()
elif key == '3':
modifyCarInfo()
elif key == '4':
showCarInfo()
elif key==’5’
break
else:
print(“输入有误”)
main()
5.1.5 任务实现——名片管理器
除了功能子函数外,我们还需要定义一个界面函数。该函数会打印系统的界面,同时进行功能提示。单独运行的效果就是我们刚刚看到的界面。
$$