Python:程序不断重复if语句

时间:2017-09-21 02:31:06

标签: python

我试图做一个代码,询问你是否是学生或教职员工,如果你是一名居民并根据答案申请认证折扣,但由于某种原因,它会不断重复食品成本输入。这也是我的第一次,对不起,如果我在发帖中犯了错误。

喜欢这个(S)tudent还是(F)教师?小号
宿舍居民? (是/否)Y
食品费用:4美元 食品费用:4美元 食品费用:4美元 等...

应该去

喜欢这个(S)tudent还是(F)教师?小号
宿舍居民? (是/否)Y
食品费用:4美元 非食品费用:2美元 总费用$:等等。

def calculate_food(user_type,gets_discount):
  cost = raw_input("Food cost: $")
  cost = float(cost)
  if calculate_food('S',True):
    return cost * .9
  elif calculate_food('S',False):
    return cost * .95
  elif calculate_food('F',True):
    return cost * .8
  else:
    return cost * .95
def calculate_other():
  cost = raw_input("Non-food cost: $")
  cost = float(cost)
  return cost * 1.055
def calculate_total():
  user_type = raw_input("(S)tudent or (F)aculty?")
  if user_type == 'S':
    gets_discount = raw_input("Dorm resident? (Y/N)")
    if gets_discount == 'Y':
      gets_discount == True
    elif gets_discount == 'N':
      gets_discount == False
    else:
      print("Invalid input, Y or N only.")
      quit()
  elif user_type == 'F':
    gets_discount = raw_input("Meal plan? (Y/N)")
    if gets_discount == 'Y':
      gets_discount == True
    elif gets_discount == 'N':
      gets_discount == False
    else:
      print("Invalid input, Y or N only.")
      quit()
  else:
    print("Invalid input, S or F only.")
    quit()
  calculate_food(user_type,gets_discount)
  calculate_other()
  totalCost = calculate_other() + calculate_food(user_type,gets_discount)
  print"Total cost: $",totalCost
calculate_total()

3 个答案:

答案 0 :(得分:1)

目前,在calculate_food被调用的任何时候,它总会要求输入,然后拨打calculate_food,然后又要求输入和调用calculate_food等。我想你实际上是什么希望calculate_food检查user_typegets_discount是否满足特定条件,而不是再次致电calculate_food

def calculate_food(user_type,gets_discount):
    cost = raw_input("Food cost: $")
    cost = float(cost)
    if user_type == 'S' and gets_discount:
        return cost * .9
    elif user_type == 'S':
        return cost * .95
    elif user_type == 'F' and gets_discount:
        return cost * .8
    else:
        return cost * .95

答案 1 :(得分:1)

您正在calculate_food函数中调用calculate_food。这称为recursion。而且因为你的函数总是以递归方式调用自身,它将永远循环。 (故意实现的递归函数会使用某种测试来确定它们何时不再需要再次调用自己,并且此时递归将停止和展开,因此原始函数调用可以完成。)

这是您的问题功能:

def calculate_food(user_type,gets_discount):
  cost = raw_input("Food cost: $")
  cost = float(cost)
  if calculate_food('S',True):
    return cost * .9
  elif calculate_food('S',False):
    return cost * .95
  elif calculate_food('F',True):
    return cost * .8
  else:
    return cost * .95

因此,这只能达到if calculate_food('S',True),因为此时再次调用calculate_food,因此对此函数的另一次调用会启动执行cost = raw_input("Food cost: $")

或许您打算检查user_typegets_discount参数的值?您应该了解if calculate_food('S',True)并不意味着"如果使用参数' S'来调用calculate_food函数。和真......"而是意味着"再次使用参数' S'再次调用calculate_food函数。和True然后如果该调用的返回值为真..."

所以你的函数应该是这样的:

def calculate_food(user_type,gets_discount):
  cost = raw_input("Food cost: $")
  cost = float(cost)
  if user_type == 'S' and gets_discount:
    return cost * .9
  elif user_type == 'S' and not gets_discount:
    return cost * .95
  elif user_type == 'F' and gets_discount:
    return cost * .8
  else:
    return cost * .95

答案 2 :(得分:1)

为了了解您的代码为什么会重复自我,我建议您熟悉recursion的概念。另外,请确保您更了解functions,定义,调用,返回值......

在任何情况下,这里都会对您的代码段进行一些回顾,向您展示一些可以处理常见问题的替代模式。它引入了新的概念,如字典,异常和lambdas:

def str2bool(v):
    if v.lower() in ("y"):
        return True
    elif v.lower() in ("n"):
        return False
    else:
        raise Exception("Invalid input, Y or N only")


def calculate_food(user_type, gets_discount):
    cost = float(raw_input("Food cost: $"))

    return {
        ("S", True): lambda x: x * .9,
        ("S", False): lambda x: x * .95,
        ("F", True): lambda x: x * .8,
        ("F", False): lambda x: x * .95,
    }[(user_type, gets_discount)](cost)


def calculate_other():
    return float(raw_input("Non-food cost: $")) * 1.055


def calculate_total():
    user_type = raw_input("(S)tudent or (F)aculty?")
    if user_type not in ("S", "F"):
        print("Invalid input, S or F only.")
        quit()

    try:
        gets_discount = str2bool(raw_input({
            "S": "Dorm resident? (Y/N)",
            "F": "Meal plan? (Y/N)"
        }[user_type]))
    except Exception as e:
        print("Invalid input, Y or N only.")
        quit()

    food_prize = calculate_food(user_type, gets_discount)
    other_prize = calculate_other()
    print("Total cost: $ {}".format(food_prize + other_prize))

calculate_total()

另外,请确保您对软件进行了彻底测试...上述脚本包含一些未处理的异常(提示:用户可以输入所有类型的内容,您的软件应该优雅地处理它)

玩得开心; D!