我如下创建了自己的迭代器(以了解它们的工作原理)
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
肯定可以遍历生成器对象并打印每个项目吗?
为什么这种情况不会发生
答案 0 :(得分:2)
生成器是惰性迭代器。当使用for循环时,您将手动耗尽生成器。当单行打印时,您不会通过迭代来耗尽它。
您可以打开发生器的包装以耗尽它并获取所有值:
print(*(char for char in Reverse('word')), sep='')
我已将end
的{{1}}更改为sep
,因为您在一次打印调用中进行了所有操作,因此希望将每个“自变量”(字符)分隔成空格。
您还可以执行以下操作:
print(*Reverse('word'), sep='')
由于Reverse
已经是一个迭代器,因此您可以使用它。
答案 1 :(得分:1)
肯定要在
否,它将打印生成器对象的字符串表示形式。
如果要输出该对象生成的内容,则可以使用带星号的表达式:
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])