1. 最基本的 for-in 循环:
#eg1:
for i in range[1,11):
print("hello world!")
# for后的变量(此处为i)只是一个普通变量,可以不事先定义。
# range(start,end,step) ,step是间隔,三个参数都必须整数
# step如果省略,默认是1
# range(N):N是整数,相当于range(0,N),从0开始不包括N,即[0,N)
#eg2:利用for-in求和
sum = 0
for i in range(-10,11,3):
sum = sum + i
print("和为",sum)
变量 sum 在每一次 i 循环中都 +i ,在循环结束后输出 sum 的值即为范围内 i 的总和。
2. 应用
2.1 简单的因数问题
只要在 for-in 循环中间加入条件限制的 if 语句即可。
# eg1: 1-100之间能被3、7都整除的数
for i in range(1, 100 + 1):
if i % 3 == 0 and i % 7 == 0:
print(i)
# eg2: 找出 2000 到 3200 之间可以被 7 整除,但不能被 5 整除的所有数
# 输出: 所有满足条件的整数,以逗号分隔
for i in range(2000,3200):
if i % 7 == 0:
if i % 5 != 0:
print(i,end = ",")
# 改写:if i % 7 == 0 and i % 5 != 0:
# 改写2: and 变为 or,则意义变为?
# eg3: 输出N的全部因数
N = int(input("请输入正整数:"))
for i in range(1,N + 1):
if N % i == 0:
print(i)
由上面两个实例我们知道了判断整除的语句,由此可以尝试验证/寻找质数/合数:
质数即正整数集中只能被1和自身整除的数,合数即除此和1以外的所有数。
可以先从判定较为简单的质数入手,下面是质数判断的几种不同方法:
方法1:
N = int(input("请输入正整数:"))
count = 0 # 记录整除的次数
for i in range(1, N + 1):
if N % i == 0:
count = count + 1
if count == 2:
print(f"{N}是质数")
else:
print(f"{N}不是质数") # 1只被能被整除1次,已经排除在外
方法2: 方法1的优化,无需求出每个i的因数的count值
N = int(input("请输入正整数:"))
count = 0
for i in range(2, N+1):
if N % i == 0:
count = count + 1
break
# 只中断break语句所在的这一层循环,即中断这个i下的if循环;外层for-in循环依然继续
print("count = ", count)
# 实际上,输出的count值只可能为0或1.只要count值不为0,即意味着不为质数,先前又已经剔除了1,那么i即为合数
if count == 0:
print(f"{N}是质数")
else:
print(f"{N}是合数")
方法3: 利用布尔变量(True/False语句)判定代替count 0/1
N = int(input("请输入正整数:"))
Flag = True # False即状态改变,表示是质数
for i in range(2, N//2 + 1): #整除
if N % i == 0:
Flag = False
break
print("count = ", Flag)
if Flag == True:
print(f"{N}是质数")
else:
print(f"{N}不是质数")
方法4: 基于以上程序的进一步优化。如果N的值比较大,将 (2, N+1) 全部遍历效率比较低,故考虑如何在减少遍历范围达到相同判定效果:
对于N,判定其是否存在1和自身以外的因数i,实际上意味着 (2, N+1) 范围内有两个的数和( <= ),满足 = N;找到了就意味着的存在。所以实际上只要从2开始,遍历到最大的,即可找出N的所有因数对 (, )。
那么,由 <= ,可知遍历到就已经能够保证遍历所有可能的因数对。
对于N,即使事先并不知道其具体的每个因数,但一定存在;如果其为整数,则N为完全平方数,自然是合数;如果其不为整数,由于 range() 内 end 须为整数,那么就取比大的最小整数,以保证能遍历到比小的最大整数。实现如下:
# 修改处:
for i in range(2, int(N ** 0.5) + 1):
2.2 因数问题的扩展应用
2.2.1 闰年问题
关键在于能被4整除的数中还要进一步剔除能被100但不能被400整除的数。
# 求给定年份是否为闰年
Year = int(input())
if Year % 4 == 0:
if Year % 100 == 0 and Year % 400 != 0:
print("Year","不是闰年")
else:
print("Year","是闰年")
else:
print("Year","是闰年")
2.2.2 求合数和
# 求指定范围内合数和
A = int(input())
B = int(input())
asum = 0
for i in range(A,B):
if i == 2:
pass
elif i > 2:
for j in range(2,i):
if i % j == 0:
asum += i # 相当于 asum = asum + i
break
print(asum)
以上过程中先判定合数,再相加,因此将for-in循环进行了嵌套。
同样,可以参考2.1中判定质数的多种方法进行改写,此处略。
2.2.3 自整除数
自整除数即能被各个数位上的数字相加的数整除的数。
所有的个位数都是自整除数;要判定的是较大的数是否为自整除数。
方法1:
N = int(input())
primary = N # 将N保存到primary,保持不变,N变化
Total = 0
for i in range(1,N + 1):
GeWei = N % 10
Total = Total + GeWei
N = N // 10
if N == 0 :
break
if primaryNum % Total == 0:
print("YES")
else:
print("No")
方法2: 利用字符串也能被for-in遍历的特性
N = input() # 输入为字符串
Sum = 0
for i in N: # N是字符串,字符串也可以被for-in遍历,即逐一取出放入in之前的变量
Sum = Sum + int(i) # 将一个数字转换为整数
if int(N) % Sum == 0:
print("Yes")
else:
print("No")
3. for-in 循环的进阶:while 循环
3.1 用 while 语句来表示 for-in 循环:
# eg1: 求和
i = 1
Sum = 0
while i <= 100:
Sum += i
i += 1
print(Sum)
# eg2: 质数判定
# 修改处:
loopNum = 2
while loopNum < N:
if N % loopNum == 0:
Flag = False #不是质数
break
loopNum += 1
可以发现,while 循环只需指出循环维续的条件,而无需为循环指定起点、终点和步长。这意味着它在可以代替 for-in 这种固定循环的功能的同时,实现更多不事先指定循环长度的功能。
只要 while 后的条件表达式结果为True,就一直循环。
3.2 while True - break 循环:
1. 和 3.1 中的循环都是有固定终点的,而 while True 配合 break 语句可以在程序运行的时候自己控制终点。
while 后语句的结果不再受其后表达式的影响,即为 True,即循环永续;
但仍然需要将循环停止,所以为其指定停止的出发条件,再用 break 终止 while 循环。
# eg:
while True:
word = input('Please enter a word: ')
if word == "stop":
break
print('The word was ', word)
只要输入的内容不是“word“,就可以一直输入并得到即时输出。
4. while 循环的应用
4.1 角谷猜想
count = 0 # 记录直至结果为1的处理次数
while N != 1:
if N % 2 == 0:
N = N // 2
else:
N = N * 3 + 1
count += 1
print(N,end = " ")
print(count)
4.2 对称数的判断
N = int(input())
primaryNum = N
newNum = 0
while N != 0:
newNum = newNum * 10 + N % 10 # 最关键,N % 10得到个位数
N = N // 10 # 去除个位数
if newNum == primaryNum:
print("Yes")
else:
print("No")
5. 补充:continue 语句
# 求给定数的所有因数
N = int(input())
i = 2
while N != 1:
if N % i == 0:
print(i)
N = N // i
continue # 继续循环,但不执行continue所在循环体后的语句
i += 1