2016-01-24 58 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

非常好的一點! –