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
答案 0 :(得分:2)
看起来你被分配了一个技巧问题。
给定的main
函数实际上每次通过循环从迭代器中获取两个值,但只打印第二个。因此,您的OddNum
迭代器需要连续两次产生每个数字。
但请注意,这意味着您可以简化问题:只需从OddNum(n)
开始n-1
生成所有数字。因此,如果您在OddNum(1)
上调用它,main
函数将首先获得0
,看到它是< 100
,然后获取并打印1
,然后获取2
并看到它是< 100
,然后获取并打印3
,依此类推。
这意味着您的答案可以简单:
def OddNum(n):
return itertools.count(n-1)
或者,如果你想明确地写出来:
def OddNum(n):
n -= 1
while True:
yield n
n += 1
或者,如果你想把它写成迭代器类而不是生成器:
class OddNum:
def __init__(self, n):
self.n = n-1
def __iter__(self):
return self
# For Python 3, rename this to __next__
def next(self):
n = self.n
self.n += 1
return n
当然,如果你不想利用这个技巧(或者认为你的教练不想要你),你应该能够改变上面的任何一个来计算奇数并产生两次。事实上,如果我是你,我会用适当的评论两种方式写出来,以证明我理解了问题以及幕后发生的事情,而不仅仅是上面的代码。
答案 1 :(得分:0)
这是一个糟糕的任务,因为它没有语义意义。 main()
两次调用next()
,因此您只需要在每次调用时增加一个计数器1
,例如:
class OddNum():
def __init__(self, x):
self.x = x
def __iter__(self):
return self
def __next__(self):
self.x += 1
return self.x
打印:3, 5, 7, 9, ..., 99
答案 2 :(得分:0)
您实际上可以在 Python 中使用 Generator Expression
打印奇数 1-100 并将它们保存在 list
中。:
odd_num = (x for x in range(100)
if x % 2 == 1)
# print every single odd number:
# for i in odd_num:
# print(f"Odd numbers are: {i}")
odd_num_list = list(odd_num)
print(f"odd_num_list is {odd_num_list}")
返回:
odd_num_list is [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]