目录
4. 约瑟夫生者死者小游戏,来自菜鸟教程Python 约瑟夫生者死者小游戏 | 菜鸟教程
5. 五人分鱼,来自菜鸟教程Python 五人分鱼 | 菜鸟教程
1.求素数(质数)问题
i = 2
while(i < 100):
j = 2
while(j <= (i/j)):
if not(i%j): break
j = j + 1
if (j > i/j) : (print i, " 是素数")
i = i + 1
print ("Good bye!")
相当于
i = 2
while(i < 100):
j = 2
while(j <= (i/j)):
if not(i%j):
break
else:
j = j + 1
if(j > i/j):
print (i, " 是素数")
i = i + 1
print ("Good bye!")
从头解释一下代码。首先知道质数的定义是:在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。所以i和j的初始值都是2。i的范围为2-99。
代码中的 if not(i%j): break是指:当i可以整除j时,i%j=0,即布尔运算为false,这时用not(0),即将false转为了true,这样就可以运行break语句。
两个并列的选择结构while和if。while(i < 100)中的每次循环都是从j=2开始,除了i=2,3时i/j<j,之后每次循环都会先进入while判别式。
while循环的作用是,如果i不能被2整除,那就试试能不能被3,4,5,6,7...整除,最终测试结果有两种:一是能被某一数整除,退出循环,i=i+1,进入下一循环;二是不能被整除,进入与while并列的if选择结构,得出是素数的结论,i=i+1,进入下一循环。
2.求素数问题
for num in range(10,20): # 迭代 10 到 20 之间的数字
for i in range(2,num): # 根据因子迭代
if num%i == 0: # 确定第一个因子
j=num/i # 计算第二个因子
print ('%d 等于 %d * %d' % (num,i,j))
break # 跳出当前循环
else: # 循环的 else 部分
print ('%d 是一个质数' % num)
这里的问题主要是for和else的并列,这种情况很少见,查阅网上资料后得知原理为:如果else前不是break出的,就执行else语句。
3. 递归斐波那契数列,案例来自菜鸟教程
def recur_fibo(n):
# """递归函数
# 输出斐波那契数列"""
if n <= 1:
return n
else:
return(recur_fibo(n-1) + recur_fibo(n-2))
# 定义一个循环
while True:
try:
# 获取用户输入的数字
nterms = int(input("您要输出几项? "))
if nterms <= 0:
print("输入正数")
else:
print("斐波那契数列:")
for i in range(nterms):
print(recur_fibo(i))
#输出完斐波那契数列后退出while
break
except ValueError:
# 检查输入的数字是否正确
# 若输入的格式不正确则给予提醒
print('请输入正整数或零')
首先解释一下递归函数(百度百科):直接或间接调用函数本身,则该函数称为递归函数。
本例recur_fibo函数存在else:return到recur_fibo函数,意即再次调用本函数。
对代码进行解释:
while True表示对其包含的代码进行无限循环,直至执行到break命令。
try...except ValueError表示,先执行try中的代码,如果try中的代码出现ValueError错误,那么就执行except中的代码,用这里是防止输入字母或者符号。
nterms获取到用户输入的数字,进入if...else...选择结构,当输入的数字小于等于0或不为数字时,提醒重新输入;否则调用递归函数,输出斐波那契数列。
4. 约瑟夫生者死者小游戏,来自菜鸟教程Python 约瑟夫生者死者小游戏 | 菜鸟教程
# 创建一个空字典用来给每个人编号并表示他们是否在船上
people={}
for x in range(1,31):
people[x]=1
# print(people)
check=0
i=1
j=0
# 当编号小于等于三十一时,为一个循环
while i<=31:
# 如果编号等于31,那么从编号1继续
if i == 31:
i=1
# 如果船上剩余人数为15,退出while
elif j == 15:
break
# 在其他情况下执行以下语句
else:
# 如果编号为i的人键值为0,意思是他已经不在船上了,那么编号+1,重新进入while循环
if people[i] == 0:
i+=1
continue
# 编号为i的人键值不为0,执行以下语句
else:
# 检查数+1
check+=1
# 如果检查数为9,那么编号为i的人的键值变为0,输出编号下船,同时j+1表示下船的人数加一
if check == 9:
people[i]=0
check = 0
print("{}号下船了".format(i))
j+=1
# 检查数加一的情况下不等于9,则编号加一,进入while循环
else:
i+=1
continue
这个案例的难点在于嵌套层数过多,但是只要耐下心来一层一层去分析, 还是能够理解作者的用意。通过这个案例可以对字典和嵌套语句有更好的掌握。
5. 五人分鱼,来自菜鸟教程Python 五人分鱼 | 菜鸟教程
# 定义主函数
def main():
fish = 1
# 定义一个无限循环
while True:
total, enough = fish, True
# '_'是一个循环标志,可以用其他任何字符来代替,不参与循环中的运算
# range(5)表示要进行5次循环
# 循环一开始,total=fish,每次循环后,total的值发生变化,变成了(total - 1)的五分之四
for _ in range(5):
if (total - 1) % 5 == 0:
total = (total - 1) // 5 * 4
# 当for循环的if条件无法完成时,enough赋值为False,下面的if条件无法运行,while循环继续进行,fish数量加一
else:
enough = False
break
if enough:
print(f'总共有{fish}条鱼')
break
fish += 1
# if __name__ == '__main__':的作用是:只有在本程序中能执行,import到其它文件中不能执行
# 详细介绍请看https://blog.csdn.net/heqiang525/article/details/89879056
if __name__ == '__main__':
main()