Sage/Python非空生成器遍历后返回空元组问题求解
问题原因
该现象是Python生成器的标准特性,与SageMath无关。
你定义abc2时使用的圆括号包裹的表达式为生成器表达式,生成器属于一次性迭代对象:元素在迭代过程中逐个计算产出,遍历完成后迭代器即耗尽,无法再次读取内容。
你第一次通过for x in abc2循环已经消耗完abc2内的全部3个元素,后续再次遍历abc2时已无剩余元素,因此转换为元组后结果为空。
你可以通过纯Python代码复现该逻辑:
# 构造生成器 gen = (i for i in [1,2,3]) # 第一次遍历 for num in gen: print(num) # 输出 1、2、3 # 第二次遍历 print(tuple(gen)) # 输出 ()
修复方案
方案1(推荐):改用列表推导式
将生成器表达式替换为列表推导式,列表支持多次遍历:
# 把原来的圆括号换成方括号,得到列表而非生成器 abc2 = [(x * d).numerator() for x in abc]
修改后后续两次遍历都能正常获取元素。
方案2:每次迭代重新构造生成器
如果abc元素量极大,不想提前占用内存存储全部结果,可每次需要遍历时重新构造生成器:
# 第一次遍历,现场构造生成器 for x in ((x * d).numerator() for x in abc): show(type(x)) show(gcd(x.coefficients())) # 第二次遍历重新构造生成器 g = (gcd(x.coefficients()) for x in ((x * d).numerator() for x in abc)) print("g =", tuple(g))
内容的提问来源于stack exchange,提问作者emacs drives me nuts
相关产品推荐
相关产品推荐

