(在10年11月23日,19:48回答)
我并不是一个真正的Pythoner,但是我一次发现了这种语法,却忘记了它的来源,所以我想记录一下它:
如果您使用sys.stdout.write
而不是print
(区别在于,sys.stdout.write
将参数作为函数,请放在括号中-而print
不是),则对于单行代码,您可以避免颠倒命令的顺序,然后for
删除分号,并将命令括在方括号中,即:
python -c "import sys; [sys.stdout.write('rob\n') for r in range(10)]"
不知道如何在Python中调用此语法:)
希望这可以帮助,
干杯!
(2013年4月9日星期二20:57:30 EDIT)好吧,我想我终于找到了这些单线括起来的方括号。它们是“列表理解”(显然);首先请注意Python 2.7:
$ STR=abc
$ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); print a"
<generator object <genexpr> at 0xb771461c>
因此,圆括号/括号中的命令被视为“生成器对象”;如果我们通过调用“迭代”它next()
-括号内的命令将被执行(注意输出中的“ abc”):
$ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); a.next() ; print a"
abc
<generator object <genexpr> at 0xb777b734>
如果我们现在使用方括号-请注意,无需调用next()
即可执行命令,它会在分配后立即执行;但是,以后的检查发现a
是None
:
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; print a"
abc
[None]
对于方括号,这没有太多信息可寻-但是我偶然发现了该页面,我认为这解释了:
Python技巧和窍门–第一版-Python教程| Dream.In.Code:
回想一下,单行生成器的标准格式是括号内的一种“ for”循环。这将产生一个“一次性”可迭代对象,该对象只能在一个方向上迭代,到达终点后就不能重复使用。
“列表理解”看起来与常规单行生成器几乎相同,除了常规方括号-()被方括号-[]代替。列表理解的主要优点是产生了一个“列表”,而不是一个“一次性”的可迭代对象,因此您可以在它之间来回移动,添加元素,排序等。
实际上,它是一个列表-它只是它的第一个元素在执行后立即变为空:
$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin].__class__"
abc
<type 'list'>
$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin][0]"
abc
None
列表推导在5中有其他说明。数据结构:5.1.4。列表推导— Python v2.7.4文档为“列表推导提供了一种创建列表的简洁方法”;大概就是列表的有限“可执行性”发挥作用的地方。
好吧,希望我在这里不会太过分……
EDIT2:这是一个带有两个非嵌套的for循环的单行命令行;都包含在“列表理解”方括号内:
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; b=[sys.stdout.write(str(x)) for x in range(2)] ; print a ; print b"
abc
01[None]
[None, None]
注意,第二个“列表” b
现在有两个元素,因为它的for循环显式运行了两次;但是,这sys.stdout.write()
两种情况的结果都是(显然)None
。