夜光序言:

了然于心,莫问纷飞。欲言又止,奈何心如止水

 

正文:

 

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 所示,第二次调用的情况也相似。

python Serial 不需要open吗_最小公倍数

图 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))