for/else 语句中是否有等效的“elif”

Is there an “elif” equivalent in for/else statements

在 if/elif/else 语句中,如果 if 为假,则检查 elifs,如果 ifelifs 都为假,则else 是 运行.

For 循环与 else 关键字有相似之处 - 如果循环没有遇到中断,那么 else 中的代码是 运行.

因此,for 循环有一个 else 等同于 if/elif/else 语句。然而,我的问题是,是否有等同于 elif.

我认为它会是这样的:

我知道你可以模拟这种效果。正如您可以使用 if/else 语句来模拟 elif:

if condition:
    do_something()
else:
    if another_condition:
        do_something_else()
    else:
        default()

你可以用 for 循环来做到这一点:

for x in y:
    if condition:
        break
else:
    for n in m:
        if another_condition:
            break
    else:
        default()

虽然上面的代码是有效的,就像 if/else 语句一样,但它很丑陋,我希望找到一个更好的选择。

没有。如果您查看 for 语句的 grammar

for_stmt:
    | 'for' star_targets 'in' ~ star_expressions ':' [TYPE_COMMENT] block [else_block] 
    . . .

它以可选的 else_block 结束,但没有别的。我相信你的模拟会和你一样好。

我不确定,但也许 while 对你来说没问题

i = 0
while i < 10:
  if condition:
    break
  i += 1

虽然 for 循环语法不允许这样做(如@Carcigenicate 所示),但您可以使用 try-else:

来降低嵌套级别
try:
    for x in y:
        if z:
            raise SomeException
    for m in n:
        if o:
            raise SomeException
except SomeException:
    pass
else:
    default()

然而,更简洁的方法可能是将循环包装在函数中:

# these can be more complex non-anonymous functions
f1 = lambda: any(1 for x in y if z)
f2 = lambda: any(1 for m in n if o)
f3 = ...

if not any(f() for f in (f1, f2, f3)):
    default()

如果您将决定您是否应该继续全局的变量设为全局变量会怎么样?因为如果满足任何条件,您不想继续执行以下任何循环,这应该有效:



def do_something():
    for i in range(3):
        condition = i < 3
        if not condition:
            return False

    return True


def do_something_else():
    for i in range(3):
        condition = i < 2
        if not condition:
            return False

    return True


condition_met = True
if condition_met:
    print('we start here')
    condition_met = do_something()
if condition_met:
    print('and should get here')
    condition_met = do_something_else()
if condition_met:
    print('but not here')

它可能并不令人惊奇,但至少它没有嵌套,并且有点像您正在寻找的语法。

您也可以使用 while 循环:

operations = [do_something, do_something_else] 
i = 0
while condition_met and i < len(operations):
    condition_met = operations[i]()