【问题标题】:Putting a simple if-then-else statement on one line [duplicate]将一个简单的 if-then-else 语句放在一行上[重复]
【发布时间】:2011-02-17 15:58:30
【问题描述】:

我刚接触 Python,我真的很喜欢简洁的语法。但是,有没有更简单的方法来编写 if-then-else 语句以便它适合一行?

例如:

if count == N:
    count = 0
else:
    count = N + 1

有没有更简单的写法?我的意思是,在 Objective-C 中我会这样写:

count = count == N ? 0 : count + 1;

Python 有类似的东西吗?

更新

我知道在这种情况下我可以使用count == (count + 1) % N

我问的是一般语法。

【问题讨论】:

  • 不应该是count = count == N ? 0 : N + 1;而不是count = count == N ? 0 : count + 1;吗?
  • 对于这种特定情况:count = (count+1) % (N+1) 会起作用。
  • 您可以在一行中执行 if-then。 '''如果 1==1: print('hi')'''
  • if 1==1: print('hi') 可以这样使用。 '''if 1==1: print('hi')''' 不会打印任何内容!
  • 我想知道count == (count + 1) % N 曾经做什么。目前它只评估count == (count + 1)(自然,结果总是False)。我已经检查了 Python 3.6.1 和 Python 2.7.10。

标签: python if-statement syntax ternary-operator


【解决方案1】:

这是一个比 if-then 更具体的 ternary operator 表达式,这是 python 语法

value_when_true if condition else value_when_false

更好的例子:(感谢Mr. Burns

'Yes' if fruit == 'Apple' else 'No'

现在有了赋值和对比 if 语法

fruit = 'Apple'
isApple = True if fruit == 'Apple' else False

对比

fruit = 'Apple'
isApple = False
if fruit == 'Apple' : isApple = True

【讨论】:

  • 这很像理解。你可以这样做:print('matched!' if re.match(r'\d{4,}', '0aa9') else "nopes")(假设你重新导入)
  • 请注意,速记语法仅对实际值有效。您可以将其与常量和函数一起使用 (Yes' if fruit == 'Apple' else print('No Apple')),但不能与关键字一起使用 ('Yes' if fruit == 'Apple' else raise Exception('No Apple'))
  • 我不清楚是否可以省略其他内容,如果fruit == 'Apple',我可以只选择“是”吗?
  • 使用三元形式的时候不能省略else,会导致语法错误,但是可以正常if在一行中,我更新了示例来说明。
  • 将此方法与使用多行 if 语句的相同方法进行对比可能会受益。
【解决方案2】:
count = 0 if count == N else N+1

- 三元运算符。尽管我会说您的解决方案比这更具可读性。

【讨论】:

  • 我更喜欢你的回答,它简单而简短
【解决方案3】:

一般三元语法:

value_true if <test> else value_false

另一种方式可以是:

[value_false, value_true][<test>]

例如:

count = [0,N+1][count==N]

这会在选择一个之前评估两个分支。仅评估所选分支:

[lambda: value_false, lambda: value_true][<test>]()

例如:

count = [lambda:0, lambda:N+1][count==N]()

【讨论】:

  • 这依赖于我不知道的(False, True) == (0, 1) 保证(但没有检查)的实现细节。虽然简洁,但它不会赢得任何可读性奖项。您也可以在 C 中使用 "abcdefg"[i],但这并不意味着您应该这样做。
  • @msw:保证False == 0True == 1:这里没有实现细节。 :) 请参阅 docs.python.org/reference/… 下的“布尔值”标题
  • 但是无论 [] 是什么,这两个值都不是计算出来的吗?
  • @msw:嗯,说到三元运算,我总是更喜欢第一个。我只是展示了另一种可能的方式......
  • 另一种方式:{N: 0}.get(count, N+1)。第三种方式,如果N+1 是一些昂贵的功能:{N: 0}.get(count, "anything truthy") and f(N)。这需要你知道dict的值的真实性,并且它们都需要具有相同的真实性。如果这些值都是真实的,则反转布尔运算符,例如{0: 7}.get(weekday, False) or f(weekday)
【解决方案4】:
<execute-test-successful-condition> if <test> else <execute-test-fail-condition>

使用你的 code-sn-p 会变成,

count = 0 if count == N else N + 1

【讨论】:

    【解决方案5】:

    此外,您仍然可以使用“普通”if 语法并将其与冒号合并为一行。

    if i > 3: print("We are done.")
    

    field_plural = None
    if field_plural is not None: print("insert into testtable(plural) '{0}'".format(field_plural)) 
    

    【讨论】:

    • 有人能解释一下为什么这不是最佳答案吗?恕我直言,它绝对是最容易阅读的。
    • 问题包含“其他”条件
    • @johannes-braunias 你的方法违反了 PEP8 标准。
    • 这很奇怪。这是来自PEP8 的特定“是”示例。 Yes: if x == 4: print x, y; x, y = y, x 我猜,你知道的,大地精之类的。
    • PEP8 不是圣旨。如果您的程序使用这种语法会更好,那很好。
    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2017-02-06
    • 2018-01-30
    • 1970-01-01
    • 2015-05-16
    • 2011-06-09
    相关资源
    最近更新 更多