class OddNum():
def __next__(x):
if x%2 != 0:
print x
def main():
a = iter(OddNum(1))
while next(a)<100:
try:
print(next(a))
except StopIteration:
break
main()
上面是我正在使用的代码。主代码已经给出了,所以我没有写。所有这一切都应该做的是打印奇数1-100。
我得到的错误是:
Traceback (most recent call last):
line 36, in <module>
main()
line 29, in main
a = iter(OddNum(1))
TypeError: this constructor takes no arguments
3条答案
按热度按时间ih99xse11#
看起来你被分配了一个陷阱问题。
给定的
main
函数实际上每次循环都会从迭代器中获取 * 两个 * 值,但只打印第二个值。因此,OddNum
迭代器需要连续两次产生每个数字。但请注意,这意味着您可以简化问题:只要使
OddNum(n)
产生从n-1
开始的 * 所有 * 数字。因此,如果你在OddNum(1)
上调用它,main
函数将首先获取一个0
,看到它是< 100
,然后获取并打印1
,然后获取一个2
,看到它是< 100
,然后获取并打印3
,依此类推。这意味着你的答案可以很简单:
或者,如果你想明确地写出来:
或者,如果你想把它写成一个迭代器类而不是生成器:
当然,如果你不想利用这个技巧(或者认为你的老师不希望你这样做),你应该能够改变上述任何一个来计算奇数并产生两次。事实上,如果我是你,我会用两种方式来写,并加上适当的注解,以证明我理解了这个问题以及背后发生了什么,而不是仅仅提交上面的代码。
qxsslcnc2#
这是一个糟糕的任务,因为它没有语义意义。
main()
调用next()
两次,所以每次调用只需要增加一个计数器1
,例如:这将打印:
3, 5, 7, 9, ..., 99
d5vmydt93#
实际上,你可以在Python中使用
Generator Expression
来打印奇数1-100,并将它们保存在list
中。这将返回: