我想知道,为了教育的目的,是否有可能在循环中重写python中的所有循环。从理论上讲,如果和while是流量控制的最小集合。写入Python的循环为?
在SO周围搜索显示了关于基于范围的循环Converting for loops to while loops in python的问题,这显然是可行的,因为开始和结束索引是暴露的。那么其他forms of for loops呢?例如,如何循环遍历各种形式的列表?
我想知道,为了教育的目的,是否有可能在循环中重写python中的所有循环。从理论上讲,如果和while是流量控制的最小集合。写入Python的循环为?
在SO周围搜索显示了关于基于范围的循环Converting for loops to while loops in python的问题,这显然是可行的,因为开始和结束索引是暴露的。那么其他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
我觉得这是非常丑陋:-)
我认为迭代器类型的[python-level description](https://docs.python.org/2/library/stdtypes.html#iterator-types)比C API更适合这里。 – bereal
谢谢@bereal - 你是对的!纠正。 –
要通过@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
非常好的一点! –
你能说清楚“_list以其各种形式_”吗? –
@NadirSampaoli,例如'在第二个链接中提供的for循环与一个二元组作为它的迭代器'。另外,迭代器/生成器之间的性能差异等并不是我关心的问题,因为我只对等价性感兴趣。 – tinlyx