eit*_*ees 4 python syntax for-loop
例如,我对如何在 python 中的行尾放置 for 循环感到有些困惑
for i in x:
print i
Run Code Online (Sandbox Code Playgroud)
产生预期的结果,但如果我运行
print i for i in x
Run Code Online (Sandbox Code Playgroud)
我收到语法错误。有人可以解释一下如何将你的 for 循环放在这样一行的末尾。
在 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)
Run Code Online (Sandbox Code Playgroud)
通过添加一种新语法,将所有三件事合二为一 - 更改项目和/或测试它们以仅在结果中包含一些,并创建结果列表:
results = [2 * item for item in somelist if sometest(item)]
# results is a list
Run Code Online (Sandbox Code Playgroud)
此功能使用 Python 中表示“列表”的 [] 语法,它会立即在内存中构建一个列表。
有时您不想要或不需要立即将整个列表内置于内存中,因此更高版本的 Python 引入了生成器表达式 - 相同的想法,但它们通过快速返回一个生成器来节省内存,您可以像它一样迭代它,就像它是一个列表,并在您使用它时构建列表。
但是它们不能具有相同的语法并且不能直接换出,因为它们的行为略有不同,因此它们使用 () 而不是 [],例如:
somelist = [1,2,3,4,5]
results = (2 * item for item in somelist if sometest(item))
# results is a generator
Run Code Online (Sandbox Code Playgroud)
如果你尝试用 this 调用一个函数,你会得到两层括号:
function((2 * item for item in somelist))
Run Code Online (Sandbox Code Playgroud)
这看起来很傻,所以你可以省略一个:
function(2 * item for item in somelist)
Run Code Online (Sandbox Code Playgroud)
这似乎是一个独立的向后for循环,但实际上不是。
所以,用括号,你可以写这个:
>>> print (item for item in [1,2,3])
<generator object <genexpr> at 0x7fe31b8663c0>
Run Code Online (Sandbox Code Playgroud)
这是最接近您在 Python 2.x 中编写的有效语法的内容,但它不符合您的预期,并且 ^^ 是它的作用和原因。
或者这个:
>>> print [item for item in [1,2,3]]
[1,2,3]
Run Code Online (Sandbox Code Playgroud)
它生成一个列表并打印该列表,另一个与您所写内容相近的内容,但仍然不是您所期望的。
- (现在我在写这篇文章时已经出现了一堆其他答案,但实际上没有多大意义,但是呃)。