生成器send()函数跳过某些元素



似乎生成器函数infinite_palindromes跳过了一个回文101。第一个is_palindrome是检查一个正整数是否是回文的。然后定义生成器函数CCD_ 3以产生生成器对象CCD_。然后,有一个for循环来迭代生成器对象pal_gen,直到回文数的数字为三。整个代码如下:

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(is_palindrome(num))
i = (yield num)
print("after yield {0}".format(i))
if i is not None:
num = i
print("before increment {0}".format(num))
num += 1
print("after increment {0}".format(num))
pal_gen = infinite_palindromes()
for i in pal_gen:
print("--{0}".format(i))
digits = len(str(i))
if digits == 3:
pal_gen.close()
pal_gen.send(10**digits)

结果如下:

after increment 1
after increment 2
after increment 3
after increment 4
after increment 5
after increment 6
after increment 7
after increment 8
after increment 9
after increment 10
after increment 11
True
--11
after yield 100
before increment 100
after increment 101
True
after yield None
after increment 102
after increment 103
after increment 104
after increment 105
after increment 106
after increment 107
after increment 108
after increment 109
after increment 110
after increment 111
True
--111
Traceback (most recent call last):
File "test_generator_send.py", line 35, in <module>
pal_gen.send(10**digits)
StopIteration

我不明白为什么在for循环中没有打印回文101。谢谢你的帮助!

下面是对您的代码的重新处理,它将生成最小2位和最大3位的回文整数:

def ispalindrome(x):
assert x >= 0
if x < 11:
return False
n = 0
x_ = x
while x > 0:
n *= 10
n += x % 10
x //= 10
return n == x_
def genpalindrome():
x = 11
while True:
if ispalindrome(x):
yield x
x += 1
for p in genpalindrome():
if p >= 1_000:
break
print(p)

最新更新