2017-05-09 13 views
1

簡單發生器功能我做:我的python生成器函數真的很懶嗎?

def myfunc(text): 
    for i in text[::-1]: 
     yield(i) 

for i in myfunc("anytext"): 
    print(i) 

text[::-1]內發電機的功能將首先評估或將懶洋洋地評估(從發生器函數預期)?

+3

它將被評估完全一樣,你做任何其他字符串切片:'str [...]'返回一個新的字符串,然後你循環。 「 – deceze

回答

2

在迭代之前,文本將被反轉。它不能以任何其他方式; for循環需要反轉文本才能遍歷它。

爲了讓它真的很懶,你需要使用索引。

def myfunc(text): 
    for i in range(len(text) - 1, -1, -1): 
     yield text[i] 

在Python 2中,代替的range使用xrange

當然,你基本上已經重新實現了內置函數reversed()

+0

」它不能是任何其他方式; for循環需要反向文本才能遍歷它。「不幸的措辭?你仍然在使用for循環。 – viraptor

+0

@viraptor'text [:: - 1]'需要被評估,然後根據結果生成一個迭代器,所以在這種情況下,需要生成「反轉文本」循環可以開始(當然,如果'str .__ getitem__'返回一個迭代器會是懶惰的) – donkopotamus

+1

好吧,'text [:: - 1]'*可以*返回一個迭代器而不是一個字符串...所以它可以是另一個辦法;它顯然不是。 – deceze