零基础 学 python开发 (Genius套餐A)十五

版权声明:Genius https://blog.csdn.net/weixin_41987706/article/details/90022771

夜光序言:

 

 

 

 

失眠往往让人痛苦不堪,因为在安静的夜里,面对黑夜无声的世界,人们往往比白天冷静得多,看事物也似乎更理性。冷静与理性之后,悲哀的发现,自己往往离事物的真相与本质会很近。这对习惯当鸵鸟的人们来说,意味着惊恐和不安。

 

 

 

 

 

 

正文:

3.3 函数调用 
3.3.1 目标 


在 Python 语言中,所有的函数定义,包括主函数主程序在内,都是平行的。函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。

目标就是来掌握函数的调用关系,掌握参数传递的规则。
 



3.3.2 函数调用 


程序的执行总是从主程序函数开始,完成对其它函数的调用后再返回到主程序函数,最后由主程序函数结束整个程序。

嵌套调用就是一个函数调用另外一个函数,被调用的函数又进一步调用另外一个函数,形成一层层的嵌套关系,一个复杂的程序存在多层的函数调用。如图 3-3-1 所示展示了这种关系,主程序函数调用函数 A,在 A 中又调用函数 B,B 又调用 C,在 C 完成后返回 B 的调用处,继续 B 的执行,之后 B 执行完毕返回 A 的调用处,A 又接着往下执行,随后 A 又调用 D 函数,D 执行完后返回 A,A 执行完后返回主程序函数,主程序接着往下执行,主程序完成后程序就结束了。


图 3-3-1 函数嵌套调用
对应的程序结构如下:
def D(): 
……
def C():
……
def B():
……
C()
……
def A() :
……
B()
……
D()
……
#主程序
……
A()
……
函数调用可以这样一层层地嵌套下去,但函数调用一般不可以出现循环,如图 3-3-2所示是一个循环,函数 X 调用函数 Y,Y 又反过来调用 X,之后 X 又调用 Y,……,没完没了,形成死循环。

图 3-3-2 函数循环

 



 
例 3-3-1: 输入整数 n,计算 1+(1+2)+(1+2+3)+……+(1+2+3+……+n)的和。 


显然第 m 项是(1+2+……m),设计一个函数计算(1+2+……m)的和,函数为 sum(m),之后在累计 sum(1)+sum(2)+ ……+sum(n)既可以了,程序如下:
 

def sum(m):
 s=0
 for n in range(1,m+1):
 s=s+n
 return s
def sumAll(n):
 s=0
 for m in range(1,n+1):
 s=s+sum(m)
 return s
n=input("n=")
n=int(n)
print("总和是",sumAll(n))


例 3-3-2: 输入一个正整数,找出它的所有素数因素。

 
例如 12 的因素有 1,2,3,4,6,12,但是只有 1,2,3 是素数,因此 12 的素数因素为 1,2,3
 

def IsPrime(m):
 for n in range(2,m):
 if m%n==0:
 return 0
 return 1
n=input("n=")
n=int(n)
for p in range(1,n+1):
 if n%p==0 and IsPrime(p)==1:
 print(p)


3.3.3 【案例】验证歌德巴赫猜想 


1、案例描述 
著名的歌德巴赫猜想预言,任何一个大于 6的偶数都可以分解成为两个素数的和,例如:
6=3+3、8=3+5、10=5+5、12=5+7 等,编一个程序验证在 100 之内的偶数都可以这样分解。
 
2、案例分析 
一个偶数 n 可以分解成两个数 p 与 q 的和,既 n=p+q,显然只要找到 p 与 q 都是素数的分解就可以,为此可以设计一个判断素数的函数:
IsPrime( m);
它判断 m 这个整数是否是素数,如是就返回 1,不然返回 0。通过调用 IsPrime(p)及IsPrime(q)就可以知道 p 与 q 是否同时为素数。


3、案例代码 
 

def IsPrime(m):
 for n in range(2,m):
 if m%n==0:
 return 0
 return 1
for n in range(6,101,2):
 for p in range(3,n+1,2):
 q=n-p
 if IsPrime(p) and IsPrime(q):
 print(n,"=",p,"+",q)
 break

注意找到一组(p,q)都是素数时就 break 退出 p 的循环,不用再次寻找别的(p,q)组,break只是退出它自己的 p 变量循环,不是退出 n 循环,n 循环继续执行,分解下一个 n 为两个素数的和。
6 = 3 + 3
8 = 3 + 5
10 = 3 + 7
12 = 5 + 7
14 = 3 + 11
16 = 3 + 13
18 = 5 + 13
20 = 3 + 17
......

猜你喜欢

转载自blog.csdn.net/weixin_41987706/article/details/90022771