2017-09-21 6 views
0

あなたが学生か教員かを尋ねるコードを実行しようとしていて、あなたが居住者であり、回答に応じて証明書割引を適用していますが、何らかの理由で、食料コストの入力。私の投稿に間違いがあっても、これは初めてのことです。Python:文が繰り返され続ける文

このような(S)tudentまたは(F)aculty? S
寮生ですか? (Y/N)Y
食品費用:$ 4
食品費用:$ 4
食品費用:$ 4
等...

それは、このような

を行くべき(S)tudentまたは(F)教授? S
寮生ですか? (Y/N)Y
食品費用:$ 4
非食品コストの:$
総コスト$:

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() 
+0

'=='は比較です。 TrueまたはFalseに何も割り当てていない –

+2

@ cricket_007他の問題の中でも... –

答えて

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 

その時点でcalculate_foodが再び呼び出されているので、だからこれが唯一、限りif calculate_food('S',True)として取得することができますので、この関数の別の呼び出しが実行cost = raw_input("Food cost: $")を開始します。

おそらく、user_typegets_discountのパラメータの値をチェックすることを意図していましたか? if calculate_food('S',True)は、「calculate_food関数がパラメータ 'S'およびTrue ...」で呼び出された場合、「パラメータ 'S'およびTrueを使用して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 
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

を私はあなたがに慣れることをお勧めしたいですrecursionのコンセプト。 functions、定義、呼び出し、戻り値についてもう少し理解してください。

いずれにしても、一般的な問題を処理するためのいくつかの代替パターンを示すスニペットを少し見直してみましょう。しかし、辞書、例外とラムダのような新しい概念を導入しています:

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() 

をまた、あなたが徹底的にあなたのソフトウェアをテストします...上記のスクリプトは、(ヒント目的で、いくつかの未処理の例外が含まれています。ユーザーが入力できることのすべての並べ替えお使いのソフトウェアで正常に処理する必要があります)

お楽しみください!

関連する問題