【发布时间】:2014-03-04 15:48:48
【问题描述】:
我的一个朋友正在学习编程,他问我为什么没有“and if”/“also if”/“or if”语句(非排他或),其中多个,独立可以满足具有独立结果的测试条件,以防止触发任何“else”条件。 编辑:我认为我在这里选择的“或”可能是一个不好的关键字,因为or 关键字通常是懒惰地评估的,所以第二个分支永远不会触发。我所说的是所有真实条件触发的东西,但如果or ifs中没有真实条件,那么你继续@ 987654329@/elif分公司。
这是一个例子(使用python语法):
if a:
print('a evaluates True')
orif b:
print('b evaluates True')
else:
print('Both a and b evaluate False')
这与elif 的不同之处在于,如果 a 和b 都为真,则输出为:
a evaluates True
b evaluates True
而在elif 中,该条件的输出将是:
a evaluates True
我戴上“我已经编程多年”的帽子并开始解释,“嗯,当然没有 orif 声明,因为......”,但我想不出一个很好的理由.这个概念的一个很好的例子是fizzbuzz,你被要求打印1到100之间的所有数字,但所有能被3整除的数字都被fizz替换,所有能被5整除的数字被buzz替换,所有数字可被 3 和 5 整除,替换为 fizzbuzz。使用“orif”语法,它可以通过一个条件来完成:
for x in range(1, 100):
outstr = ""
if x%3 == 0:
outstr += "fizz"
orif x%5 == 0:
outstr += "buzz"
else:
outstr = x
print(x)
但如果没有它,你会遇到一些不太优雅的事情,要么切换到三个条件,要么至少再进行一次模运算:
for x in range(0, 100):
outstr = ""
if x%3 == 0:
outstr += "fizz"
if x%5 == 0:
outstr += "buzz"
if not x%15 == 0: # Could also be not (x%3 and x%5)
outstr = x
print(x)
或者您可以通过提前存储它们来避免额外的模运算:
for x in range(0, 100):
outstr = ""
fizz = (x%3 == 0)
buzz = (x%5 == 0)
if fizz:
outstr += "fizz"
if buzz:
outstr += "buzz"
if not (fizz or buzz):
outstr = x
print(x)
显然还有其他方法可以做到这一点,但没有一个像“orif”结构那样直观。回想起来,我注意到这是我实际上遇到很多次的事情,其中我有许多具有不同效果的条件,每个条件都需要评估,以及一个默认条件如果没有满足,则发生。我通常通过在每个单独的条件中都有一个烦人的“标志”变量来“解决”这个问题:
OneConditionMet = False
if a:
# Do the "a" stuff
OneConditionMet = True
if b:
# Do the "b" stuff
OneConditionMet = True
# ...
if n:
# Do the "n" stuff
OneConditionMet = True
if not OneConditionMet:
# Do the default behavior.
显然,这是一种非常不雅且令人讨厌的方式,“orif”解决了另一个问题。因此,考虑到“orif”的所有这些明确原因,我震惊地发现在Wikipedia article on conditionals 中没有任何提及任何类似的内容。这让我觉得我缺少一些基本的东西来解释为什么这不起作用。我能想到的唯一原因是,如上所述,评估需要稍微不那么懒惰,因为即使满足第一个“if”条件,它也需要检查是否出现任何“或 if”分支。不过,这是一个很容易解决的问题,因为您可以这样做,如果条件树中有任何 or if 语句,那么 all if 语句必须是 or if陈述,例如:
orif a:
print('a evaluates True')
orif b:
print('b evaluates True')
else:
print('Neither a nor b evaluate True')
那么,问题来了——我是否遗漏了一些与此基本相同的东西?我是否错过了它从根本上不可行的一些原因,或者这只是一个巨大的错失机会?
【问题讨论】:
-
python 有
if、elif、else构造。许多其他语言都有switch、case、default语句 -
这些构造实际上都没有这样做。在 C 中,
switch结构最接近,因为可以执行多个分支,但它不能像这样评估多个条件。 -
所以您希望条件
a和b彼此独立执行并在两者之间有一个else?很少有这样的事情在没有我可以关闭的变量集的情况下有用。 -
当然,但这又是一个不优雅的问题解决方案,涉及额外的不必要的条件评估。这显然没有为任何图灵完备的编程语言添加核心功能,令我感到惊讶的是,当感觉像是做事的自然方式时,似乎没有个例子发生这种事情。跨度>
-
我很难理解这个
orif与大多数语言允许的else if构造有何不同。你能举个例子说明使用orif比else if写的更好吗?
标签: programming-languages conditional-statements