【问题标题】:Printing odd numbers using Iterators使用迭代器打印奇数
【发布时间】:2018-10-03 23:36:17
【问题描述】:
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

【问题讨论】:

  • 这里似乎有问题,您调用next 两次并丢弃所有其他奇数。为什么要这样做?
  • 请发布您尝试过的代码以及您遇到的错误。
  • 主要是给的我没写所以我不知道
  • 我发布了我尝试过的内容和错误
  • 嗯,你有没有考虑为你的类写一个构造函数——一个接受参数的构造函数——这样你就不会得到那个错误?

标签: python python-2.7 iterator iteration next


【解决方案1】:

看起来你被分配了一个技巧问题。

给定的main 函数实际上每次通过循环从您的迭代器中获取两个 值,但只打印第二个值。因此,您的 OddNum 迭代器需要连续两次产生每个数字。


但请注意,这意味着您可以简化问题:只需让OddNum(n) 产生从n-1 开始的所有 个数字。所以,如果你在OddNum(1) 上调用它,main 函数将首先得到一个0,看看它是&lt; 100,然后获取并打印1,然后得到一个2,看看它是&lt; 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

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

【讨论】:

  • 呵呵,很好,你给我的comment发邮件问这个问题。
  • @JebusCrust 希望你愿意与 Stack Overflow 分享你的部分功劳。
  • @cᴏʟᴅsᴘᴇᴇᴅ 我真的希望老师真的问了一个技巧问题;如果他们在没有意识到main 中的明显错误的情况下分配了这个,那么 OP 将很难从这门课程中学到任何东西……
  • 这是我在实现代码后现在得到的错误: Traceback (last recent call last): line 36, in main() line 29, in main while next(a)
  • @JebusCrust 啊,您使用的是 Python 2?那么您一开始就不应该尝试编写__next__ 方法;那是 Python 3。更新了答案。但实际上,如果你连迭代器协议的内容都不了解,那么你的老师会很明显你不知道自己在做什么,所以我会回去重读这本书/笔记/随便。
【解决方案2】:

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

【讨论】:

  • 我必须使用名为 next 的方法来计算和打印奇数
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 1970-01-01
    • 2011-10-12
    • 2019-04-01
    • 1970-01-01
    • 2015-09-29
    • 2015-10-05
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多