[英]Python generator confusing behavior
當我閱讀生成器教程https://realpython.com/introduction-to-python-generators/時,就會出現這個問題。 is_palindrome(101)
返回True,但是代碼並沒有打印101。我調試了一下,看到yield 101
導致執行回到main for
循環,然后立即返回到generator,非常混亂。 生成器產生 101,因此它應該是for j in pal_gen:
中for j in pal_gen:
一個元素,不是嗎?
def is_palindrome(num):
# Skip single-digit inputs
if num // 10 == 0:
return False
temp = num
reversed_num = 0
while temp != 0:
reversed_num = (reversed_num * 10) + (temp % 10)
temp = temp // 10
if num == reversed_num:
return True
else:
return False
def infinite_palindromes():
num = 0
while True:
if is_palindrome(num):
i = (yield num)
if i is not None:
num = i
num += 1
if __name__=='__main__':
pal_gen = infinite_palindromes()
for j in pal_gen:
print(f'j={j}')
digits = len(str(j))
if digits == 5:
pal_gen.close()
pal_gen.send(10 ** (digits))
目前的輸出是:
j=11
j=111
j=1111
j=10101
Traceback (most recent call last):
File "generator.py", line 33, in <module>
pal_gen.send(10 ** (digits))
StopIteration
你會注意到它在每個之間跳過一個。 101不見了,1001不見了。 10001 丟失。 我很確定send
會導致生成器運行到下一個 yield 語句。 例如,使用以下代碼:
if __name__=='__main__':
pal_gen = infinite_palindromes()
for j in pal_gen:
print('j={}'.format(j))
digits = len(str(j))
if digits == 5:
pal_gen.close()
print(pal_gen.send(10 ** (digits)))
這將打印出“j”之間的缺失值:
j=11
101
j=111
1001
j=1111
10001
j=10101
考慮用一段while
重做你的for
語句:
if __name__=='__main__':
pal_gen = infinite_palindromes()
j=next(pal_gen)
digits=0
while digits<5:
print('j={}'.format(j))
digits = len(str(j))
j = pal_gen.send(10 ** (digits))
else:
pal_gen.close()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.