Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用迭代器打印奇数 class OddNum(): 定义下一个定义(x): 如果x%2!=0: 打印x def main(): a=国际热核实验堆(OddNum(1)) 而next(a)_Python_Python 2.7_Iterator_Iteration_Next - Fatal编程技术网

Python 使用迭代器打印奇数 class OddNum(): 定义下一个定义(x): 如果x%2!=0: 打印x def main(): a=国际热核实验堆(OddNum(1)) 而next(a)

Python 使用迭代器打印奇数 class OddNum(): 定义下一个定义(x): 如果x%2!=0: 打印x def main(): a=国际热核实验堆(OddNum(1)) 而next(a),python,python-2.7,iterator,iteration,next,Python,Python 2.7,Iterator,Iteration,Next,这是一个糟糕的任务,因为它没有语义意义main()调用next()两次,因此每次调用只需增加一个计数器1,例如: 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 St

这是一个糟糕的任务,因为它没有语义意义
main()
调用
next()
两次,因此每次调用只需增加一个计数器
1
,例如:

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()

这将打印:
3,5,7,9,…,99

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

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


但请注意,这意味着您可以简化问题:只需使
OddNum(n)
产生从
n-1开始的所有数字。因此,如果您在
OddNum(1)
上调用它,
main
函数将首先获得
0
,查看它是
<100
,然后获取并打印
1
,然后获取
2
并查看它是
<100
,然后获取并打印
3
,依此类推

这意味着您的答案可以简单到:

class OddNum():
    def __init__(self, x):
        self.x = x
    def __iter__(self):
        return self
    def __next__(self):
        self.x += 1
        return self.x
或者,如果您想明确地写出来:

def OddNum(n):
    return itertools.count(n-1)
或者,如果您想将其作为迭代器类而不是生成器编写:

def OddNum(n):
    n -= 1
    while True:
        yield n
        n += 1


当然,如果你不想利用这个技巧(或者认为你的导师不想让你这么做),你应该能够改变以上任何一项来计算奇数,并给出两次。事实上,如果我是你,我会用两种方式写它,并附上适当的注释,以证明我理解这个问题以及在封面下发生的事情,而不仅仅是在上面交上我的代码。

你实际上可以使用Python中的
生成器表达式
打印奇数1-100,并将它们保存在
列表中

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
这将返回:

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}")

这里似乎有点不对劲,你打了两次
next
,并丢弃了每一个奇数。为什么要这样做?请发布你尝试过的代码,以及你得到的错误。主代码是我没有写的,所以我不知道我发布了我尝试过的代码和错误,你有没有考虑过为类编写一个构造函数(一个带参数的类),这样你就不会犯这样的错误?我必须使用名为next的方法来计算和打印奇数。很好,你已经解决了我的问题。@jebusscruster希望你愿意与堆栈溢出分享一些赋值积分。@cᴏʟᴅsᴘᴇᴇᴅ 我真的希望老师真的在问一个骗人的问题;如果他们在没有意识到
main
中明显的错误的情况下分配了此任务,OP将很难从本课程中学习任何东西…这就是我在实现代码后现在遇到的错误:回溯(最近一次调用):第36行,在main()第29行,在main中,而下一个(a)@jebusah,您正在使用Python 2?那么你就不应该一开始就试图写一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法;这就是Python 3。更新了答案。但实际上,如果你连迭代器协议都不懂,你的老师很明显不知道你在做什么,所以我会回去重读这本书/笔记/什么的。
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]