2017-10-08 29 views
-3

我想了解何时应该使用列表理解。很多时间,这是方便和省线。但有时候,它不能按预期工作?python list理解转换

,如果我有:

listA = ['1', '2', '3', '4'] 

我可以用一个for循环

for i in listA: 
    print(i) 

显然这会给我:

1 
2 
3 
4 

,如果我尝试什么:

print(i for i in listA) 

但这不会给我同样的结果?

<generator object <genexpr> at 0x102a3b3b8> 

我应该怎么理解?

我的另一个问题是: 如果我有一个for循环,然后是一行代码,可以总是用理解的方式编写它吗?

回答

1

您没有列表理解。您通过了生成器表达式print()print()函数不会遍历您传入的任何参数;它只发送str()转换为stdout

如果你想在发电机发出的所有值print(),使用*(...)

print(*(i for i in listA)) 

这里说是大材小用,你可能只是做的值相同的listA

print(*listA) 

两者都将使用默认分隔符(一个空格)打印值。如果你想有换行符,告诉print()使用\n作为分隔符:

print(*(i for i in listA), sep='\n') 
print(*listA, sep='\n') 

不,不是每个for循环适合转换为列表解析。列表理解创建一个新的列表对象,而不是所有的循环建立列表。

如果你有以下形式的列表:

some_name = [] 
for <target> in <iterable>: 
    some_name.append(<expression>) 

然后您可以转换到一个列表理解:

some_name = [<expression> for <target> in <iterable>] 
0

你可以做到以下几点:

listA = ['1', '2', '3', '4'] 
# option 1 
print(*listA, sep='\n') 
# option 2 
for p in listA: print (p) 
1

A 生成器是可以迭代的对象。它不打算打印。

列表解析有两种形式,有和没有括号:,而另一个产生实际列表

print(i for i in listA) 
print([i for i in listA]) 

第一个产生一个迭代器对象。

对于你的问题,你可以这样做:

print(*listA, sep='\n') 

一般情况下,当他们的代码晦涩应避免列表内涵。为什么不使用简单的for循环?

相关问题