【问题标题】:Python: If statement not working? [duplicate]Python:如果语句不起作用? [复制]
【发布时间】:2015-10-31 17:22:10
【问题描述】:

我有一段代码不起作用。

if difficulty=="Easy" or "easy" or "1":
    with  open("EasyQs.csv") as f:
        allData = [line.strip().split(",") for line in f]
        questions  = [data[0] for data in allData]
        answers = [data[1] for data in allData]
    print(questions)
if difficulty=="Hard" or "hard" or "2":
    with  open("MediumQs.csv") as f:
        allData = [line.strip().split(",") for line in f]
        questions  = [data[0] for data in allData]
        answers = [data[1] for data in allData]
    print(questions)

我尝试输入 2(hard 或 Hard),但它总是打印“简单”CSV 中的问题? 为什么是这样?又该如何解决?

【问题讨论】:

  • 使用elif 而不是if
  • 在这两种情况下,您打开同一个文件:EasyQs.csv
  • 现在or 部分正在评估为True,因为if "string"True,除非字符串是""
  • 现在您知道为什么 if 语句的行为不像您预期​​的那样,您应该尝试重新组织代码以减少重复:只需在 if 语句中选择文件名,然后有一个单独的部分,您可以在其中打开文件并处理它。如果可行,您应该try to avoid duplicating code

标签: python csv


【解决方案1】:

在 Python 中,如果你想检查某个东西是否是一组值中的一个,你可以使用这个:

if difficulty in ("Easy", "easy", "1"):

原因是您现在正在做的事情并不像您想象的那样有效。你的条件:

if difficulty == "Easy" or "easy" or "1":

实际上是这样计算的:

if (difficulty == "Easy") or ("easy") or "1":

因为or 是一个比== 更松散的绑定运算符。所以这个整体组合条件将永远为真,因为"easy" 是一个真值,所以即使(difficulty == "Easy") 为假,or 运算符也会将其右侧评估为真并返回它。

这就是为什么现在你的“简单”案例总是触发。

【讨论】:

  • 您还应该在答案中引入.lower() 函数,这样您就不必输入easy两次。 ;)
  • @DeliriousMistakes 可能,但这主要与核心点正交,因此往往会分散答案。
  • 有道理。坚持主要问题。 +1
  • @DeliriousMistakes 下方的评论是添加类似提示的好地方。 :)
【解决方案2】:

if "string"True

试试这个:

if difficulty=="Easy" or difficulty=="easy" or difficulty=="1":

【讨论】:

    【解决方案3】:

    你的陈述

    if difficulty=="Easy" or "easy" or "1":
    

    被视为

    if (difficulty=="Easy") or ("easy") or ("1"):
    

    非空字符串被解释为True,所以你的表达式实际上是:

    if difficulty=="Easy" or True or True:
    

    永远是True。要解决此问题,请使用以下内容:

    if difficulty.lower().strip() in ('easy', '1'):
    

    这会将测试转换为小写,去掉前导和尾随空格,看看它是否适合给定值元组中的项目。

    【讨论】:

      【解决方案4】:

      在 python 中,if-statement 中使用的 if 不能超过 1 个。对于第一个 if 之后的所有 if,您需要使用 elif。然后in 使两个答案都变得困难。而.lower() 使用户输入小写,因此您不必在选择中执行“硬”,因为它会将其更改为“硬”。

      if difficulty.lower() in ("easy", "1"):
                  with  open("EasyQs.csv") as f:
                      allData = [line.strip().split(",") for line in f]
                      questions  = [data[0] for data in allData]
                      answers = [data[1] for data in allData]
                  print(questions)
      elif difficulty.lower() in ("hard", "2"):
                  with  open("EasyQs.csv") as f:
                      allData = [line.strip().split(",") for line in f]
                      questions  = [data[0] for data in allData]
                      answers = [data[1] for data in allData]
                  print(questions)
      

      【讨论】:

      • 第一个之后的所有ifs 都不需要使用elif
      • @davejagoda 你什么时候会在第一个之后使用另一个if?我从来不知道你可以。
      • @DeliriousMistakes 我至少能想到两个原因——一个是你知道条件是互斥的。另一个是您将在一个 if 语句中退出、中断或返回,因此如果第一个 if 为 True,您将无法到达下一个。
      • @PM2Ring 谢谢没注意到
      【解决方案5】:

      您的第二个 if 语句必须是您已经创建的“elif”语句和 if 语句。

      【讨论】:

      • 这不一定是真的 - 假设我知道 if 语句是互斥的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 2013-06-20
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多