【发布时间】:2014-08-04 12:04:41
【问题描述】:
我从 python 2.7.8 的官方文档中了解到如何使用迭代器和生成器。我有一个关于好奇心的问题。
it = iter("abcde")
print it
>>> <iterator object at 0x7ff4c2b3bad0>
class example1():
def __init__(self, word):
self.word = word
self.index = len(word)
def __iter__(self):
for x in range(self.index - 1, -1, -1):
yield self.word[x]
a = example1("altalena")
print iter(a)
>>> <generator object __iter__ at 0x7f24712000a0>
在上面的示例中,当我打印迭代器时,我读取“生成器”、“迭代器”对象和十六进制 ID。为什么我不能用下面的代码做同样的事情?
class example2():
def __init__(self, word):
self.word = word
self.index = len(word)
def __iter__(self):
return self
def next (self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.word[self.index]
a = example2()
print iter(a)
>>> <__main__.example2 instance at 0x7f89ee2de440>
我认为这是由 iter 中的“return self”引起的,导致类实例,但我不知道获得更正确输出的解决方案。它可能没用,但我不知道为什么要避免它。
【问题讨论】:
-
如果你想改变
print对你的实例所做的事情,你必须使用__repr__和/或__str__ -
拜托,以后尽量尊重PEP8
-
所以我没有犯错,对吧?我只是创建我喜欢的行为,以获得具有正确样式的返回字符串。我已经做了几次以解决与 im_data 和 im_self 相关的其他问题......但是我怎样才能获得迭代器的内存 ID 而不是类实例的内存 ID?
-
PEP8 怎么说?我正在从“教程”的开头部分阅读python doc,虽然过去我一般都学过python,但现在我想学习所有文档,所以我还在学习。
-
惰性解决方案:通过定义
example2的__str__方法,使print iter(a)显示您想要的任何内容,返回所需的字符串。现在它将不再显示<main.example2 instance...
标签: python class iterator generator theory