我想在Python3.4中执行以下有限或无限生成器函数(取决于关键字terminate
的值):
def generate_integers(begin, terminate = None):
k = begin
while k<terminate or terminate==None:
yield k
k = k + 1
我通过以下命令运行此功能:
g = generate_integers(0)
print(next(g))
print(next(g))
但是,Python会返回以下错误消息:
TypeError: unorderable types: int() < NoneType()
我在解释此错误时遇到问题,因为该函数在两个实例中运行良好,尽管这些实例在我看来与错误消息无关:
while terminate==None:
函数中仅使用条件表达式generate_integers(begin,terminate==None):
时,该函数返回所需的值,并且没有错误消息。你能解释一下错误信息吗?你有解决这个问题的想法吗?
答案 0 :(得分:8)
将测试更改为首先检查terminate
是否为None
对象:
while terminate is None or k < terminate:
or
短路;如果terminate is None
为真,则不会执行k < terminate
的测试。
你的代码在Python 2中运行,因为Python试图让所有东西都可以订购; None
仅在整数之前排序,因为Python试图支持排序异构列表。事实证明这是一个难以跟踪的错误的来源,并且在Python 3中纠正了错误。
但请注意,当terminate = None
为any_integer < None
时,您的原始代码不在Python 2上工作,在Python 2上始终为False ,至少对于CPython来说。语言规范只规定不同类型之间的顺序是稳定的,而不是那个顺序应该是什么; Jython和IronPython完全可以在整数后对None
进行排序。