打卡链接
登录 - HydroOJhttps://hydro.ac/d/datawhale_p2s/user/63061
目录
range(x, y) 是左闭右开区间,包含 x,不包含 y
python原生的for循环非常慢,多层for循环尽量不用python写,效率慢
**Bad Style**:在知道循环范围的情况下使用 `while`
_在python中是一个黑洞,什么都可以装,不会变成任何一个变量
Chapter 5 循环 Loop
for 循环和循环范围
range(x, y) 是左闭右开区间,包含 x,不包含 y
如果想让右边也闭上的话,y+1
def sumFromMToN(m, n):
total = 0
# 注意: range(x, y) 是左闭右开区间,包含 x,不包含 y
for x in range(m, n+1):
total += x
return total
total += x # total = total + x
def sumFromMToN(m, n):
return sum(range(m, n+1))
range()是生成一个数列
当只有一个数时,range 起始范围默认为 0 # range(0, n)
第三个参数为 “步长” step
反转
for i in reversed(range(0,10,1)):
print(i)
python原生的for循环非常慢,多层for循环尽量不用python写,效率慢
while 循环
举个例子:依次找出 n 个 4 或者 7 的整数倍非负整数
def isMultipleOf4or7(x):
return ((x % 4) == 0) or ((x % 7) == 0)
def nthMultipleOf4or7(n):
found = 0
guess = -1
while found <= n:
guess += 1
if isMultipleOf4or7(guess):
found += 1
return guess
**Bad Style**:在知道循环范围的情况下使用 `while`
break 与 continue 语句
for n in range(200):
if n % 3 == 0:
continue # 跳过这次循环
elif n == 8:
break # 跳出当前整个循环
else:
pass # 啥也不做,占位符(不会被运行)
print(n, end=" ")
_在python中是一个黑洞,什么都可以装,不会变成任何一个变量
for _ in range(5):
假死循环
与环境交互后,在特定条件下终止的循环
判断一个数是不是质数
# 不是最快的写法,但最容易理解
def isPrime(n):
if n < 2:
return False
for factor in range(2,n):
if n % factor == 0:
return False
return True
for n in range(100):
if isPrime(n):
print(n, end=" ")
剪枝
不用暴力循环
先把偶数排除掉,算最大因子
# 快了一点
def fasterIsPrime(n):
if n < 2:
return False
if n == 2:
return True
if n % 2 == 0:
return False
maxFactor = round(n**0.5)
for factor in range(3, maxFactor+1, 2):
if n % factor == 0:
return False
return True
《人工智能》第4版 如果一个模型运算快,结果错,没有意义
总结
For 循环用于指定范围的重复操作。
`range()` 可以生成一个数字范围。
在不知道循环什么时间停止的时候,应该试试 While 循环。
循环同样也是可以嵌套的。
巧妙地使用 `break` 和 `continue` 语句。
合理的剪枝,缩小搜索范围/循环范围,可以大幅提高程序运行效率。