【问题标题】:Python conditionals without if statements没有 if 语句的 Python 条件
【发布时间】:2022-11-05 08:04:34
【问题描述】:

我正在尝试完成以下作业,但我很难过:

创建一个名为 mark 的变量并将其赋值为 65。然后编写一系列 if ... elif ... else 语句为新变量分配一个等级,使得低于 50 的标记产生“失败”,从 50 到 59 产生“通过”,从60 到 69 岁产生“Merit”,70 岁及以上产生“Distition”。

打印成绩。

然后再次实现相同的逻辑,但这次不使用 if 语句。

我能够完成第一部分,但我不确定如何做同样的避免 IF 功能 - 有人可以帮忙吗?

使用 IF 函数我有以下按预期工作:

mark = 50
if mark > 69:
    print(mark, "marks is a Distinction")
elif mark <= 69 and mark >= 60:
    print(mark, "marks is a Merit")
elif mark <= 59 and mark >= 50:
    print(mark, "markss is a Pass")
else:
    print(mark, "marks is a Fail")

我不知道从哪里开始避免 if 函数

【问题讨论】:

  • 您可以使用while 和末尾的无条件break 作为if 的替代品。这很愚蠢,但任务也是如此。
  • (关于我是如何得出这个建议的——“从哪里开始”是通过查看流量控制操作员列表并考虑他们如何在你的最终被滥用)
  • ...也就是说,Stack Overflow 的范围仅限于实际的,可回答的问题;避免使用显然是适合工作的工具的东西绝非实用。
  • 我希望老师不要指望他们使用match 声明...
  • 我很确定您可以“滥用”布尔值来为结果编写代数表达式:例如,尝试为不同的打印 a = "small"*(mark < 50) + "big" * (mark >= 50)标记的值。

标签: python conditional-statements


【解决方案1】:

如果使用纯 Python,您当前的结构可能是最易读和最明确的。请注意,您可以通过仅检查一个边界来简化,因为您的间隔是连续的且不重叠。

mark = 50
if mark > 69:
    print(mark, "marks is a Distinction")
elif mark >= 60:
    print(mark, "marks is a Merit")
elif mark >= 50:
    print(mark, "marks is a Pass")
else:
    print(mark, "marks is a Fail")

也就是说,如果你真的想要一个非如果的解决方案并且想惹恼你的导师,那么:

mark = 65
grades = ['Fail', 'Pass', 'Merit', 'Distinction']
print(f"{mark} is a {grades[sum((mark >= 50, mark >= 60, mark > 69))]}")

使用itertools.compress 的另一种方法:

from itertools import compress
grades = ['Distinction', 'Merit', 'Pass', 'Fail']
tests = (mark > 69, mark >= 60, mark >= 50, True)
print(f"{mark} is a {next(compress(grades, tests))}")

【讨论】:

  • 哇,与我的想法相似,但更加优雅和明确!点赞
  • @Yevhen 不确定我会称之为优雅,而是“hacky”。我当然不会在生产代码中使用它;)
  • 当任务声明“不使用 if 语句”时,没有人再谈论生产代码了:)
  • 我喜欢第二种解决方案;正如我在之前的评论中所说,我怀疑这会惹恼教练(除非我完全错了他们的目的)。
【解决方案2】:

假设列表["Fail", "Pass", "Merit", "Distinction"]

如果将mark 除以 10(无余数)(mark // 10),则 50-59 为 5,60-69 为 6,依此类推。如果从中减去 4,您将获得正确的结果(1 代表“通过”,2 代表“优异”,3 代表“杰出”)。除了 mark 小于 40 或大于 80 的情况。我们可以相应地使用 minmax 来限制索引:

mark = 50
["Fail", "Pass", "Merit", "Distiction"][min(max(mark//10 - 4, 0), 3)]

这是一个非常奇怪的任务的非常奇怪的解决方案

【讨论】:

  • 我也喜欢它(尽管取决于常规模式);)
【解决方案3】:

与其他答案有点不同的方法,我用 min/max 限制索引并从一个大列表中获取一个值。

grades = ["Fail"]*50 + ["Pass"]*10 + ["Merit"]*10 + ["Distiction"]

for mark in [-100,0,49,50,51,59,60,61,69,70,71,120]:
    print(mark,grades[min(len(grades)-1,max(0,mark))])

【讨论】:

    【解决方案4】:

    我将加入乐趣:) 我的解决方案:

    mark = 65
    
    print("Fail"*(mark < 50) + "Pass"*(50 <= mark < 60) + "Merit"*(60 <= mark < 70) + "Distinction"*(70 <= mark))
    
    # Merit
    

    为了说明我的观点,无论看起来多么无关紧要,都可以使用,我想象了另一个(非常荒谬但有趣且有效)的解决方案(它假设 mark 是 0 到 100 之间的整数):

    a="ffffffffffffffffffffffffffffffffffffffffffffffffffppppppppppmmmmmmmmmmddddddddddddddddddddddddddddddd"
    print(a[mark].replace("f", "Fail").replace("p","Pass").replace("m","Merit").replace("d","Distinction"))
    

    【讨论】:

      猜你喜欢
      • 2016-06-20
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      相关资源
      最近更新 更多