python - Python生成器在应该提供的时候没有提供yield
问题描述
我有一个经过简化的脚本,可以为我提供一系列数字。我已经在 Windows 10 下运行了这个,同时使用 Python3.6 和 Python3.8
如果脚本与以下行一起运行: pal_gen.send(10 ** (digits)) 注释掉了,我得到了我的预期。但是我想在 num % 10 = 0 时更改序列。
剧本:
def infinite_pal():
num = 0
while True:
#print(f"num= {str(num)}")
if num % 10 ==0:
#if num==20: print(f"Have num of {str(num)}")
i = (yield num)
#if num==20: print(i)
if i is not None:
num = i
#print(f"i = {str(i)} num= {str(num)}")
num += 1
if num==112: break
pal_gen = infinite_pal()
for i in pal_gen:
print(i)
digits = len(str(i))
#print(f"result = {str(10 ** (digits))}")
pal_gen.send(10 ** (digits))
给出 0, 30
我本来预计:0、10、20、20、20 等。
当 num 的值为 20 时,yield 表达式似乎被调用,但值 20 从未发送到 pal_gen 循环中的 for i 调用。num 值确实达到 30 并产生。30 不应出现。
我是否完全误解了 .send 的效果 非常感谢。我可以用另一种方式做到这一点,但我很困惑为什么上述方法不起作用。
从一个较早的问题,python 生成器 yield 语句不是 yield,我尝试了 - 但它仍然没有给出我所期望的:
def infinite_pal():
num = 0
while True:
if num % 10 ==0:
#if num==20: print(f"Have num of {str(num)}")
i = (yield num)
#if num==20: print(i)
if i is not None:
num = i
#print(f"i = {str(i)} num= {str(num)}")
num += 1
pal_gen = infinite_pal()
i = pal_gen.send(None)
while True:
print(i)
digits = len(str(i))
#print(f"result = {str(10 ** (digits))}")
i=pal_gen.send(10 ** (digits))
if i>200: break
解决方案
0, 10, 20, 20, 20
如果您发送10
, 100
, 1000
,我不知道您为什么期望结果10000
在第二个版本中,您必须发送
i = pal_gen.send(10*(digits-1))
但它会提供无穷无尽的20
,所以如果你期望其他值,那么它将需要完全不同的代码。
def infinite_pal():
num = 0
while True:
if num % 10 ==0:
i = yield num
if i is not None:
num = i
num += 1
pal_gen = infinite_pal()
i = pal_gen.send(None)
while True:
print(i)
digits = len(str(i))
i = pal_gen.send(10*(digits-1))
## `i` never will be bigger then `20` so next lines are useless
#if i > 200:
# break
推荐阅读
- python - 使用黑色格式化程序嵌套长列表和集合
- python - 在 pydantic 模型中初始化 Literal 枚举
- javascript - 大型 React 项目,如何保持多个 fetch 请求 DRY
- docker - 使用 mariaDB 错误消息通过 Docker 部署 mariaDB 和 nextcloud
- sql - 根据非重复列查找重复项
- java - 如何跟踪 Java 函数应用程序的依赖关系
- three.js - Three.js RGBE Loader 使用 URL 加载 HDR
- r - 更改单选按钮选择时更改 numericInput 中的值
- c - 从 Packet MMAP 读取 tpacket3_hdr 并获取有效负载主体
- gitlab - 如何为批准创建 GitLab 规则