是单行'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
您可以通过省略example
variables在一行中完成所有这些操作:
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