是一行';如果'/';对于'-好的Python风格?

是一行';如果'/';对于'-好的Python风格?,python,for-loop,if-statement,idioms,Python,For Loop,If Statement,Idioms,在这里,我经常看到一些人的代码和看起来像“一行”的代码,这是一行语句,以传统的“if”语句或“for”循环的标准方式执行 我在谷歌上搜索过,真的找不到你能表演什么?有人能提供建议,最好举一些例子吗 例如,我可以在一行中完成此操作: example = "example" if "exam" in example: print "yes!" if "exam" in example: print "yes!" def squared(x): return x * x class My

在这里,我经常看到一些人的代码和看起来像“一行”的代码,这是一行语句,以传统的“if”语句或“for”循环的标准方式执行

我在谷歌上搜索过,真的找不到你能表演什么?有人能提供建议,最好举一些例子吗

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

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

def squared(x): return x * x

class MyException(Exception): pass
或:

那么


这是一种进步吗。您甚至可以通过用分号分隔来向
if
-子句的主体添加更多语句。我建议反对尽管。

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

if condition:
    do_something()


if condition: do_something()

if condition:
    do_something()
    do_something_else()

if condition: do_something(); do_something_else()

…等等。

您可以通过省略
示例
变量在一行中完成所有这些:

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

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

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

def squared(x): return x * x

class MyException(Exception): pass

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

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

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

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

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

同样,作为一种通用性,它会降低代码形式的质量。高质量的代码形式是python的一个关键语言特性

在某些情况下,python将提供在一行上完成事情的方法,这些方法肯定更像python。比如Nick 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

有些人可能会发现,与类似的
if(条件):
块相比,这些代码更具可读性和可用性


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

深入python有一点,他谈到了他称之为的,这似乎是一种将复杂逻辑塞进一行的有效方法

基本上,它模拟了c中的三元运算符,为您提供了一种测试真值并返回基于真值的值的方法。例如:

>>> (1 and ["firstvalue"] or ["secondvalue"])[0]
"firstvalue"
>>> (0 and ["firstvalue"] or ["secondvalue"])[0]
"secondvalue"
x=0; y=1

较早版本的Python只允许在“
for…”之后使用单个简单语句。
如果…:
或类似的块介绍性语句

我看到一个可以在同一行上有多个简单语句,就像这些语句一样。但是,有各种组合不起作用。例如,我们可以:

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
。。。但我们不能:

for i in range(3): if i % 2: print "That's odd!"
x=10; while x > 0: print x; x-=1
。。。等等

在任何情况下,所有这些都被认为是非常非肾盂的。如果您编写这样的代码,那么体验Pythonistas可能会对您的技能产生负面影响

在某些情况下,将多个语句合并在一行是勉强可以接受的。例如:

>>> (1 and ["firstvalue"] or ["secondvalue"])[0]
"firstvalue"
>>> (0 and ["firstvalue"] or ["secondvalue"])[0]
"secondvalue"
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)()
这是带有操作的“if-else”示例

>>> 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
>>定义乐趣(num):
打印“这是%d”%num
>>>乐趣(10)如果10>0,其他乐趣(2)
这是10
或
>>>乐趣(10)如果10<0,其他1
1.

不确定你在寻找什么……你能再解释一点吗?Python现在不是有那些奇怪的lambda东西,让你在一行上放更多的东西吗?当然,我不会用它们。我更喜欢旧的做事方式:-)我还没有研究过lambda。每次我在这里的问题中看到这个词,我都会快速点击书签!我想她/他指的是列表的理解。@DominicBou Samra:起初我还以为OP是在询问列表的理解,但仔细检查,他们只是指“如果语句或for语句中的一行”示例未定义。它需要引用。你不明白例子的哪一部分?每个代码片段不需要声明其所有变量。当然,除了codegolf之外,分号是至关重要的:-)Anurag:也许Stephan在这个代码段中使用“示例”一词是有原因的。@_bravado:正确。我认为您可以省略“just”一词:可读性是编程中的一个重要准则。在大多数语言中,将多个语句放在一行是不受欢迎的,但在Python中更是如此。它被认为是不和谐的,至少部分是因为它不符合重要空格决定所依据的理念。甚至不只是“某人”阅读你的代码……也不为你自己!如果你在很短的时间内没有阅读自己的代码,你会惊讶地发现阅读自己的代码有多么困难。@Vladius:代码片段确实如此,是的。答案总体上反对这种风格,正是因为PEP-8。(也许五年前就应该说得更清楚了。)小心点:这不会模拟C的三元运算符<代码>1?0:2等于
0
,但
1和0或2
等于
2
。使用另一个专门为此目的而设计的构造更安全:
0如果1或者2(这将产生
0
)(这里的问题是
0
的计算结果为
False