我在如何在python的一行末尾放置一个for循环时遇到了一些困惑,例如
for i in x:
print i
产生预期结果但是如果我运行
print i for i in x
我收到语法错误。有人可以解释一下如何将你的for循环放在这样一行的末尾。
答案 0 :(得分:4)
在早期版本的Python中,引入了列表推导的概念来消除这两种代码模式:
# Go through each item in a list and run a test on them
# build a new list containing only items that pass the test
results = []
for item in somelist:
if sometest(item):
results.add(item)
and
# build a new list by changing every item in a list in the
# same way
results = []
for item in somelist:
results.add(2 * item)
通过添加一个新语法,包括将所有三个事物合二为一 - 更改项目和/或测试它们以仅在结果中包含一些项目,并创建结果列表:
results = [2 * item for item in somelist if sometest(item)]
# results is a list
此功能使用[]语法指示" list"在Python中,它立即在内存中构建一个列表。
有时你不想要或不需要内存中的整个列表,因此后来的Python版本引入了生成器表达式 - 相同的想法,但它们通过快速返回一个你可以迭代的生成器来节省内存如果它是一个列表,它会在您使用它时构建列表。
但它们不能具有相同的语法并且可以直接换出,因为它们的行为略有不同,因此它们使用()代替[],例如:
somelist = [1,2,3,4,5]
results = (2 * item for item in somelist if sometest(item))
# results is a generator
如果您尝试使用此函数调用函数,则会得到两层括号:
function((2 * item for item in somelist))
看起来很傻,所以你可以留下一个:
function(2 * item for item in somelist)
哪个出现本身就是一个独立的向后for
循环,但实际上并非如此。
因此,使用括号可以写 this :
>>> print (item for item in [1,2,3])
<generator object <genexpr> at 0x7fe31b8663c0>
哪个是你写的最接近的东西,它是Python 2.x中的有效语法,但它没有做你期望的事情,^^是它的作用和原因
或此:
>>> print [item for item in [1,2,3]]
[1,2,3]
哪个会生成一个列表并打印列表,另一个与您编写的内容相近,但仍然不是您所期望的。
- (在我写这篇文章的时候,我真的没有太多意思,但在写这篇文章的时候还有其他的答案,但是呃)。
答案 1 :(得分:1)
你不能。您可能看过generator expression,其格式为x for x in iter
。 for
循环略有不同,但您可以在genexp中看到for x in iter
。
在Python3中,你可以这样做:
print(*(i for i in x))
正如@wim在评论中指出的那样,你可以做得更多&#34; for
loopy&#34;通过做
print(*(i for i in x), sep='\n')
你当然可以进行任意改变,因为这是一个genexp,所以例如i**2 for i in x
将为x
中的每个项目提供正方形,i for i in x if i%2
将在x
等中提供所有奇数。
这将在x
中创建每个项目的生成器,然后依次传递每个项目(使用*
赋值,以*args
构建的相同方式等)作为单独的参数print
答案 2 :(得分:1)
首先:
print
默认为函数,或者在Python 2.x中执行from __future__ import print_function
但是,如果您坚持在for ...
部分之后放置print i
部分,则可以执行以下操作:
[print(i) for i in x]
(但我是纯粹为#34;学术和#34;目的而写的那个例子)
PS 如果你让我们知道你想做什么,我们或许可以提供一个合适的整体解决方案,但是如果你只是为了它而提出要求,那么& #39; s。
答案 3 :(得分:1)
表达式 for x
在Python中并不代表任何东西。你可以
(表达式 for x in x)
[表达式 for i in x]
但你做不到
[print i for i in x]
因为print不是表达式,所以它是一个声明。
答案 4 :(得分:1)
我唯一能想到的就是python 2.x中的等价物:
print '\n'.join(str(i) for i in x)
但不要这样做。你拥有的for循环更加清晰。
如果你只是在互动翻译中鬼混,并且出于某种原因想要单行,那么这将有效:
for i in x: print i
但它违反了pep8,所以我不会把这样的行写成脚本。