Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python基本级别生成器和问题列表_Python_List_Generator - Fatal编程技术网

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
回溯


这一点已经详细讨论过了。

明白了!谢谢森派!