第十一章 Python 函数设计
- 所谓的函数(function)其实就是一系列指令语句所组成,它的目的有两个。
- 1、当我们在设计一个大型程序时,若是能将这个程序依功能,将其分割成较小的功能,然后依这些较小功能要求撰写函数程序,如此,不仅使程序简单化,最后程序侦错也变得容易,另外撰写大型程序时应该是团队合作,每一个人负责一个小功能,可以缩短程序开发的时间。
- 2、在一个程序中,也许会发生某些指令被重复书写在许多不同的地方,若是我们能将这些重复的指令撰写成一个函数,需要用时再加以调用,如些,不仅减少编辑程序的时间,更可使程序精简、清析、明了。
- 当一个程序在调用函数时,Python 会自动跳到被调用的函数上执行工作,执行完后,会回到原先程序执行位置,然后继续执行下一道指令。
11-1 Python 函数基本观念
- 从前面的学习相信读者已经熟悉使用 Python 内置的函数了,例如,len()、add()、remove() 等,有了这些函数,我们可以随时调用使用,让程序设计变得很简洁,这一章主题将是如何设计这类的函数。
11-1-1 函数的定义
-
函数的语法格式如下:
-
def 函数名 (参数值1[ , 参数值2 , … ]):
‘’’ 函数批注 ‘’’
程序代码区块
return [ 返回值1 , 返回值2 , … ]
-
-
【函数名称】名称必须是唯一的,程序未来可以调用引用。
-
【参数值】这是可有可无的,完全视函数设计需要,可以接收调用函数传来的变量,各参数值之间是用逗号 “ , ” 隔开。
-
【函数批注】这是可有可无的,不过如果是参与大型程序设计计划,当负责一个小程序时,建议所设计的函数需要加上批注,除了自已需要也是方便他人阅读。 主要是注明此函数的功能,由于可能有多行批注所以可以用 3 个双引号(或单引号)包夹。
-
【return】[ 返回值1,返回值2,… ] 不论是 return 或接续右边的返回值皆是可有可无,如果有返回多个数据彼此需以逗号 “ , ” 隔开。
11-1-2 无参数无返回值的函数
-
例:第一次设计 Python 函数
def greeting(): print("Python 欢迎你") print("祝福学习顺利") print("谢谢") #以下的程序代码也可称主程序 greeting() greeting() greeting() #输出结果 Python 欢迎你 祝福学习顺利 谢谢 Python 欢迎你 祝福学习顺利 谢谢 Python 欢迎你 祝福学习顺利 谢谢
-
在程序设计的观念中,有时候我们也可以将第 6 行以后的程序代码称主程序。读者可以想想看,如果没有函数功能我们的程序设计如下所示
print("Python 欢迎你") print("祝福学习顺利") print("谢谢") print("Python 欢迎你") print("祝福学习顺利") print("谢谢") print("Python 欢迎你") print("祝福学习顺利") print("谢谢")
-
上述程序虽然也可以完成工作,但是可以发现重复的语句子太多了,这不是一个好的设计,同时如果要将 “ Python 欢迎你 ” 改成 “ Python 欢迎你们 ”,程序必须改5次相同的语句。经以上讲解读者应可以了解函数对程序设计的好处了吧!
11-1-3 在 Python Shell 执行函数
-
当程序执行完时,在 Python Shell 窗口可以看到执行结果,此时我们也可以在 Python 提示信息直接输入程序所建的函数启动与执行,下列是在 Python 提示信息输入 greeting() 函数的实例
greeting() #输出结果 Python 欢迎你 祝福学习顺利 谢谢
11-2 函数的参数设计
- 11-1 节的程序实例没有传递任何参数,在真实的函数设计与应用中大多是需要传递一些参数的,例如,在前面章节当我们调用 Python 内置函数时,如 len()、print() 等,皆需要输入参数,接下来将讲解这方面的应用与设计。
11-2-1 传递一个参数
-
例:函数内有参数的应用
def greeting(name): """Python 函数需传递名字 name """ print("嗨,",name,"早上好") greeting("张三") #输出结果 嗨, 张三 早上好
-
上述执行时,第 5 行调用函数 greeing() 时,所放的参数是 “ 张三 ”,这个字符串将传给函数括号内的 name 参数,所以程序第 3 行会将 “ 张三 ” 字符串透过 name 参数打印出来。
-
在 Python 应用中,有时候也常会将第 3 行写成下列语法,执行结果是相同的
-
特别留意由于我们可以在 Python Shell 环境调用函数,所以在设计与使用者交流的程序时,也可以先省略 3 行调用,让调用留到 Python 提示信息环境。
-
例:程序设计时不做调用,在 Python 提示信息环境调用。
def greeting(name): """Python 函数需传递名字 name """ print("嗨,",name,"早上好") #注:上面程序先保存不调用 #在 Python 提示信息环境调用 greeting("张三") greeting("李四") #输出结果 嗨, 张三 早上好 嗨, 李四 早上好
11-2-2 多个参数传递
-
当所设计的函数要传递多个参数,调用些函数时就需要特别留意传递的位置需要正确,最后才可以获得正确的结果。最常见的传递参数是数值或字符串数据,有时也会需要传递列表、元组或字典。
-
例:设计减法的函数 subtact(),第一个参数会减去第二个参数,然后列出执行结果。
def subtaract(x1,x2): '''减去设计''' result = x1 - x2 print(result) print("本程序会执行 a - b 的运算") a = int(input("a = ")) b = int(input("b = ")) print("a - b = ",end="") subtaract(a,b) #输出结果 本程序会执行 a - b 的运算 a = 10 b = 5 a - b = 5
-
上述函数功能是减法运算,所以需要传递 2 个参数,然后执行第一个数值减去第 2 个数值,调用这类的函数时,就必须留意参数的位置,否则会有错误信息产生。对于上述程序而言,变量 a 和 b 皆是从屏幕输入,执行第 10 行调用 subtaract() 函数时,a 将传给 x1,b 将传给 x2。
-
例:这也是一个需传递 2 个参数的实例,第一个是兴趣(interest),第二个是主题(subject)
def interest(interest_type,subject): '''显示兴趣和主题''' print("我的兴趣是" + interest_type) print("在" + interest_type + "中,最喜欢的是" + subject) print() interest("旅游",'敦煌') interest("程序设计",'Python') #输出结果 我的兴趣是旅游 在旅游中,最喜欢的是敦煌 我的兴趣是程序设计 在程序设计中,最喜欢的是Python
-
上述程序第 7 行调用 interest() 时,“ 旅游 ” 会传给 interest_type、“ 敦煌 ” 会传给 subject,第 8 行调用 interest() 时,“ 程序设计 " 会传给 interest_type 、” Python “ 会传给 subject ,对于上述的实例,相信读者应该了解调用需要传递多个参数的函数时,所传递参数的位置很重要否则会有不可预期的错误。如下列所示
def interest(interest_type,subject): '''显示兴趣和主题''' print("我的兴趣是" + interest_type) print("在" + interest_type + "中,最喜欢的是" + subject) print() interest('敦煌',"旅游") #输出结果 我的兴趣是敦煌 在敦煌中,最喜欢的是旅游
11-2-3 关键词参数 参数名称 = 值
-
所谓的关键词参数是指调用函数时,参数是用 ” 参数名称=值 “ 配对方式呈现,Python 也允许在调用需传递多个参数的函数时,直接将 ” 参数名称 = 值 “ 配对方式传送,这个时假参数的值置就不重要了。
-
例:
def interest(interest_type,subject): '''显示兴趣和主题''' print("我的兴趣是" + interest_type) print("在" + interest_type + "中,最喜欢的是" + subject) print() interest(interest_type = "旅游",subject = "敦煌") interest(subject = "敦煌" , interest_type = "旅游") #输出结果 我的兴趣是旅游 在旅游中,最喜欢的是敦煌 我的兴趣是旅游 在旅游中,最喜欢的是敦煌
-
当调用函数用配对方式传送参数时,即使参数值置错误,程序执行结果也会相同,因为在调用时已经明确指出所传递的值是要给哪一个参数了。
11-2-4 参数默认值的处理
-
在设计函数时也可以给参数默认值,如果调用这个函数没有给参数值,函数的默认值将派上用场。特别需要留意:函数设计时含有默认值的参数,必须放置在参数列的最右边。请参考下列程序第 1 行,如果将 ” subject= ’ 敦煌 ‘ “ 与 ” interest_type “ 值置对调,程序会有错误产生。
-
例:程序用不同方式调用,读者可以从中体会程序参数默认值的意义。
def interest(interest_type,subject = '敦煌'): '''显示兴趣和主题''' print("我的兴趣是" + interest_type) print("在" + interest_type + "中,最喜欢的是" + subject) print() interest("旅游") interest(interest_type = "旅游") interest("旅游",'张家界') interest(interest_type = "旅游",subject = '张家界') interest(subject = '张家界',interest_type = "旅游") interest("阅读",'旅游类') #输出结果 我的兴趣是旅游 在旅游中,最喜欢的是敦煌 我的兴趣是旅游 在旅游中,最喜欢的是敦煌 我的兴趣是旅游 在旅游中,最喜欢的是张家界 我的兴趣是旅游 在旅游中,最喜欢的是张家界 我的兴趣是旅游 在旅游中,最喜欢的是张家界 我的兴趣是阅读 在阅读中,最喜欢的是旅游类
-
上述程序第 7 行和 8 行只传递一个参数,所以 subject 就会使用默认值 “ 敦煌 ”,第 10、11和 11 行传送了 2 个参数,其中第 10 和 11 行笔者用 “ 参数名称 = 值 ” 用配对方式调用传送,可以获得一样的结果。第 13 行主要说明使用不同类的参数一样可以攻得正确语意的结果。
11-3 函数返回值
- 在前面的章节实例我们有执行调用许多内置的函数,有时会返回一些意义的数据,例如:len() 返回元素数量。有些没有返回值,此时 Python 会自动返回 None,例如:clear()。为何会如此?本节会完整解说函数返回值的知识。
11-3-1 返回 None
-
前 2 个小节所设计的函数全部没有 “ return [ 返回值 ] ”,Python 在直译时会自动返回处理成 “ return None ”,相当于返回 None。在一些程序语言,例如,C 语言这个 None 就是 NULL,None 在 Python 中独立成为一个数据类型 NoneType,下列是实例观察。
-
例:这个程序并没有做返回值设计,不过笔者将列出 Python 返回 greeting() 函数的数据是否是 None,同时列出返回值的数据类型。
ef greeting(name): """Python 函数需传递名字 name """ print("嗨,",name,"早上好") ret_value = greeting(