《Python基础教程》代码不兼容,不知道为什么怎么解决,求大神解答。

书本源代码:
class TestIterator:
value = 0
def next(self):
self.value += 1
if self.value > 10:
raise StopIteration
return self.value
def __iter__(self):
return self
为什么这段代码运行出错,
>>>ti =TestIterator()
>>>ti.next()
1
>>>ti.next()
2
>>>list(ti)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
list(ti)
TypeError: iter() returned non-iterator of type 'TestIterator'
书本也是这样写的,这段代码似懂非懂状态,我用的是Python3.5,书本说兼容3.x版本的。不知道为什么出错。
为什么类方法next()数据不能储存?
书本list(ti)会输出[1,2,3......10]的.。
list()不能只有一个数据吗?因为我随便赋值a=1,list(a)也会出错,应该怎么都输出一个数据啊,比如>>>list(ti.next())会输出【1】吧,为什么?
我的是Python3.6版本出错,出错如下:
Traceback (most recent call last):
File"<pyshell#1>", line 1, in <module>
list(ti)
TypeError:iter() returned non-iterator of type 'TestIterator'

《Python基础教程》中案例代码是完全依据Python2.x版写的。

所以要想正常运行最好用Python2.7的环境。

要在Python3.X下运行代码要改一下。

class TestIterator:
    value = 0
    def __next__(self):
        self.value += 1
        if self.value > 10:
            raise StopIteration
        return self.value
    def __iter__(self):
        return self

ti =TestIterator()

print(next(ti))
print(next(ti))
print(list(ti))

因为Python3中对迭代器协议有些改变
next()方法改名字为__next__()
调用方式也只能用next(ti)这样了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-10-15
"ti"是一个 'TestIterator' 对象,是不能变成一个列表的追答

是不是__iter__应该返回self.value?

应该不是兼容性问题

追问

可是书本就是>>>ti =TestIterator()
>>>list(ti)
[1,2,3,4,5,6,7,8,9,10]

追答

你那是第几页?明天帮你看下

追问

《Python基础教程(第二版修订版)》---P153---9.6.2 从迭代器得到序列。中的代码。这就是原代码。谢谢您了。

追答

我这里运行没问题呀?

追问

你的是2.7版本啊。我说的是3.6版本出错。

追答

a

我没有下py3

第2个回答  2017-11-16
在python3.0以后的版本中,next改为了双下划线的__next__。
相似回答