学习笔记:
'''
程序结构:
1.一些简单的程序可以只用一个程序文件(.py文件)实现,但绝大多数的Python程序通常是由多个程序文件组成的。
2.程序结构 指的是 将一个求解问题的程序分解为若干个源程序文件的集合 以及 将这些文件连接在一起的方法。
3.Python程序通常由一个主程序以及多个模块组成。
主程序:定义了程序的主控流程,是执行程序的启动文件,属于顶层文件。
模块:指程序中的函数库,相当于子程序。
'''
import pytest
pytest.hello(pytest.name)
pytest.bey(pytest.name)
pytest.disp(6)
pytest.show(5)
'''
模块的有条件执行:
一个程序文件(.py文件)可以作为一个模块,以磁盘文件的形式存在。
需求:
模块中的定义部分(如定义变量、定义函数、定义类等),因为没有程序入口,所以不能直接运行;
但对于模块的主程序部分有时候希望只让它在模块执行时才执行,被调用时不执行;在Python可以使用系统变量__name__的值来区分这两种情况。
__name__:是一个系统全局变量,在模块中用来标识模块名称。
(1)模块中主动执行时是:字符串 "__main__"
(2)模块被调用时是:模块的名称
应用:通过if判断来实现模块的主程序部分在模块执行时才执行,被调用时不执行。
格式:
if __name__ == "__main__":
'''
print(__name__) # __main__ 在本文件中显示__main__,当被调用时显示文件名。
if __name__ == '__main__':
print("以下是文件执行时显示,调用时不显示的部分!") # 以下是文件执行时显示,调用时不显示的部分!
'''
函数应用举例:
1.求y = e **2 + 1+lnN/2Pi的1-100的累加和;利用lambda函数求累加项,循环控制100次。
'''
from math import *
f = lambda n: (1 + log(n)) / (2 * pi)
y = exp(2.0)
for n in range(1, 101):
y += f(n)
print('y=', y) # y= 81.19547002494745
'''
2.先定义i ** m的1-n的累加和,然后调用求s = k 的1-100的累加和 + k ** 2 的1-50的累加和 + 1/k 的1-10的累加和。
'''
def mysum(n, m):
s = 0
for i in range(1, n + 1):
s += i ** m
return s
def fun2():
s = mysum(100, 1) + mysum(50, 2) + mysum(10, -1)
print(f's={s}')
fun2()
'''
3.设计一个程序,求满足以下两个要求的分数的个数:
(1)1/6 < x < 1/5
(2)x的分子、分母都是素数且分母是2位数。
分析:设x=m/n,根据条件(2)有10 <= n <=99;根据条件(1)有5m <= n <= 6m,并且m、n都为素数。
用穷举法:设计一个函数判断一个数是否为素数,是则返回True,不是则返回False。
'''
def is_prime(n): # 穷举法判断是否为素数
found = True
for j in range(2, int(sqrt(n) + 1)): # sqrt(n):计算n的平方根
if n % j == 0: # 如果能被整除,则n不是素数,返回False。
found = False
return found
def fun3():
count = 0 # 计数器
for n in range(11, 100):
if is_prime(n): # 当函数is_prime()返回True时,才会继续执行下面程序。
for m in range(n // 6 + 1, n // 5 + 1): # // 整除符号; m取n//6+1到n//5+1范围内的所有整数。
if is_prime(m):
print(f'{m}/{n}')
count += 1
print(f'满足条件的个数为:{count}个')
fun3()
'''
4.汉诺塔问题:
有三根柱子A、B、C,A上堆放了n个盘子,盘子大小不等,大的在下,小的在上;
现要求把n个盘子从A借助B转移到C,每次只允许移动一个盘子。在移动的过程中在3个柱子上都保持大盘在下,小盘在上;
打印出该步骤。
'''
cnt = 0
def hanoi(n, a, b, c):
global cnt
if n == 1:
cnt += 1
move(n, a, c)
else:
hanoi(n - 1, a, c, b)
cnt += 1
move(n, a, c)
hanoi(n - 1, b, a, c)
def move(n, x, y):
print(f'第{cnt}步:将{n}从{x}移动{y}')
def fun4():
print('汉诺塔(Tower of Hanoi)\n'
'从柱子A开始移动。\n'
'请输入盘子个数:')
n = eval(input())
print(f'移动{n}个盘子的步骤如下:')
hanoi(n, 'A', 'B', 'C')
fun4()
test.py内容:
import math
name = '小明'
age = 20
def greet():
print(f'这是pytest.py中的greet函数,我的名字:{name},我的年龄:{age}')
'''
主程序入口检查或脚本入口检查:if __name__ == '__main__'
作用:用于判断一个模块是否是作为主程序执行的。
如果是,代码块中的内容将被执行;
如果模块被导入到其他模块中,则这些代码块不会被执行。
这个机制使得模块既可以作为独立的脚本执行,也可以被导入并作为其他程序的一部分使用,而不干扰到主程序的逻辑。
'''
if __name__ == '__main__':
print('以下是pytest.py被调用时不可见的内容')
def say_hello():
print('hello')
say_hello()
def fun1():
print('这是pytest.py中的fun1函数')
def hello(person):
print(f'hello,{person}')
def bey(person):
print(f'bey,{person}')
def disp(r):
print(math.pi * r * r)
def show(n):
disp(n)
运行结果:
hello,小明
bey,小明
113.09733552923255
78.53981633974483
__main__
以下是文件执行时显示,调用时不显示的部分!
y= 81.19547002494745
s=47977.92896825397
2/11
3/17
5/29
7/37
7/41
11/59
11/61
13/67
13/71
13/73
17/89
17/97
19/97
满足条件的个数为:13个
汉诺塔(Tower of Hanoi)
从柱子A开始移动。
请输入盘子个数:
3
移动3个盘子的步骤如下:
第1步:将1从A移动C
第2步:将2从A移动B
第3步:将1从C移动B
第4步:将3从A移动C
第5步:将1从B移动A
第6步:将2从B移动C
第7步:将1从A移动C
Process finished with exit code 0