2016-04-23 16 views
-6

私のコードは文字のみを受け入れることになっています(例えば、ジャックが受け入れられ、ジャック1は受け入れられません)。文字のみを入力として受け入れる

ユーザーに姓名を入力して保存するように求めます。いったん私がファーストネームのコードを書いたら、それをテストしてファーストネームのコードを正しく書いたかどうかを確認しましたが、それは私にthis errorを与え続けました。

答えでは、数字のみを許可してこの作業を行う方法を教えてください。

コード

import random 

operators = ["+", "-", "*"] 


def greeting(first_name, last_name): 
    print ("Hello", first_name + " " + last_name) 
    Play = input('Are you ready to begin?') 
    if Play == 'yes': 
    print("Great", first_name + ", lets begin") 
    else: 
    greeting(first_name, last_name) 



def Players_input(): 
    print ("Welcome to the Arithmetic Quiz") 
    first_name = input("Please enter your first name: ") 
    if all(x.isalpha() or x.isspace() for x in first_name): 
    last_name = input("Please enter your last name: ") 
    greeting(first_name, last_name) 
    else: 
    print("Only alphabetical letters and spaces: no") 

Players_input() 

score = 0               
for i in range(10):        
    first_number = random.randint(1,12)   
    second_number = random.randint(1,12)     
    op = random.choice(operators) 


    print (first_number, op, second_number, " = ?") 
    users_answer = int(input()) 

    if op == "+": 
     right_answer = first_number + second_number 
    elif op == "-": 
     right_answer = first_number - second_number 
    elif op == "*":    
     right_answer = first_number * second_number  

    if users_answer == right_answer: 
     print("Well Done!") 
     score += 1 
    else: 
     print ("Sorry but thats the wrong answer, the right answer is: " + str(right_answer) + ". Better luck next time") 

print (first_name, "Your final score in the Arithmetic Quiz is", str(score), "out of 10") 
+3

あなたは三回「助けてください」とその後、コードだけをダンプし、「エラーを修正する」と言うと言うべきではありません。あなたは一貫した答えを得るために一貫した質問を出す必要があります。 –

+0

'first_name'は' Players_input'関数のローカル変数であることを理解していませんか? – ForceBru

+1

写真としてのエラーを投稿してはいけません。コードの書式設定を使用してください:) – Signal

答えて

1

最初の問題の答え:あなたはPlayers_inputの外FIRST_NAME を定義したことはありません

。この値は関数内に保存され、getはその後削除されます。 (the link added by gjttt1でこれについての詳細は)これを解決する方法は2つあります。

  • あなたはfirst_nameのは、グローバル作ることができます。しかし、これは悪いスタイルなので、私はこのオプションを使用しません。 は、Players_inputに書き込まれる前に書き込まれます(最初の印刷呼び出しの前または直後のいずれかに)。
  • あなたはfirst_nameを返すことができます。これが好ましい方法です。 Players_inputの末尾にreturn first_nameを追加し、Players_input()first_name = Players_input()に置き換えます。

第二の問題への答え:

だけではなく、int(input())のこの機能を使用する(int_input()でこの行を置き換えます):

def int_input(prompt="", error_message="You didn't enter an integer!"): 
    while True: # repeat this until the function returns 
     inp = input(prompt) # get the input after autputting the prompt. 
     try: # Try to... 
      return int(inp) # turn it into an integer. If it works, return it. 
     except ValueError: # If it didn't work, it raised a ValueError. In this case... 
      if error_message: # print the error_message if it is not "", false or None. 
       print(error_message) 

その後、あなたは第三の問題点を持っている:あなただけ使用する必要があります小文字のをクラスと区別するために、関数名で示しています。これはちょうどあなたのスタイルですが、それは確かに良い、明確なコーディングスタイルを開発するのに役立ちます。

私はあなたが以前のコードでは=(「こんにちは」)のfirst_nameを宣言することができますし、入力機能として、それを呼び出したとき、あなたは同じようにそれを書くことができ

CodenameLambda

+0

ありがとうCodingLambdas、私は自分のコードが働いて、私が欲しいことをしている。 :) – IcarusFlight

+0

あなたは大歓迎です。 – CodenameLambda

1

は、エラーを見てください。 first_name変数が定義されていないことを伝えています。これは、Players_input関数内のローカル変数であり、他の場所では使用できないためです。関数内で定義された変数はメモリ内のスタックに置かれ、そのスタックフレームがスタックからプッシュされると破棄されます。あなたはこれを「範囲外」と呼んでいます。

変数の範囲についての情報を参照することをお勧めします。

0

、私は助けることができる願っています:

first_name=str(input('Please enter your first name: '))

+1

型を文字列に変更することは* nothing *(input * already *は文字列を返すため)であり、問​​題を解決するために何もしません。そしてかっこも余分にある。コードを '\' 'で囲む必要があります。そうでなければコードとして表示されないからです。 – CodenameLambda

関連する問題