生成元组vs列表



在生成列表时,我们不使用内置的"list"要指定它是一个列表,只需使用"[]"我愿意这么做。但是当相同的样式/模式用于元组时,它不会。

l = [x for x in range(8)]
print(l)
y= ((x for x in range(8)))
print(y)

输出:

[0, 1, 2, 3, 4, 5, 6, 7]
<generator object <genexpr> at 0x000001D1DB7696D0>
Process finished with exit code 0

当"tuple",则正确显示。问题是:-在代码"列表"中没有明确提到,而是"tuple"。你能告诉我为什么吗?

l = [x for x in range(8)]
print(l)
y= tuple((x for x in range(8)))
print(y)

输出:

[0, 1, 2, 3, 4, 5, 6, 7]
(0, 1, 2, 3, 4, 5, 6, 7)
Process finished with exit code 0

使用()是一个生成器表达式:

>>> ((x for x in range(8)))
<generator object <genexpr> at 0x0000013FE1AD6040>
>>> 

如文档中所述:

生成器迭代器由yield关键字创建。它们与普通函数的真正区别在于,yield与return不同,它既是函数体的出口,也是函数体的入口。这意味着,在每次yield调用之后,生成器不仅会返回一些东西,而且还会记住它的状态。调用next()方法将控制权交还给在最后执行yield语句之后开始的生成器。每个yield语句只按其在代码中出现的顺序执行一次。在所有yield语句执行完毕后,迭代结束。

类中的生成器应该是这样的:

class Generator:
def __init__(self, lst):
self.lst = lst
def __iter__(self):
it = iter(self.lst)
yield from it

def __next__(self):
it = iter(self.lst)
return next(it)

用法:

>>> x = Generator(i for i in range(5))
>>> next(x)
0
>>> next(x)
1
>>> next(x)
2
>>> for i in x:
print(i)
3
4
>>> 

最新更新