我想知道,爲了教育的目的,是否有可能在循環中重寫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