在python中打印生成器对象

时间:2019-05-27 19:55:28

标签: python python-3.x iterator

我如下创建了自己的迭代器(以了解它们的工作原理)

class Reverse():
    def __init__(self, word):
        self.word = word
        self.index = len(word)
    def __iter__(self):
        return self
    def __next__(self):
        self.index -=1
        if self.index < 0:
            raise StopIteration
        return self.word[self.index]

print (char for char in Reverse("word"),end="")

我知道我可以说:

rev = Reverse("word")
for char in rev:
    print(char, end="")

但是我希望能够单行完成

print (char for char in Reverse("word"),end="")

这不起作用,并引发错误。如果删除end="",它将打印出generator object。通过在for loop语句中包含print肯定可以遍历生成器对象并打印每个项目吗? 为什么这种情况不会发生

4 个答案:

答案 0 :(得分:2)

生成器是惰性迭代器。当使用for循环时,您将手动耗尽生成器。当单行打印时,您不会通过迭代来耗尽它。

您可以打开发生器的包装以耗尽它并获取所有值:

print(*(char for char in Reverse('word')), sep='')

我已将end的{​​{1}}更改为sep,因为您在一次打印调用中进行了所有操作,因此希望将每个“自变量”(字符)分隔成空格。

您还可以执行以下操作:

print(*Reverse('word'), sep='')

由于Reverse已经是一个迭代器,因此您可以使用它。

答案 1 :(得分:1)

  

肯定要在print语句中包含for循环,它应该遍历我的生成器对象并打印每个项目?

否,它将打印生成器对象的字符串表示形式。

如果要输出该对象生成的内容,则可以使用带星号的表达式:

print(*(char for char in Reverse("word")),end="")

这是因为生成器表达式中的for循环实际上不是在生成器对象的实例化时执行的,这就是生成器的全部要点:您可以拥有无​​限个生成器,但仍然可以传递它作为一个常规值并消耗有限的块,而所有这些都没有无限的内存量。

答案 2 :(得分:1)

为什么不喜欢这个?

print(''.join([char for char in Reverse("word")]))

答案 3 :(得分:1)

x = my_objects.objects.all() # x, turns to a QuerySet

for i in range(len(x)):
    print(x[i])