これはコード全体ですか?そのループが始まる前にコード内のある時点でgetInteger()
関数を呼び出す必要があります。また、いつでも関数sqInteger()
を呼び出すことはありません。
例外ハンドラはすぐにtry
ブロックの評価を停止し、入力に非整数が入力されるとexcept
ブロックに移動します。したがって、input()
機能の後にsqInteger()
関数を呼び出すことができます。ユーザーが端末に非整数を入力すると、ユーザーはExceptionハンドラーに移動し、ユーザーに再試行を促します。整数を入力すると、コードは引き続き評価され、関数sqInteger
が実行されます。
getInteger
をsqInteger()
関数に渡す必要はありません。技術的には、関数をPythonのパラメータとして渡すことは許されていますが、これは必須ではなく、恐らくこのプログラムの範囲外です。
だから、次のコードは、適切な次のようになります。
def getInteger():
while True:
try:
x = int(input('Enter an integer: '))
# variable 'squared' now receives the return value from the function
squared = sqInteger(x) # call to function sqInteger necessary for this function to be executed
except ValueError:
print('That\'s not an integer. Try again.')
continue
else:
print(x) # if user entered 2, prints 2, not 4
return x # this value is still only what the user input, not the result of sqInteger()
break
def sqInteger(x):
y = x**2
print(y)
return y #you need to return values from functions in order to access it from outside the function
あなたは(パラメータとして)関数に変数を渡す理由は、その変数にその機能へのアクセスを提供することです。関数を作成すると、その関数のローカルスコープが作成され、その関数内で指定された変数が、その関数外の変数とは別の名前空間に存在するようになります。これは、多くの変数が存在する可能性があり、それらを別々に保つ必要がある大きなプログラムで役に立ちます。
sqrt関数を別に定義したため、スコープ外の変数にはアクセスできません。あなたはアクセスしたい変数を渡す必要があります。
また、関数を呼び出す前に関数を呼び出す必要があります。関数を定義することは、関数を1つの関数単位として呼び出すことができるように機能を設定することにのみ役立ちます。これは、プログラム内の懸念を分離するのに便利です。関数を呼び出す機能は、コードを分割して、関数全体をコードの残りの部分に混乱させるのではなく、関数への単一の呼び出しのみを記述できるので便利です。また、コードの再利用も可能です。
あなたはまた、同様に、値を返す関数呼び出しにこの値を割り当てることにより、乗整数の結果にアクセスすることができます。
# lets say x = 4
squared = sqInteger(x)
def sqInteger(x):
y = x**2
return y
これは機能しません。
x = input("Enter integer") #lets say you enter 3
squared = sqInteger()
print(squared)
def sqInteger():
print(x) # error: x is not defined
return x**2 # error: x is not defined
この関数は、x
のような外部変数にアクセスすることはできません。これらの変数をパラメータとして渡して、この関数を呼び出してパラメータを自由に設定できるようにする必要があります。これは、プログラムのモジュール性のためです。さまざまな整数をパラメータとして渡すことができ、整数を2乗する必要があるときにいつでもresuable関数を持つことができます。
編集:申し訳ありませんが、これは混乱だった、私は最終的にかかわらず、私の説明のすべてのエラーを修正...
は説明いただきありがとうございます、それは非常に便利です!コードに編集内容を実装すると、ユーザーが入力した整数は印刷されません。これは、二乗整数の印刷に加えて要件です。 sqInteger(x)は入力後すぐに呼び出されるので、このprintコマンドをスキップしていますか? – saj0991
入力値を二乗された値ではなくユーザーで印刷しますか?実際には 'else'ブロックに行き、' print(x) 'ステートメントを 'return'ステートメントの上に移動する必要があります。 return文は、現在の関数の実行を停止し、すぐに関数が呼び出された場所に戻ります。ergo、それ以降のprint(x)関数は実行されません。上記のメインコードブロックを編集して、これも反映させます。 – cchoe1
どうもありがとうございます! – saj0991