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

use*_*167 11 python perl

我在堆栈溢出处查看代码高尔夫问题并看到许多perl one liner解决方案.

我的问题是:在Python中有类似的东西吗?

Dae*_*yth 20

python -c 'print("Yes.")'


Gre*_*ill 17

可以在Python中编写一个衬里,但它很尴尬(Python鼓励使用缩进代码,这与"单行"概念有些不一致).它在Python 3中更容易一些,因为它print()是一个函数,而不是一个语句.这是一个:

python -c "fact = lambda x: x * fact(x-1) if x > 1 else 1; print(fact(5))"
Run Code Online (Sandbox Code Playgroud)

以下是编写grep类似函数的方法(此示例从包含"foo"的输入中打印行):

python -c "for s in __import__('fileinput').input(): __import__('sys').stdout.write(s) if 'foo' in s else None"
Run Code Online (Sandbox Code Playgroud)


int*_*ted 10

我最终想要从shell中做一些事情时经常这样做.它不会变得更紧凑,并且在许多情况下,编写多行shell命令比将所有内容编写为lambda更容易.你几乎不能使用任何以冒号结尾的python语句.所以你最终不得不这样做

  • 将任何for类似的代码写为genexp或list comprehension.无论如何我对大多数东西都是这样做的,但是如果你不能这样做的话,必须import sys把所有东西都推到sys.stdout.writelines一边很麻烦

    for tree in forest:
        print tree   
    
    Run Code Online (Sandbox Code Playgroud)
  • 写lambdas而不是函数定义.这通常是可行的,并且具有强大的副作用,迫使您编写非常有针对性的函数,这些函数实际上只做一件事.然而,它不是特别方便,并且不适用于任何改变值(例如dict.update)然后返回一些元素的东西.

  • 不打扰上下文管理员正确处理事情

  • 不做任何异常处理.

  • 使用lambda的字典而不是任何if/ else部分.

  • 使用type(name, bases, dict)声明的任何类.这非常有趣,但只有当你碰巧声明一个类的方法都可以表示为lambda时才有效.

所以对于某些事情它可以解决,但一般来说这是一个很大的麻烦,因为你最终不得不使用Python不支持的功能风格.大多数时候我只是编写多行shell命令

who@whoville ~ $ python -c $'
import some_module
for v in some_module.whatever():
    print "Whatever: \'{0}\'".format(v)
'
Run Code Online (Sandbox Code Playgroud)

$'是一个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
Run Code Online (Sandbox Code Playgroud)

你得到的设置,在那里你无法回到前面的行.

^ V- ^ J的技巧ipython也适用,使其对编辑类或函数定义很有用.它也可能在基本的pythonREPL(可能)中工作,我只是不知道,因为我几乎总是使用它ipython.