使用迭代器打印奇数

时间:2018-04-23 20:15:50

标签: python python-2.7 iterator iteration next

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 个答案:

答案 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]