2017-12-15 2 views
0

これは最初から小さなPythonプロジェクトです。アイデアは、ユーザーの入力を受け取り、ユーザーの入力によって指定された指定された桁数で "e"を戻すことです。それは間違いなく非Pythonのやり方ですが、外部の支援なしにそれを試して解決することが私の目標でした。ご覧のとおり、私はPython 2.7を使用しています。else文がこれを処理しない理由は何ですか?

euler = 2.71828 

digits = raw_input('Please enter the desired digit: ') 

digitsError = 'Error: Please enter an integer' 

euler_str = str(euler) 

私は、非整数入力に対処するために "else"文が必要であると予想しました。しかし、私はエラーメッセージ(ValueError)を受け取りました。

def digitsCheck(): 
    if digits == int: 
     return digits 
    else: 
     return digitsError 

digitsCheck() 

私はエラーと例外を再検討することを決めたと、私は使用することができます実現「/試みる除く/ついに」など

try: 
    print('3'+euler_str[1:int(digits)+2]) 
except ValueError: 
    print(digitsError) 

それはおそらく、ここで非常に単純な問題ですが、私は材料Iを再訪していますPythonを学ぶために使われたもので、問題を特定することはできません。どうもありがとうございます!

編集:上記 エラーメッセージ:

ValueError: invalid literal for int() with base 10: 

Iはraw_input(非整数を使用する場合、私はこのメッセージを取得します)。

+1

使用̶'̶t̶y̶p̶e̶(桁)̶̶=̶=̶̶i̶n̶t̶'̶.̶̶'̶i̶n̶t̶'̶自体であるザ・クラスオブジェクト '<クラス̶'̶i̶n̶t̶'̶>̶'̶.̶使用'でisinstance (digits、int) 'を参照してください。@pstatixは以下のように示唆しています。 –

+3

よくあることです:1. 'raw_input'は' str'を返します。 2.あなたは 'digitsCheck()'を呼び出しますが、 'digits'が' global'(そうでない)でなければ、 'digits'が何であるか分かりません。 – pstatix

+5

@KilianBatzner 'type()'を呼び出すのではなく、 'isinstance(digits、int)'を使う方が良いです。 – pstatix

答えて

0

問題は、というスコープという概念に関連しています。プログラミングに関して、スコープとは、プログラムの実行中にシステムが変数を使用する方法です。

  • グローバル:ローカルすべて
  • でみる:簡単にするために、我々は約2変数話をするだけでいくつかのもの

プログラムは、関数を実行し、変数で見たが、myVarを言いますその関数内で初期化され、スタックにスローされます。関数が実行を終了すると、ローカル変数はスタックからポップされ、もはやメモリ空間で参照されることはありません。対照的に、グローバル変数は、プログラム実行時にスタックにスローされ、その時点までスタックに残るため、プログラム完了まではいつでも参照できます。 一般的なルールは、グローバル変数はあまり推奨されません。単純にローカル変数を使用し、関数スコープに依存します。

global myVar # technically program starts here, allocates memory on the stack for 'myVar' 

def local(): # Notice there are no function parameters 
    print (myVar) # myVar is accessible outside this local function 

def change(): # Again, no parameters 
    myVar = 'World' # Again, accessible 
    local() 

# Program starts here 
myVar = 'Hello' 
local() 
change() 

# Outputs: 
# 'Hello' 
# 'World' 

を今、私は、ローカル変数と同じことをしようとした場合::

def local(): 
    print (myVar) 

def change(): 
    myVar = 'World' 
    local() 

myVar = 'Hello' 
local() 
change() 

# Outputs:  
# Will not output, will thrown error saying `myVar` is not defined 

あなたがそう、コンピュータアーキテクチャのコースを取っていない場合

これは少し複雑に見えるかもしれません理由はそれが働かない理由はlocal()に変数がないのでmyVarと呼ばれます。その変数は関数のスコープの外で定義されます。この問題を解決するには、我々はこのように、必要な機能のスコープに持ち込む、変数を渡し

def local(var): # var == myVar 
    print (var) 

def change(var): # var == myVar 
    var = 'World' 
    local(var) 

myVar = 'Hello' # Start with a main local variable 
local(myVar) # Give it to 'local()' 
change(myVar) # Give it to 'change()' 

# Outputs:  
# 'Hello' 
# 'World' 

最後に、私たちはあなたのケースを見ることができます:

def digitsCheck(): # This is a local function 
    if digits == int: # Interpreter is wondering "What is digits?" 
     return digits 
    else: 
     return digitsError # Interpreter is wondering "What is digitsError?" 

euler = 2.71828 # Constant 
digits = raw_input('Please enter the desired digit: ') # Local variable 
digitsError = 'Error: Please enter an integer' # Local variable 
euler_str = str(euler) # Local variable 

digitsCheck() # Call to local function [but this also returns, how do you capture?] 

ノートのカップル:

  • raw_inputstr
  • あなたの詐欺を宣言を返します。
  • ValueError)ファイルの先頭にあるとCAPS
  • でstants(eulerは)少し前進させることができるが、あなたのdigistErrorは、すでにビルトイン例外であなたのdigitsCheck()returnコールがありますが、応答を捕捉しない
  • 私はどうなるのか、すべての

  • あなたdigitsCheck()試行digits == intが、その文句を言わない仕事:

    EULER = 2.71828 
    
    def digitsCheck(): 
        # You don't even need this! 
    
    while True: 
        try: 
         digits = int(raw_input('Please enter the desired digit: ') 
         break 
        except ValueError: 
         print('Error: Please enter an integer') 
    
    euler_str = str(EULER) # For whatever you use this for 
    
    # Rest of your program below 
    

    私はコンセプトを補うために例をしっかり信じていますので、うまくいけば助けになりました!

  • +0

    優秀、ありがとう! –

    0

    if digits == int:を実行すると、変数digitsraw_inputが返された文字列を含む)とタイプintが比較されます。文字列と型は決して等しくないので、この比較は真実にはなりません。ほとんどの場合、異なるタイプのオブジェクトは等しくありません。数字は重大な例外であり、同等のintfloatのインスタンスは等しいと見なされます(例:1.0 == 1)。

    digits変数に実際の整数値が含まれているかどうかを確認したい場合があります。この場合、isinstanceif isinstance(digits, int):を使用できます。しかしdigitsは文字列であることがわかります。それはraw_inputが返す唯一のものだからです。数字の文字列でも、整数ではなく文字列です。

    digits文字列内のすべての文字が実際に数字であるかどうかを確認して、文字列ではなく数字を取得するために値をintに正常に渡すことができるかどうかを確認します。その目的のために、if digits.isdigit():という文字列のisdigitメソッドを呼び出すことをお勧めします。

    しかし、これは、ユーザー入力を数値に変換する問題に対する「Look Before You Leap」(LBYL)アプローチです。 tryexceptを使った2つ目の解決方法は、 "許可よりも簡単に尋ねること"(EAFP)というアプローチを取っています。これは多くのPythonプログラマーが簡単に行うことができるLBYLスタイルより好まれることがよくあります。 Pythonプログラミングを学んでいるだけの方なら、どちらのスタイルでもコードを書く方法を学ぶ価値があります。

    +0

    最初の2つのコードブロックから 'ValueError'を作り直すことができませんでした。 OPが何かを省略しているか、Canopy/SpyderがiPython経由でエラーをマスクしています。 – roganjosh

    +0

    私は 'ValueError'が実際にそのコードからではなく、何らかの形で' digitsCheck'の呼び出しによって 'int(digits)'呼び出しが守られていた他のコードから推測しています。 – Blckknght

    関連する問題