我正在阅读这篇文章,我发现以下程序让我感到困惑:
def is_palindrome(num):
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):
print("found a palindrome: "+str(num))
j = (yield num)
print("j = "+str(j))
if j is not None:
num = j
print("num = "+str(num))
num +=1
pal_gen = infinite_palindromes()
for i in pal_gen:
print("i = "+str(i))
digits = len(str(i))
pal_gen.send(10 ** (digits))
输出以:
开头我不明白为什么在找到回文数:101之后,没有出现i = 101并且 j = 1000?
我的想法: 程序开始。通过 for i in pal_gen:,程序开始运行 infinite_palindromes() 中的 while 循环。当 num=10 且 num += 1 时,if 子句 is_palindrome 被满足。然后,当程序读取“yield”时,它会继续 print("i = "+str(i))。然后,使用 pal_gen.send(10 ** (digits)) 返回到行 j = (yield num) 处的生成器,并将值 100 分配给 j。然后它也将 100 分配给 num,然后将 num 增加到 101。因为这是一个回文,所以我们再次进入 if 子句,因此程序打印“found a palindrome: 101”。程序读取并执行的下一行现在又是 j = (yield num)。而且我认为和之前的情况是一样的,所以我想象在读完“yield”之后,程序继续在print(“i =”+str(i))...等等。
在
for i in pal_gen:
的第一次运行中,pal_gen 检测回文11
。之后,生成器在 yield
语句处暂停,并执行循环体。
第二个回文数 111 被
pal_gen.send(10 ** digits)
检测到,这会恢复生成器执行,并将 j
的值设置为 100
。
找到回文111
后,生成器再次暂停,并将控制权传回for i in pal_gen:
循环。
在循环
for i in pal_gen:
的第二次运行中,它恢复生成器的执行,但由于没有任何内容发送到生成器,因此 j
的值是 None
。