42

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

我用谷歌搜索,并不能真正找到你可以执行什么样的?任何人都可以建议并最好举一些例子吗?

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

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

或者:

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

10 回答 10

55

好,

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

这是一种改进吗?没有。您甚至可以在 - 子句的主体中添加更多语句,方法是if用分号分隔它们。我建议要这样做。

于 2009-11-13T12:50:41.077 回答
42

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

再次笼统地说,它会降低代码形式的质量。高质量的代码形式是 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 中的代码形式非常重要。

于 2009-11-13T13:31:32.207 回答
19

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

if condition:
    do_something()


if condition: do_something()

if condition:
    do_something()
    do_something_else()

if condition: do_something(); do_something_else()

...ETC。

于 2009-11-13T12:50:58.423 回答
12

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

a = 1 如果 x > 15 否则 2

于 2009-11-13T12:55:39.220 回答
7
for a in someList:
    list.append(splitColon.split(a))

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

newlist = [splitColon.split(a) for a in someList]
于 2009-11-13T13:10:09.100 回答
6

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

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

def squared(x): return x * x

class MyException(Exception): pass
于 2009-11-13T12:51:36.407 回答
4

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

if "exam" in "example": print "yes!"
于 2009-11-13T12:51:12.257 回答
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。如果您编写这样的代码,那么有经验的 Python 达人可能会对您的技能持暗淡的看法。

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

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)()
于 2009-11-14T12:20:51.260 回答
0

Dive into python 有一点他谈到了他所谓的and-or 技巧,这似乎是一种将复杂逻辑塞进一行的有效方法。

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

>>> (1 and ["firstvalue"] or ["secondvalue"])[0]
"firstvalue"
>>> (0 and ["firstvalue"] or ["secondvalue"])[0]
"secondvalue"
于 2009-11-13T15:15:51.793 回答
0

这是带有动作的“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
于 2016-04-25T04:37:51.873 回答