2017-06-27 4 views
0

関数を使用して出力を描画するコードをここに用意しました。私は "プロンプト"が定義されていない取得し続けますが、それはすでにfilterer関数に記載されていないのですか? [1]名前Pythonの関数からのエラー

def menu(): 
    print ("[1] Compute Area of a Circle") 
    print ("[2] Compute Perimeter of a Rectangle") 
    print ("[3] Compute Volume of a Cone") 
    print ("[4] Compute Slope of a Straight Line") 
    print ("[5] Exit") 

    #Determining the input of the user  
    choice = filterer("Choose from the menu:") 

#function for the filter 
def filterer(prompt): 
    while True: 
     choice = float(input(prompt)) 
     if choice > 5 or choice < 1: 
      print ("Must input integer between 1 and 5. Input again") 
     elif choice.is_integer == False: 
      print ("Must put an integer. Input again.") 
     else: 
      return prompt 

filterer(choice) 
+4

'prompt'はなく、それ外に、関数定義内で定義されています。つまり、 'filterer(prompt)'行には定義されていません – Hamms

+2

最後の行で 'filterer(prompt)'を呼び出すと、 'prompt'の値は何ですか?あなたはどこにでもそれを定義していません。 – stybl

+0

しかし、関数値を呼び出す方法は "filterer(prompt)"を使用していませんか?それは他の機能に使用されるので、私は価値が必要です。 –

答えて

1

@Hammsと@stybl両方がコメントでこれに答え、しかし、ちょうど明確にするために、あなたは

filterer(prompt) 

を変更する必要がある[ここに画像の説明を入力します]

filterer("do some amazing thing or something") 

「何かすばらしいことや何かをする」の代わりにプロンプ​​トとして使用したい引用符を除いて

これの鍵は、コードの範囲について考えることです。 filterer(prompt)は、プロンプトが呼び出された時刻によって定義されると仮定します。しかし、プロンプトを定義することなくそれを呼んでいます。あなたがしたい場合、あなたはそれが機能外部からアクセスできないようにプロンプ​​トが、機能filtererの範囲内で定義され、例えば、

prompt = "do something super groovy" 
filterer(prompt) 
0

をプロンプトを定義することができます。ライン:

filterer(prompt) 

は次のように変更する必要があります。

foo=filterer(bar) 

変数バーはこれを実行する前に定義する必要があります。

1

スコープは楽しい概念です。基本的に、変数は範囲外になると死ぬ。これにより、コード内にiという複数の変数を使用することができます(ただし、その使用法は重複しません)。

コード内で問題が発生しています。関数filterer('Choose from the menu:')を呼び出すと、Choose from the menu文字列が変数promptに渡されます。これは関数filterer内にのみ存在します。

filterer関数は、変数promptに含まれる値は、線choice = filterer('Choose from the menu')によって(機能menuの範囲を有する)可変choiceに戻されるラインreturn prompt、で終了します。

filterer関数が終了したため、prompt変数が有効範​​囲外になり、もはや存在しなくなりました。プロンプトの値を変数choiceに戻したので、menu関数内の値を使用しています。

+0

私はそれをfilterer(choice)に変更しようとしましたが、私はまだ同じエラーを受けています。どういう意味ですか? –

+0

おっと、私の悪い@CzarLuc。あなたのコードを間違って読んで、 'choice'が大域変数であることを暗示しました。本当にそれはあなたのメニュー関数の一部です。 Facepalm。私は私の答えを更新します。必要に応じて、filtererを実行するために新しい変数を作成する必要があります。 –

+0

それは大丈夫です。新しい変数を作成する場合、filterer関数の値が必要な場合、どのように入力する必要がありますか? –

1

他の人が主な問題点を指摘しています。つまり、そのスコープに存在しない変数(prompt)を参照しようとしているということです。

私はあなたがfiltererを2度呼びたいとは思わないと言いました。プロンプトを返すとは思っていません。また、整数テストは正しくありませんでした。ここで

は完全な作業コードです:

def filterer(prompt): 
    while True: 
     try: 
      choice = int(input(prompt)) 
     except ValueError: 
      # Value couldn't be parsed as an integer 
      print("You must enter an integer. Try again.") 
     else: 
      # Value was successfully parsed 
      if choice > 5 or choice < 1: 
       print("Must input integer between 1 and 5. Input again") 
      else: 
       return choice # <-- changed from prompt 

def menu(): 
    print("[1] Compute Area of a Circle") 
    print("[2] Compute Perimeter of a Rectangle") 
    print("[3] Compute Volume of a Cone") 
    print("[4] Compute Slope of a Straight Line") 
    print("[5] Exit") 

    # Determining the input of the user  
    choice = filterer("Choose from the menu: ") 

    print("You chose: {}".format(choice)) 

menu() 
+0

'return choice'ではなく、' return filterer(prompt) ' –

+0

@BrettBeattyという再帰呼び出しを探していた可能性があります。それだけで何度も何度もメニューが表示されるようになります。 – smarx

+0

ああ、nvm、私はそれが 'else'の前にあると読んでいます –

関連する問題