Python 生成器令人困惑的行为
Python generator confusing behavior
这个问题是在阅读生成器教程时出现的https://realpython.com/introduction-to-python-generators/。 is_palindrome(101)
returns 是的,但是代码没有打印 101。我调试看到 yield 101
导致执行回到主 for
循环,它立即回到生成器,这非常令人困惑。生成器产生 101,因此它应该是 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's":
之间的缺失值
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()
这个问题是在阅读生成器教程时出现的https://realpython.com/introduction-to-python-generators/。 is_palindrome(101)
returns 是的,但是代码没有打印 101。我调试看到 yield 101
导致执行回到主 for
循环,它立即回到生成器,这非常令人困惑。生成器产生 101,因此它应该是 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's":
之间的缺失值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()