第5章 函数的基本使用
来自CloudWiki
目录
函数的基本使用
函数是一段具有特定功能的、可重用的语句组,通过函数名来表示和调用
使用函数主要有两个目的,降低编程难度和增加代码复用。
- 函数是一种功能抽象,令它可以将一个复杂的大问题,分解成一系列简单的小问题。
- 函数可以一次编写、在一个程序当中的多个位置使用,降低了代码行数和维护难度。
函数的基本使用
函数的定义
- 函数定义语法:
def <函数名>([参数列表]): '''注释''' <函数体> return <返回值列表>
- 将可能需要反复执行的代码封装为函数,并在需要该功能的地方进行调用,不仅可以实现代码复用,更重要的是可以保证代码的一致性,只需要修改该函数代码则所有调用均受到影响。
- 设计函数时,应注意提高模块的内聚性,同时降低模块之间的隐式耦合。
- 例1:生日歌
def happy(): print("Happy birthday to you!") def happyTo(name): print("Happy birthday, dear {}!".format(name)) happy( ) happyTo("Mike") print() happyTo("Lily")
注意事项
- 即使该函数不需要接收任何参数,也必须保留一对空的圆括号
- 括号后面的冒号必不可少
- 函数体相对于def关键字必须保持一定的空格缩进
- 函数形参不需要声明类型,也不需要指定函数返回值类型
函数的使用
定义后的函数不能直接运行,需要经过调用才能得到运行。
调用函数的基本方法为:
<函数名>(<实际赋值参数列表>)
例:汇率计算器
def DolConvert(Num): Num =eval(Num); Dollar =Num /6; return Dollar Num = input("请输入人民币值: ") result = DolConvert(Num) print("能兑换的美元为:",result)
函数的参数传递
- 函数定义时圆括弧内是使用逗号分隔开的形参列表(parameters),函数可以有多个参数,也可以没有参数,但定义和调用时一对圆括弧必须要有,表示这是一个函数并且不接收参数。
- 调用函数时向其传递实参(arguments),根据不同的参数类型,将实参的引用传递给形参。
- 定义函数时不需要声明参数类型,解释器会根据实参的类型自动推断形参类型,在一定程度上类似于函数重载和泛型函数的功能。
位置参数
- 位置参数(positional arguments)是比较常用的形式,调用函数时实参和形参的顺序必须严格一致,并且实参和形参的数量必须相同。
>>> def demo(a, b, c): print(a, b, c) >>> demo(3, 4, 5) #按位置传递参数 3 4 5 >>> demo(3, 5, 4) 3 5 4 >>> demo(1, 2, 3, 4) #实参与形参数量必须相同 TypeError: demo() takes 3 positional arguments but 4 were given
关键参数
- 关键参数主要指调用函数时的参数传递方式,与函数定义无关。通过关键参数可以按参数名字传递值,明确指定哪个值传递给哪个参数,实参顺序可以和形参顺序不一致,但不影响参数值的传递结果,避免了用户需要牢记参数位置和顺序的麻烦,使得函数的调用和参数传递更加灵活方便。
>>> def demo(a, b, c): print(a, b, c) >>> demo(a=7, b=3, c=6) 7 3 6 >>> demo(c=8, a=9, b=0) 9 0 8
可选参数(默认值参数)
- 在调用带有默认值参数的函数时,可以不用为设置了默认值的形参进行传值,此时函数将会直接使用函数定义时设置的默认值,
- 需要注意的是,在定义带有默认值参数的函数时,任何一个默认值参数右边都不能再出现没有默认值的普通位置参数,否则会提示语法错误。
>>> def say( message, times =1 ): print((message+' ') * times) >>> say('hello') hello >>> say('hello',5) hello hello hello hello hello >>> say.func_defaults (1,)
函数的返回值
return语句用来结束函数,并将程序返回到函数被调用的位置,继续执行。return语句可以出现在函数中的任何部分。同时可以将零个、一个或多个函数运算的结果返回给函数被调用处的变量。
def multiply(x,y = 10): return x*y s = multiply(99,2) print(s)
当return返回多个值时,这些值形成了一个元组数据类型,有小括号和逗号分隔。
def multiply(x,y = 10): return x*y ,x+y s = multiply(99,2) print(s) a,b = multiply(99,2) print(a) print(b)
函数也可以没有return:
- 例:生日歌
def happy(): print("Happy birthday to you!") happy( )
变量的作用域
根据程序中变量所在的位置和作用范围变量分为局部变量和全局变量,局部变量仅在函数内部,且作用域也在函数内部,全局变量的作用域跨越多个函数。
局部变量
def multiply(x, y = 10): z = x*y return z s = multiply(99,2) print(s) print(z)
变量z是函数内部使用的变量,当函数调用后,变量z将不存在,所以会发生如下错误。
198 Traceback (most recent call last): File "D:/teaching/python/视频/Python语言程序设计/第五周视频课件/5-1.py", line 7, in <module> print(z) NameError: name 'z' is not defined
全局变量
全局变量只在函数之外定义的变量,在程序执行全过程有效。全局变量在函数内部使用时,需要提前使用保留字global声明。
n = 2 #n是全局变量 def multiply(x, y = 10): global n return x*y*n s = multiply(99,2) print(s)
代码复用
- 将可能需要反复执行的代码封装为函数,并在需要该功能的地方进行调用,不仅可以实现代码复用,更重要的是可以保证代码的一致性,只需要修改该函数代码则所有调用均受到影响。
- 设计函数时,应注意提高模块的内聚性,同时降低模块之间的隐式耦合。
- 松耦合代表了模块化,从系统观点来看,松耦合是总体设计原则。
实例解析:软文的诗词风
软文的诗词风,将原有文章根据标点符号重新切分成短句,并居中排版,对小屏幕阅读十分有利。使用程序将普通文章变成软文的诗词风,十分有趣,这是本实例的主要功能。
这个例子中通过调用两个函数,来完成软文的切分和软文的打印,将难题化解、从而降低了编程的难度。
# Example_5_1.py txt = ''' 人生得意须尽欢,莫使金樽空对月。 天生我材必有用,千金散尽还复来。 ''' linewidth = 30 # 预定的输出宽度 def lineSplit(line): plist = [',', '!', '?', ',', '。', '!', '?'] for p in plist: line = line.replace(p, '\n') return line.split('\n') def linePrint(line): global linewidth print(line.center(linewidth, chr(12288))) newlines = lineSplit(txt) for newline in newlines: linePrint(newline)
- Unicode 12288是汉字中的空格,这个空格与汉字同宽。
练习
例:计算平方和
如下函数返回两个数的平方和,请补充横线处代码
def psum(___①___): ___②___ a**2 + b**2 a=eval(input()) b=eval(input()) print(psum(a,b))
例:汇率计算器
def DolConvert(Num): Num =eval(Num); Dollar =Num /6; return Dollar Num = input("请输入人民币值: ") result = DolConvert(Num) print("能兑换的美元为:",result)
例: BMI判断
BMI = eval(input("请输入您的BMI值:")) if BMI<18.5: print("您的体型有点瘦") elif BMI<24.5: print("您的体型正常") elif BMI<26: print("您的体型偏胖") else: print("您的体型严重偏胖") print("测试结束!")