python基本级别生成器和问题列表
它打印:python基本级别生成器和问题列表,python,list,generator,Python,List,Generator,它打印: my_nums =(i*i for i in [1,2,3,4,5]) for k in (my_nums): print(k) GG = list(my_nums) print(GG) my_nums =(i*i for i in [1,2,3,4,5]) for k in (my_nums): print(k) 我不明白为什么[]值是空的(它应该是[1,4,9,16,25])?此外,循环是否将生成器值转换为列表?以下是一个示例: 因此,当您第一次循环它并打印值
my_nums =(i*i for i in [1,2,3,4,5])
for k in (my_nums):
print(k)
GG = list(my_nums)
print(GG)
my_nums =(i*i for i in [1,2,3,4,5])
for k in (my_nums):
print(k)
我不明白为什么[]
值是空的(它应该是[1,4,9,16,25]
)?此外,循环是否将生成器值转换为列表?以下是一个示例:
因此,当您第一次循环它并打印值时,生成器将打印它可以生成的每个值。for循环通过调用my_nums.next()
并将获得的值分配给k
,然后打印出来。当引发StopIteration
异常时,for循环的迭代停止
而且,当您在for循环之后使用GG=list(my_nums)
时,您会得到一个空列表,因为生成器已经耗尽,不再需要生成任何内容
如果要将生成器生成的值存储到列表中
,可以直接执行以下操作:
my_nums =(i*i for i in [1,2,3,4,5])
for k in (my_nums):
print(k)
尽管如此,我不确定在性能方面,如果按照上面的方法进行操作,您是否会获得任何优势。当您在生成器上进行迭代时,您会同时清空它。 因此,只需删除k in(my_nums)的
:print(k)
,就可以得到预期的结果
这里也一样:
my_nums =(i*i for i in [1,2,3,4,5])
GG = list(my_nums) # no for loop for printing it already
这是因为您已经耗尽了执行此操作时生成的所有值
my_nums =(i*i for i in [1,2,3,4,5])
a = list(my_nums)
b = list(my_nums)
print(a)
// [1,4,9,16,25]
print(b)
// []
将生成器视为从流中读取数据。您已经读取了流,因此当您尝试从已经耗尽的生成器读取更多数据时,您会得到一个空列表,因为您第一次耗尽了生成器
for k in (my_nums): # you already made my_nums generate till the end here
print(k)
生成器表达式如下所示:
my_nums = (i*i for i in [1,2,3,4,5])
for k in my_nums:
print(k)
my_nums = (i*i for i in [1,2,3,4,5])
print(list(my_nums))
my_nums = (item for item in [1, 2, 3, 4, 5, 6, 7])
def generator(iterable):
for item in iterable:
yield item
my_nums = generator([1, 2, 3, 4, 5, 6, 7])
语法是这样的:
my_nums = (i*i for i in [1,2,3,4,5])
for k in my_nums:
print(k)
my_nums = (i*i for i in [1,2,3,4,5])
print(list(my_nums))
my_nums = (item for item in [1, 2, 3, 4, 5, 6, 7])
def generator(iterable):
for item in iterable:
yield item
my_nums = generator([1, 2, 3, 4, 5, 6, 7])
forloop本身相当于以下内容:
my_nums = (i*i for i in [1,2,3,4,5])
for k in my_nums:
print(k)
my_nums = (i*i for i in [1,2,3,4,5])
print(list(my_nums))
my_nums = (item for item in [1, 2, 3, 4, 5, 6, 7])
def generator(iterable):
for item in iterable:
yield item
my_nums = generator([1, 2, 3, 4, 5, 6, 7])
因为gg=list(iterable)
类似于:
while True:
try:
item = next(my_nums)
except StopIteration:
break
else:
print(item)
问题是,第一次循环生成器表达式时,它已用尽。如果您再次尝试循环,它只会引发StopIteration
并中断循环
例如:
gg = []
for item in my_nums:
gg.append(item)
>>my_nums=(i代表[1,2]中的i)
>>>列表(my_nums)
[1, 2]
>>>列表(my_nums)
[]
>>>下一个(我的妈妈)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
停止迭代
>>>
查看第二次调用
list(my_nums)
时它如何返回空列表?这是因为发电机已耗尽。如果您尝试从中获取下一项,您可以看到它如何引发StopIteration
。生成器是迭代器,但您只能对它们迭代一次。这是因为它们不会将所有值存储在内存中,而是动态生成值
>>> my_nums = (i for i in [1, 2])
>>> list(my_nums)
[1, 2]
>>> list(my_nums)
[]
>>> next(my_nums)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
它打印:
my_nums =(i*i for i in [1,2,3,4,5])
for k in (my_nums):
print(k)
GG = list(my_nums)
print(GG)
my_nums =(i*i for i in [1,2,3,4,5])
for k in (my_nums):
print(k)
除了使用()而不是[]之外,它是相同的。但是,您不能在my_nums中对k执行第二次,因为生成器只能使用一次:它们计算1,然后忘记它并计算4,然后逐个结束计算25
如果再次尝试执行迭代,将得到StopIteration
回溯
这一点已经详细讨论过了。明白了!谢谢森派!