【问题标题】:Elif-row without else python没有 else python 的 Elif-row
【发布时间】:2014-06-15 15:05:16
【问题描述】:

是否可以在if-row 的末尾写一个else,只有当所有if 语句都不为真时才会执行?示例:

if foo==5:
    pass
if bar==5:
    pass
if foobar==5:
    pass
else:
    pass

在本例中,如果foobar 不是 5,则执行 else 部分,但我希望在 foobarfoobar 不是 5 时执行它。(但是,如果所有语句为真,所有语句都必须执行。)

【问题讨论】:

  • 条件是否重叠? IE。可以同时存在多个事实吗?
  • 是的,完全正确。但是else只有在全部错误的情况下才应该执行。

标签: python if-statement


【解决方案1】:

做这样的事情怎么样?制作四个 if 语句,但如果运行其他三个 if 语句中的一个,则不会运行第四个 if 语句,因为其他语句会更改变量 key

key = True

if foo == 5:
    key = False
if bar == 5:
    key = False
if foobar == 5:
    key = False
if key:
    pass # this would then be your else statement

【讨论】:

  • 至少对key1使用布尔值!
【解决方案2】:

我认为在 Python 或任何其他语言中没有任何过于优雅的方法可以做到这一点。您可以将值存储在列表中,但这会混淆实际的测试 if,例如

tests = [bar ==4, foo == 6, foobar == 8]

if tests[0] :
  # do a thing
if tests[1] :
  # Make a happy cheesecake
if tests[2] :
  # Oh, that's sad

if not True in tests :
  # Invade Paris

或者你可以设置一个跟踪标志

wereAnyTrue = False

if foo == 4 :
  # Do the washing
  wereAnyTrue = True
if bar == 6 :
  # Buy flowers for girlfriend
  wereAnyTrue = True

# ... etc

if not wereAnyTrue :
  # Eat pizza in underpants

【讨论】:

  • 感谢您的回答,我将使用此解决方案,因为无论如何我都能找出是否有true。我只是想 - 也许 python 有它自己的,更简单的方法...... :)
【解决方案3】:

不是直接的 - 这三个 if 块是分开的。您可以使用嵌套,但这会变得非常复杂;实现这一点的最巧妙方法可能是:

if foo == 5:
    ...
if bar == 5:
    ...
if foobar == 5:
    ...
if not any((foo == 5, bar == 5, foobar == 5)):
    ...

【讨论】:

  • 感谢您的想法 - 但我的陈述并不总是 5... :/
  • @user3424423 也许您应该使用更清晰的示例。尽管如此,any 还是可以使用的。
  • 是的。我会记住的。谢谢。
【解决方案4】:

如果所有if 语句都用于检查相同的值,我会改用以下格式。这将使代码更短,更易读,IMO

if 5 in (foo, bar, foobar):
    pass
else:
    pass

【讨论】:

    【解决方案5】:

    jonrsharpe 的答案的一个变体是使用链式相等测试。像这样:

    if foo != bar != foobar != 5:
        #gets executed if foo, bar and foobar are all not equal to 5
    

    看起来有点好笑,我想由你决定哪一个更具可读性。而且,显然,如果这些变量之一应该等于不同的值,这将不起作用。

    编辑:糟糕,这行不通。例如 1 != 1 != 3 != 5 返回假,而 1 != 2 != 3 != 5 返回真。对不起

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-03
      • 2017-07-03
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多