是否可以用Python编写单行代码?

时间:2010-10-23 20:36:13

标签: python perl

我在堆栈溢出时遇到了代码高尔夫问题,看到了许多perl one liner解决方案。

我的问题是:Python中是否可以这样?

8 个答案:

答案 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()

如果您需要任何特定代码,请告诉我,我非常乐意提供帮助!