for/else 语句中是否有等效的“elif”
Is there an “elif” equivalent in for/else statements
在 if/elif/else 语句中,如果 if
为假,则检查 elif
s,如果 if
和 elif
s 都为假,则else
是 运行.
For 循环与 else
关键字有相似之处 - 如果循环没有遇到中断,那么 else
中的代码是 运行.
因此,for 循环有一个 else
等同于 if/elif/else 语句。然而,我的问题是,是否有等同于 elif
.
我认为它会是这样的:
运行 for 循环。如果没有遇到break
,则进行下一步
指定循环
运行指定的for循环,如果没有遇到break
,则进入
接下来。
重复,直到不再有循环,如果没有 break
遇到到这一步,运行 else
.
我知道你可以模拟这种效果。正如您可以使用 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]()
在 if/elif/else 语句中,如果 if
为假,则检查 elif
s,如果 if
和 elif
s 都为假,则else
是 运行.
For 循环与 else
关键字有相似之处 - 如果循环没有遇到中断,那么 else
中的代码是 运行.
因此,for 循环有一个 else
等同于 if/elif/else 语句。然而,我的问题是,是否有等同于 elif
.
我认为它会是这样的:
运行 for 循环。如果没有遇到
break
,则进行下一步 指定循环运行指定的for循环,如果没有遇到
break
,则进入 接下来。重复,直到不再有循环,如果没有
break
遇到到这一步,运行else
.
我知道你可以模拟这种效果。正如您可以使用 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]()