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]