是单行'if'/'for'语句好的Python风格吗?

在这里,我常常看到某人的代码,看起来像是“一行”,这是一个单行的声明,以标准的方式执行传统的“if”语句或“for”循环。

我一直在search,并不能真正find你可以执行什么样的? 任何人都可以build议,最好举一些例子吗?

例如,我可以在一行中做到这一点:

example = "example" if "exam" in example: print "yes!" 

要么:

 for a in someList: list.append(splitColon.split(a)) 

好,

 if "exam" in "example": print "yes!" 

这是一个改进? 没有 。 您甚至可以通过用分号分隔它们来将更多的语句添加到if语句的主体中。 我反对这个build议。

我发现,在大多数情况下,在一行上执行块条款是一个坏主意。

这也将作为一个普遍性来降低代码forms的质量。 高质量的代码forms是Python的关键语言function。

在某些情况下,python会提供一些方法来处理一些肯定更加pythonic的东西。 事情如尼克D提到的列表理解:

 newlist = [splitColon.split(a) for a in someList] 

虽然除非特别需要可重用的列表,否则可能需要考虑使用生成器

 listgen = (splitColon.split(a) for a in someList) 

注意两者之间最大的区别是你不能重复一个发生器,但是使用效率更高。

在现代版本的Python中还有一个内置的三元运算符,可以让你做类似的事情

 string_to_print = "yes!" if "exam" in "example" else "" print string_to_print 

要么

 iterator = max_value if iterator > max_value else iterator 

有些人可能会发现这些比类似if (condition): block更具可读性和可用性。

当涉及到它的时候,就是关于代码风格,以及你正在使用的团队的标准是什么。 这是最重要的,但一般来说,我build议不要一行代码,因为python代码的forms非常重要。

更一般地说,以下所有句法都是有效的:

 if condition: do_something() if condition: do_something() if condition: do_something() do_something_else() if condition: do_something(); do_something_else() 

…等等。

一个不仅仅是删除换行符的语言特性的例子,尽pipe还不能确定这比更详细的版本更清晰

如果x> 15,则a = 1。否则2

 for a in someList: list.append(splitColon.split(a)) 

您可以将上面的内容重写为:

 newlist = [splitColon.split(a) for a in someList] 

如果只有一行,Python允许您将缩进的子句放在同一行上:

 if "exam" in example: print "yes!" def squared(x): return x * x class MyException(Exception): pass 

您可以通过省略examplevariables在一行中完成所有这些操作:

 if "exam" in "example": print "yes!" 

旧版本的Python只允许在for ...: if ...:或类似的块介绍性语句之后使用一个简单的语句。

我发现可以在同一行上有多个简单的语句。 但是,有各种各样的组合不起作用。 例如,我们可以:

 for i in range(3): print "Here's i:"; print i 

但另一方面,我们不能:

 for i in range(3): if i % 2: print "That's odd!" 

我们可以:

 x=10 while x > 0: print x; x-=1 

…但我们不能:

 x=10; while x > 0: print x; x-=1 

… 等等。

无论如何,所有这些都被认为是非pythonic。 如果你编写这样的代码,那么体验Pythonistas可能会对你的技能有一个模糊的看法。

在某些情况下将多条语句组合在一起是勉强可以接受的。 例如:

 x=0; y=1 

… 甚至:

 if some_condition(): break 

…简单的break continue ,甚至return语句或assigments。

特别是如果需要使用一系列elif可以使用如下的东西:

 if keystroke == 'q': break elif keystroke == 'c': action='continue' elif keystroke == 'd': action='delete' # ... else: action='ask again' 

…那么你可能不会太激动你的同事。 (然而,像这样的尖叫的elif链被重构成一个调度表…一个字典,可能看起来更像是:

 dispatch = { 'q': foo.break, 'c': foo.continue, 'd': foo.delete } # ... while True: key = SomeGetKey() dispatch.get(key, foo.try_again)() 

潜入python有一点他谈论他所谓的和 – 或技巧 ,这似乎是一个有效的方法来将复杂的逻辑塞进一条线。

基本上,它模拟c中的三元操作符,给你一个方法来testing真值并返回一个值。 例如:

 >>> (1 and ["firstvalue"] or ["secondvalue"])[0] "firstvalue" >>> (0 and ["firstvalue"] or ["secondvalue"])[0] "secondvalue" 

这是一个“如果其他”的例子。

 >>> def fun(num): print 'This is %d' % num >>> fun(10) if 10 > 0 else fun(2) this is 10 OR >>> fun(10) if 10 < 0 else 1 1 
Interesting Posts