python 使用迭代器打印奇数

bwitn5fc  于 2023-05-27  发布在  Python
关注(0)|答案(3)|浏览(157)
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
ih99xse1

ih99xse11#

看起来你被分配了一个陷阱问题。
给定的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

当然,如果你不想利用这个技巧(或者认为你的老师不希望你这样做),你应该能够改变上述任何一个来计算奇数并产生两次。事实上,如果我是你,我会用两种方式来写,并加上适当的注解,以证明我理解了这个问题以及背后发生了什么,而不是仅仅提交上面的代码。

qxsslcnc

qxsslcnc2#

这是一个糟糕的任务,因为它没有语义意义。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

d5vmydt9

d5vmydt93#

实际上,你可以在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]

相关问题