我在堆栈溢出时遇到了代码高尔夫问题,看到了许多perl one liner解决方案。
我的问题是:Python中是否可以这样?
答案 0 :(得分:20)
python -c 'print("Yes.")'
答案 1 :(得分:16)
可以在Python中编写一个衬里,但它很尴尬(Python鼓励使用缩进的代码,这与“单行”概念有些不一致)。在Python 3中它更容易一些,因为print()
是一个函数,而不是一个语句。这是一个:
python -c "fact = lambda x: x * fact(x-1) if x > 1 else 1; print(fact(5))"
以下是编写grep
类似函数的方法(此示例从包含“foo”的输入中打印行):
python -c "for s in __import__('fileinput').input(): __import__('sys').stdout.write(s) if 'foo' in s else None"
答案 2 :(得分:10)
我最终希望在从shell执行操作时经常这样做。它不会变得更紧凑,并且在许多情况下,编写多行shell命令比将所有内容编写为lambda更容易。你几乎不能使用任何以冒号结尾的python语句。所以你最终不得不
将任何for
- 代码编写为genexp或list comprehension。无论如何,对于大多数内容我都会这样做,但是如果你不能import sys
并将所有内容推送到sys.stdout.writelines
,那就很烦人了
for tree in forest:
print tree
编写lambda而不是函数定义。这通常是可行的,并且具有强大的副作用,迫使您编写非常直接的函数,这些函数实际上只做一件事。然而,它并不是特别方便,并且不适用于任何改变值的东西(例如dict.update
)然后返回一些元素。
不打扰上下文管理员正确处理事情
不进行任何异常处理。
使用lambda的字典而不是任何if
/ else
部分。
使用type(name, bases, dict)
声明任何类。这非常有趣,但只有当你碰巧声明一个方法可以表示为lambdas的类时才有效。
所以对于某些事情它可以解决但通常这是一个很大的麻烦,因为你最终不得不使用Python不支持的功能风格。大多数时候我只是编写多行shell命令,如
who@whoville ~ $ python -c $'
import some_module
for v in some_module.whatever():
print "Whatever: \'{0}\'".format(v)
'
$'
是一种bash
引用语法,是'...'
和"..."
引用结构的替代语法。它很有用,因为它的工作方式与'...'
类似,但允许您使用'
转义包含\'
个字符。您还可以嵌入换行符,因此上述代码也可以写为python -c $'import some_module\nfor v in some_module.whatever():\n print "Whatever: \'{0}\'".format(v)'
。然而,这是一种后天的品味。
在bash中编写多行命令的一个烦人的事情是 HOME 和 END 转到命令的开头而不是行的开头。可能有更好的方法来做到这一点,但我通常只需按住 CTRL 和左/右箭头键来回扫描。一些emacs
用户可能会在这里直接指出我,因为那是bash正常的键绑定来自的地方。
如果要在编辑多线命令时插入换行符,可以使用^ V- ^ J执行此操作。这将以一种方式进行换行,你仍然可以扫描回前一行,而不是使用
$ first line of the command
> second line
> third line
设置你得到的其他方式,你不能回到前面的行。
^ V- ^ J的技巧也适用于ipython
,使其对编辑类或函数定义很有用。它也可以在基本python
REPL(可能)中工作,我只是不知道,因为我几乎总是使用ipython
。
答案 3 :(得分:4)
在Bourne shell中,您可以使用名为 heredoc 的东西来绕过Python对缩进的依赖:
s@d400:0:~$ python << 'EOF'
> for i in range(3):
> print i
> EOF
0
1
2
s@d400:0:~$
答案 4 :(得分:2)
一个非常好的Python单线程(如“非常有用”):
python -c 'import SimpleHTTPServer as foo; foo.test()' 23433
当前目录中的Instant basic webserver。 (今天刚刚介绍过;非常方便。)
答案 5 :(得分:0)
这是我运行多个语句的技巧:
[stmt1, stmt2, expr1][2]
if
需要延迟评估:[lambda(): stmt1; lambda(): stmt2][not not boolExpr]()
答案 6 :(得分:0)
exec("if 6 * 9 == int('42', 13):\n\tprint('Yes!')")
使用这种方法,每个 Python程序都可以写成一行代码:)
答案 7 :(得分:-2)
是的,实际上它很常见。当我需要编写快速代码时,我使用一个衬垫。这取决于你想做什么。这是我今晚刚刚使用的一条小线。它是在一行中创建一个Tkinter按钮。
a = Button(root, text="Button", command=com1).pack()
如果您需要任何特定代码,请告诉我,我非常乐意提供帮助!