あなたのコードには多くの問題と誤解があります。ゼロから始めて、これらの機能を実行する適切な方法をお伝えできるかどうか見てみましょう. 最後に、コードの作業バージョンができあがります。:)
注: Python では事前に関数を宣言する必要はありません。それ自体が行います! だから、一番上は必要ありませんbase, height, area
!
機能
関数とは、要するに、バンドルで実行される一連のコマンドです。あなたはこれを知っている。見逃しているのは、引数とパラメーター、およびreturn と printの概念です。
引数 vs パラメーター
関数を定義するときは、将来その関数に何をさせたいかを設定していることになります。数学の関数と同じようf(x)
に、どんな入力でも機能する 1 つの方程式が必要です。はf(x)
、x
入力です。
プログラミングでは、これをパラメータと呼びます。したがって、Python で記述する場合は次のようになります。
def Function(x):
y = x*x
return y
x
パラメータとして定義しました。ここで、引数は、パラメーターが入る関数に入れる値です。代数では、適用可能なアイデアは変数を定義することです。これを知って、実際にその機能を使用すると:
Function(2)
あなたが言ったので、あなたは4を返しますrun Function(x) where x = 2
。
これがArguments vs Parametersの概念です。function 内で常にユーザーに入力を求めるとは限らないため、非常に便利です。関数が直接的であるほど、できることは少なくなります。たとえば、バックグラウンドで計算を行うために同じ関数を使用したい場合があります。raw_input()
プロセスがバックグラウンドで単独で動作することを期待している場合は、うまくいきませんよね?
これがArguments と Parametersの真の価値です。
返品と印刷
直接的すぎて使わないのと同じように、使わずに代わりにraw_input()
使いたい。ここで使用しなかったことは知っていますが、 の仕組みを誤解しており、同じ教訓が当てはまると思います。print
return
print
return
次に例を示します。2 つの機能があります。
def Function1(x,y):
z = x*y
print z
def Function2(x,y):
z = x*y
return z
関数 1は を出力 z
します。つまり、何をしたいprint z
場合でも、計算だけを行いたい場合でも、常にコンソールに表示されます。
一方、 Function 2は、呼び出されたときに の値をプログラムにreturns z
返すことを意味します。関数が行に達するとすぐに、関数の実行が停止することz
にも注意してください。スキップされたより高度なコード(ステートメントなど)return
がない限り、関数は実行されなくなるため、これ以上のコードを作成する理由はありません。return
if
なぜreturn
概念的に重要なのですか?
元のコードでは関数を実行し、その後、2回inData()
実行するだけでなく、ステートメントでは戻り値を使用せず、プログラムに実行するように指示するだけだからです。return
if
inData
inData()
関数が値を返すとき、それを何かに代入する必要があります。たとえば、任意のプログラミング言語での単純な数学を考えてみましょう。コード:
x = sqrt(4)
print x
2
関数の最後にsqrt()
答えが返されるため、が出力されます。ここではto を与えるx
変数に toを代入しました。それは本当ですが:sqrt(4)
return
sqrt(4)
も2
コンソールに出力されます。これは、言語開発者によるフールプルーフのためです。実際には、言語はコードを出力する必要があると想定しています。あなたはそれをするように言っているのではありません。
したがって、コード行を実行すると、次のようになります。
inData()
triangle(base, height)
あなたは基本的に言っています:
run the function inData()
run the function triangle(base, height)
彼らのためにreturns
、あなたが言う必要があるとき:
set <variable1> equal to the return of inData()
set <variable2> equal to the return of triangle(base,height)
(ここではさらに単純化する必要がありますが、すぐに説明します)。
最後にreturn
. プログラミングでは、次のように記述しても意味がありません。
x = 1+1
return x
return 1+1
同じことを達成するとき。したがって、area
三角形の を定義してからを return
定義する必要はありませんarea
。return
同じコード行にあると関数が計算するものを関数に伝えるだけarea
です!
私はあなたを失いましたか?まだ私と一緒に?良い!
コードの簡素化
あなたのコードには構造的な問題がいくつかありますが、それは機能するかもしれませんが、それを見た経験豊富なプログラマーを困惑させるでしょう。私たちがここにいる間に、これを行うためのより良い実践が何であるかをあなたに理解してもらうことができるかどうか見てみませんか.
あなたのコードでは、あなたは(要約された形式で)書きました
variables defined that you don't need
def FunctionThatGathersData()
def FunctionThatDoesTheMath(x,y)
if (condition)
FunctionThatGathersData()
FunctionThatDoesTheMath(x,y)
print out the results
この構造は、経験豊富なプログラマーを混乱させるでしょう。次のような質問をするかもしれません。
- 何?
- なぜこのように物を返すのですか?
- なぜ変数が定義されているのですか?
FunctionThatGathersData
と を組み合わせてみませんFunctionThatDoesTheMath
か?
これらの理由のいくつかはすでに上で説明されていますが、最後の 2 つの質問に取り掛かりましょう。
なぜ変数が定義されているのですか? : 一方では、Python は実行中に変数を処理します。したがって、事前にそれらを定義する必要はありませんが、定義することができます。これの利点は次のとおりです。
x = 0
def Function()
x = 5
y = 10
このコードを見ると、なぜx
が定義されているのか不思議に思うかもしれません。簡単な答えは、 Python は既に が存在することをx
認識するため、 を実行すると、関数内の作業でそれFunction()
を上書きすることになります。y
一方、以前の定義がないため、新しい変数が作成されます。
x
しかし、あなたの関数では、あなたの答えは最良の形で、関数の外に依存する必要がないので、それは必要ありません。
パラメーター、引数、および戻り値について学んだことを使用して、2 つの関数を組み合わせることができないのはなぜですか? (ヒント: できます! )
これは、読んで理解できる新しいコード スニペットです。読んだ内容を頭から少し離れて、意味があるかどうかを確認してください。その中で、次のことを行います。
- 関数を定義する
DoTheMathAndThenGiveMeTheValueBack
- 決定する
__name__ == '__main__'
- 値を入力します (変数に入れます)
- それらの変数を引数として関数に渡します
- 関数の戻り値に基づいて
base
andheight
を出力するようにプログラムに指示します。area
コード
def CalculateTriangleArea(b,h):
return b / 2 * h
if __name__ == '__main__':
base = float(raw_input("Base:"))
height = float(raw_input("Height:"))
area = CalculateTriangleArea(base,height)
print "The area of a triangle of base", base, "and height", height, "will be", area
これを理解していない場合は、コメントしてさらに質問してください.
おー!そして、複数の をどうするかについて言及するのを忘れていましたreturns
。
関数で複数の値を返す必要がある場合は、array
またはを介して行うことができますtuple
。これは、保存した値の単なるリストです。の形式で末尾にを含めることにより、 array
or内の任意の項目にアクセスできます。最初の項目はです。例えば:tuple
index
[i]
[0]
def Function():
string1 = "nobody"
string2 = "expects"
string3 = "the"
string4 = "spanish"
string5 = "inquisition"
return string1, string2, string3, string4, string5
print Function()[0]
print Function()[1]
print Function()[2]
print Function()[3]
print Function()[4]
print Function() #prints the whole tuple!
あなたを得るでしょう:
nobody
expects
the
spanish
inquisition
('nobody', 'expects', 'the', 'spanish', 'inquisition')
理解?:)
Python でさらに実践的な作業を行うには、このすばらしい Python チュートリアルを試してください。