Python中的Elif语句缺少else部分

3

在所有if语句都不成立时,是否可能在if行的末尾编写一个else?例如:

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

在这个例子中,如果foobar不等于5,则会执行else部分,但我希望在foobarfoobar都不等于5时执行它。(但是,如果所有语句都为true,则必须执行所有语句。)

条件是否重叠?即,多个条件是否可以同时为真? - Stefano Sanfilippo
是的,没错。但是只有在所有条件都不成立时才应该执行else - Nearoo
5个回答

5
像这样做怎么样?写四个if语句,但如果其他三个语句改变了变量key,第四个if语句就不会被执行。
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 使用一个布尔值! - jonrsharpe

3

我认为在Python或其他语言中没有任何过于优雅的方法来完成这个任务。你可以将值存储在列表中,但是这会使实际测试条件变得难以理解,例如:

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

谢谢您的回答,我会使用这个解决方案,因为无论如何我都能找出某些东西是否为“真”。我只是想 - 也许Python有自己更简单的方法来做到这一点... :) - Nearoo

2

不能直接实现,这三个if块是独立的。你可以使用嵌套,但那会变得非常复杂;最简洁的方法可能是:

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

谢谢你的想法 - 但我的语句并不总是5... :/ - Nearoo
@user3424423 或许你应该使用一个更清晰的例子。尽管如此,any 可以被使用。 - jonrsharpe
好的,我会记住的。谢谢。 - Nearoo

1
如果所有的if语句都是用来检查相同的值,我会使用以下格式。在我看来,这将使代码更短、更易读。
if 5 in (foo, bar, foobar):
    pass
else:
    pass

0
jonrsharpe的答案的一个变体是使用链接的等式测试。像这样:
if foo != bar != foobar != 5:
    #gets executed if foo, bar and foobar are all not equal to 5

看起来有点滑稽,我猜这取决于你来决定哪个更易读。显然,如果其中一个变量应该等于其他值,那么这种方法就行不通。

编辑:糟糕,这是无法工作的。例如 1 != 1 != 3 != 5 返回 false,而 1 != 2 != 3 != 5 返回 true。对不起


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接