夜光序言:
了然于心,莫问纷飞。欲言又止,奈何心如止水
正文:
3.1 Python 函数
3.1.1 目标
函数是程序中一个重要的部分,在系统中已经定义了一些函数,例如计算平方根的函数sqrt,程序中自己也可以定义函数,教学目标就是来学习函数的定义方法,例如定义函数找出两个数的最小公倍数与最大公约数。
3.1.2 函数定义
实际上读者对函数并不陌生,Python 语言中有大量的内部函数,程序的主体主程序就是一个函数,除此之外在程序中还可以定义自己的函数。
def 函数名称( 参数 1, 参数 2,„„):
函数体
函数名称是用户自己定义的名称,与变量的命名规则一样。用字母开始,后面跟若干个字母、数字等。
函数可以有很多参数,每一个参数都有一个名称,它们是函数的变量,不同的变量对应的函数值往往不同,这是函数的本质所在,这些参数称为函数的形式参数。函数体是函数的程序代码,它们保持缩进。
函数被设计成为完成某一个功能的一段程序代码或模块,Python 语言把一个问题划分成多个模块,分别对应一个个的函数,一个 Python 语言程序往往有多个函数组成。
3.1.3 函数参数与返回值数
1、函数参数
在调用函数时,形式参数规定了函数需要的数据个数,实际参数必须在数目上与形式参数一样,一般规则是:
(1)形式参数是函数的内部变量,有名称。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用;
(2)实际参数的个数必须与形式参数一致,实际参数可以是变量,常数、表达式、甚至是一个函数;
(3)当实际参数是变量时,它不一定要与形式参数同名称,实际参数变量与形式参数变量是不同的内存变量,它们其中一个值的变化不会影响到另外一个变量。
(4)函数调用中发生的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参,因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化;
(5)函数可以没有参数,但此时圆括号不可缺少;
2、函数返回值
函数的值是指函数被调用之后, 执行函数体中的程序段所取得的并返回给主调函数的值。一般函数计算后总有一个返回值,通过函数内部的 return 语句来实现这个返回值,格式是:
return 表达式;
return 返回一个数据类型与函数返回类型一致的表达式,该表达式的值就是函数的返回
值。
return 语句执行后函数就结束了,即便下面还有别的语句也不再执行,例如:
def fun(x):
print(x)
if x<0:
return
print(x*x)
x=-2
fun()
结果为:
-2
因为 x<0 成立后执行了 return 语句,函数返回并结束,后面的 print(x*x)不再执行,但是
x=2
fun()
结果为:
2
4
函数一直执行到最后一条语句后结束。
注意 return 语句只要一执行函数就结束并且返回,无论 return 处于什么位置,哪怕是在一个循环中,例如下列函数 IsPrime 测试整数 m 是否是素数:
def IsPrime(m):
print("start")
for i in range(2,m):
print(i)
if m%i==0:
return 0
print("OK")
return 1
print("Return: ",IsPrime(9))
在 9 传入 m 后,当 i=3 时满足条件,执行 return,那么函数返回 0 就结束了,剩余的循环也不再执行,剩余的语句也不再执行。
3、没有返回值的函数
函数也可以没有返回值,这时 Python 默认值是 None。例如下面函数:
def SayHello()
print(“Hello,everyone!”);
没有返回类型的函数中也可以有 return 语句,但 return 后面不可以有任何表达式,例如:
def fun(x):
if(x<0) return; #/在 x<0 时结束函数并返回
printf(x)
4、函数调用
函数调用是比较简单的,调用自己编写的函数就象调用 Python 语言内部函数一样。有返回值的函数可以放在合适的任何一个表达式中去计算,当然也可以单独作为一条语句执行。
而没有返回值的函数不能用在任何一个表达式中去参加计算,只能作为单独的一条语句执行。
但 Python 语言中规定,函数必须先定义才可以调用,既在调用函数时编译器必须已经先知道该函数的参数构造,不然编译会出错误。
例 3-1-1:输入 2 个整数,找出它们中的最大值。
def max(a,b):
c=a
if b>a:
c=b
return c
#调用 max
m=max(2,4)
print(m)
其中 max 为函数名称,a,b 是变量,我们在主程序中调用这个函数。注意一个函数定义后时不执行的,只有在调用它时才执行。该程序的第一条执行语句是 m=max(2,4),不是 def max(a,b)。
例 3-1-2:输入 3 个整数,找出它们中的最大值。
设这 3 个整数是 a、b、c,要找它们中的最大值,只要先找到 a 与 b 的最大值,设为 d,
再把这个最大值 d 与 c 比较,找到 d 与 c 的最大值,设为 e,既找到了 a、b、c 中的最大值。
在这个问题中两次用到了在两个数中找最大值的方法,可以设计一个函数 max,它的使用规则是:
max(x,y);
向 max 提供两个整数 x 与 y,max 就可以返回 x 与 y 的最大值。显然如计算 a、b、c 中的最大值,只要:
d=max(a,b);
e=max(d,c);
有了这样的 max(x,y)函数,找出 a、b、c 中的最大值的程序可以编写如下:
def max(a,b):
c=a
if b>a:
b
return c
a=input("a=")
b=input("b=")
c=input("c=")
a=float(a)
b=float(b)
c=float(c)
d=max(a,b)
e=max(d,c)
print("max=",e)
在第一次调用它时,把变量 a 传给 x,变量 b 传给 y,其中 x、y 称为函数的形式参数,a、b 称为实际参数。形式参数实际上就是函数内部的变量,x、y 与函数内部的变量 z 是同性质的变量,它们在内存中有自己的存储空间。当调用 max 函数时,实际参数把它们的值传递给形式参数变量,或者说形式参数复制了实际参数的值,如图 3-1-1 所示,第二次调用的情况也相似。
图 3-1-1
3.1.4 【案例】 最大公约数与最小公倍数
1、案例描述
输入两个正整数,求出它们的最大公约数与最小公倍数。
2、案例分析
求最大公约数与最小公倍数的方法很多,一个比较直观的方法是采用逐个尝试法。
求 a,b 的最大公约数 d,那么设置 m=min(a,b),一定 d<=m,即 d 比 a,b 中最小的一个还小,于是可以从序列 m,m-1,m-2,...,2,1 中去寻找能被 a,b 除尽的数 d,找到的第一个 d 就是 a 与 b 的最大公约数,最坏的情况是 d=1。
求 a,b 的最小公倍数 c,那么设置 m=max(a,b),一定 d>=m,即 d 比 a,b 中最大的一个还大,于是可以从序列 m,m+1,m+2,...,a*b 中去寻找能被 a,b 除尽的数 d,找到的第一个 d就是 a 与 b 的最小公倍数,最坏的情况是 c=a*b。
3、案例代码
#最大公约数函数
#d 最小为 1,必定会返回
def maxDivider(a,b):
c=a
if b<a:
c=b
for d in range(c,0,-1):
if a%d==0 and b%d==0:
return d
#最小公倍数函数
#d 最多为 a*b,必定返回
def minMultiplier(a,b):
c=a
if b>a:
c=b
m=a*b
for d in range(c,m+1,1):
if d%a==0 and d%b==0:
return d
#主程序
a=input("a=")
b=input("b=")
a=int(a)
b=int(b)
print("最大公约数",maxDivider(a,b))
print("最小公倍数",minMultiplier(a,b))