压缩代码的技巧
根据我的理解,Python 这门语言特别要求大家使用缩进来组织代码,但有没有办法打破这个规则呢?举个例子:
y=[1,2,3]
print('ListY:')
for x in y:
print(x)
现在,我可以把最后两行合并成这样:
for x in y:print(x)
但是我不能这样写:
print('ListY');for x in y:print(x)
不过,有没有办法做到呢?
3 个回答
1
def f(g,xs):
for x in xs:
g(x)
print('ListY');f(print,[1,2,3])
正如其他回答所说...
你可以(如果你真的想的话)做一些这样的事情,虽然你可能不会这么做。
通常采用“函数式”的方法可以让代码更简洁(或者至少能让代码更容易重复使用)。可以看看Python里的‘partial’函数,以及在functools库中的其他内容。
2
我不打算解释为什么你会想在Python中这样做,但答案是,不可以。
在Python中,有两种类型的语句:一种是简单语句,它们只占一行;另一种是复合语句,它们可以占多行。你可以把多个简单语句放在一行中,用分号隔开,但不能在简单语句后面放复合语句。
具体来说(直接引用自Python语言参考):
statement ::= stmt_list NEWLINE | compound_stmt
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
3
首先,我想说我同意这些技巧有时候可能会有点用,但并不常见。一个好的例子就是在文档测试中的代码。通常这些代码即使被压缩了,依然很清晰,压缩代码有时比让它“尽可能可读”更少出问题。不过,对于普通代码来说,把多行合并成一行通常不是个好主意。当你无法在 if
或 for
语句中设置断点时,这通常比多一行代码要麻烦得多。而且,覆盖率工具在你不使用这些技巧时会提供更多的信息。
不过,回答你的问题,似乎没有办法做到你想要的效果。使用 ;
有很多限制。复合语句不能和 ;
一起使用。通常这些限制是合理的,但有时候我也会觉得它们太严格了。
更新:但是如果你非常想把代码写成一行,有很多技巧可以用。例如,可以使用生成器和列表推导(代替 for
),还有 reduce()
等等,在 Python 3 中甚至可以在这些里面使用 print()
。