2016-01-24 94 views
2

我想知道,为了教育的目的,是否有可能在循环中重写python中的所有循环。从理论上讲,如果和while是流量控制的最小集合。写入Python的循环为?

在SO周围搜索显示了关于基于范围的循环Converting for loops to while loops in python的问题,这显然是可行的,因为开始和结束索引是暴露的。那么其他forms of for loops呢?例如,如何循环遍历各种形式的列表?

+0

你能说清楚“_list以其各种形式_”吗? –

+0

@NadirSampaoli,例如'在第二个链接中提供的for循环与一个二元组作为它的迭代器'。另外,迭代器/生成器之间的性能差异等并不是我关心的问题,因为我只对等价性感兴趣。 – tinlyx

回答

5

是的,可以这样做,但这可能不是一个好主意(有些人可能会说它是unpythonic)。

for循环遍历某些支持iterator protocol的东西时,可以明确模仿它的操作,并将其转换为while循环。例如,

l = [1, 2, 3]                                               

it = iter(l)                  
while True:                  
    try:                   
     print next(it)              
    except StopIteration:              
     break     

我觉得这是非常丑陋:-)

+0

我认为迭代器类型的[python-level description](https://docs.python.org/2/library/stdtypes.html#iterator-types)比C API更适合这里。 – bereal

+0

谢谢@bereal - 你是对的!纠正。 –

3

要通过@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 
+1

非常好的一点! –