将 python for 循环写成 while?
writing python for loops as while?
出于教育目的,我想知道是否可以将 python 中的所有 for 循环重写为 while 循环。理论上,if和while是流控的最小集合。
搜索 SO 显示了这个关于基于范围的 for 循环的问题 Converting for loops to while loops in python, which is obviously doable as the starting and ending indices are exposed. What about other forms of for loops?例如,循环遍历各种形式的列表怎么样?
是的,可以这样做,但这可能不是一个好主意(有些人可能会说 unpythonic)。
当 for
循环遍历支持 iterator protocol 的内容时,您可以明确地模仿其操作,并将其转换为 while
循环。例如,
l = [1, 2, 3]
it = iter(l)
while True:
try:
print next(it)
except StopIteration:
break
我觉得这太丑了:-)
添加@AmiTavory 的答案——问题是在一般情况下您无法知道生成器会产生多少项目,这就是为什么在使用 while 循环时必须排除 StopIteration
的原因。考虑以下示例:
import random
def mygen(): # we don't know how many times this will yield
while True:
x = random.choice([1,2,3,4,5])
if x == 3:
break
yield x
# proper way
for x in mygen():
print x
print
# ugly way
g = mygen()
while True:
try:
print next(g)
except StopIteration:
break
出于教育目的,我想知道是否可以将 python 中的所有 for 循环重写为 while 循环。理论上,if和while是流控的最小集合。
搜索 SO 显示了这个关于基于范围的 for 循环的问题 Converting for loops to while loops in python, which is obviously doable as the starting and ending indices are exposed. What about other forms of for loops?例如,循环遍历各种形式的列表怎么样?
是的,可以这样做,但这可能不是一个好主意(有些人可能会说 unpythonic)。
当 for
循环遍历支持 iterator protocol 的内容时,您可以明确地模仿其操作,并将其转换为 while
循环。例如,
l = [1, 2, 3]
it = iter(l)
while True:
try:
print next(it)
except StopIteration:
break
我觉得这太丑了:-)
添加@AmiTavory 的答案——问题是在一般情况下您无法知道生成器会产生多少项目,这就是为什么在使用 while 循环时必须排除 StopIteration
的原因。考虑以下示例:
import random
def mygen(): # we don't know how many times this will yield
while True:
x = random.choice([1,2,3,4,5])
if x == 3:
break
yield x
# proper way
for x in mygen():
print x
print
# ugly way
g = mygen()
while True:
try:
print next(g)
except StopIteration:
break