单行“if”/“for”语句是否具有良好的Python风格?

时间:2009-11-13 12:48:00

标签: python for-loop if-statement idiomatic

我经常在这里看到某人的代码以及看起来像是“单行”的内容,这是一个单行语句,以传统的'if'语句或'for'循环的标准方式执行。< / p>

我已经google了,无法真正找到你能演出的那种?任何人都可以提出建议并最好提供一些例子吗?

例如,我可以在一行中执行此操作:

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

或者:

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

10 个答案:

答案 0 :(得分:53)

那么,

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

这是改善吗? 即可。您甚至可以通过用分号分隔它们来向if - 子句的主体添加更多语句。我建议反对

答案 1 :(得分:39)

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

作为一般性,它将降低代码形式的质量。高质量的代码形式是python的一个关键语言功能。

在某些情况下,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):块更具可读性和可用性。

归根结底,它是关于代码风格的,以及你正在研究的团队的标准。这是最重要的,但总的来说,我建议不要使用一个行块,因为python中的代码形式非常重要。

答案 2 :(得分:18)

更一般地说,以下所有内容在语法上都是有效的:

if condition:
    do_something()


if condition: do_something()

if condition:
    do_something()
    do_something_else()

if condition: do_something(); do_something_else()

...等

答案 3 :(得分:11)

语言功能的一个示例,不仅仅是删除换行符,尽管仍然不相信这比更详细的版本更清晰

  

a = 1,如果x> 15其他2

答案 4 :(得分:7)

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

您可以将上述内容重写为:

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

答案 5 :(得分:6)

Python允许你将indented子句放在同一行,如果它只有一行:

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

def squared(x): return x * x

class MyException(Exception): pass

答案 6 :(得分:4)

较旧版本的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陈述或分配。

特别是如果需要使用一系列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)()

答案 7 :(得分:3)

您可以通过省略example变量来完成所有这些操作:

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

答案 8 :(得分:0)

潜入python有一点他会谈到他所谓的and-or trick,这似乎是将复杂逻辑塞进单行的有效方法。

基本上,它通过给你一种测试真相并根据它返回一个值来模拟c中的三元运算符。例如:

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

答案 9 :(得分:0)

这是&#34; if else&#34;行动。

>>> 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