没有错误,但输出是意外的

2024-03-28 11:32:31 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的密码

for i in range(1,5): 
    print(i for x in range(1,i+1))

对于此代码,输出为

<generator object at 0x0000025B9C7A9BA0>
<generator object at 0x0000025B9C7A9BA0>
<generator object at 0x0000025B9C7A9BA0>
<generator object at 0x0000025B9C7A9BA0>


Tags: 代码in密码forobjectrangegeneratorat
2条回答

当你写作时

i for x in range(1,i+1)

这是一个“生成器表达式”,它产生一个“生成器”(<generator object at ...>),它是一个“iterable”。列表也是不可编辑的。生成器的优点是,当您对元素表达式进行迭代时,它实际上只对其求值(此处i

不过,你似乎想要一份实际的清单。您可以立即创建如下列表:

[i for x in range(1,i+1)]

或者在您的代码中:

for i in range(1,5): 
    print([i for x in range(1,i+1)])

表达式[... for ... in ...]是一个“列表理解”。它看起来类似于生成器表达式,但它直接创建列表,而不使用生成器。列表理解首先出现在Python中,然后是生成器表达式。它们在不同的大括号中具有相同的语法

如果您已经有了生成器,还可以将其转换为列表:

for i in range(1,5): 
    gen = (i for x in range(1,i+1))
    print(list(gen)) # get all the elements and make a list

然后,该生成器“用完了”,没有更多的元素可以提供

您需要创建list

试试这个:

for i in range(1,5): 
    print([i for x in range(1,i+1)])

简而言之,您可以尝试以下方法:

print([i for i in range(1,5) for x in range(1,i+1)])

list(map((lambda x : print([x for _ in range(1,x+1)])), range(1,5)))

或者感谢@Sujay让您跑得更快,您可以使用tuple如下所示:

tuple(map((lambda x : print([x for _ in range(1,x+1)])), range(1,5)))

对于检查运行时,我使用以下代码:

%timeit tuple(map((lambda x : print([x for _ in range(1,x+1)])), range(1,5)))
# 794 µs ± 86.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit list(map((lambda x : print([x for _ in range(1,x+1)])), range(1,5)))
# 806 µs ± 150 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

相关问题 更多 >