2

私は Python にまったく慣れていないので、これらの厄介な関数がどのように機能するかを理解するのに忙しいです... 私が作成しているプログラムは、三角形の面積を計算することになっていますが、実際には取得できませんローカル変数を他の関数に返します。どんな助けでも大歓迎です!

# Area of a triangle

base = 0
height = 0
area = 0

def inData():
    base = float(raw_input("Base:"))
    height = float(raw_input("Height:"))
    return base
    return height

def triangle(b,h):
    area = b / 2 * h
    return area

if __name__ == '__main__':
    inData()
    triangle(base, height)
    print "The area of a triangle of base", base, "and height" , height, "will be", area
4

3 に答える 3

3

あなたのコードには多くの問題と誤解があります。ゼロから始めて、これらの機能を実行する適切な方法をお伝えできるかどうか見てみましょう. 最後に、コードの作業バージョンができあがります。:)

注: 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()使いたい。ここで使用しなかったことは知っていますが、 の仕組みを誤解しており、同じ教訓が当てはまると思います。printreturnprintreturn

次に例を示します。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がない限り、関数は実行されなくなるため、これ以上のコードを作成する理由はありません。returnif

なぜreturn概念的に重要なのですか?

元のコードでは関数を実行し、その後、2回inData()実行するだけでなく、ステートメントでは戻り値を使用せず、プログラムに実行するように指示するだけだからです。returnifinData 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定義する必要はありませんareareturn同じコード行にあると関数が計算するものを関数に伝えるだけ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__'
  • 値を入力します (変数に入れます)
  • それらの変数を引数として関数に渡します
  • 関数の戻り値に基づいてbaseandheightを出力するようにプログラムに指示します。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。これは、保存した値の単なるリストです。の形式で末尾にを含めることにより、 arrayor内の任意の項目にアクセスできます。最初の項目はです。例えば:tupleindex[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 チュートリアルを試してください。

于 2013-10-17T18:04:38.157 に答える
3

を実行するreturnと、関数はすぐに終了し、値が返されます。したがって、inData関数は高さではなくベースのみを返します。さらに、ベースと高さを 2 回入力するようにユーザーに求めているようです。これは、inData関数が既に行っているため、不要です。

むしろ、このようなことを行うことで、同時に 2 つの値を返す必要があります。(注 -- 分かりやすくするために、一部の関数の名前を変更しました)

# Area of a triangle

def get_user_input():
    base = float(raw_input("Base:"))
    height = float(raw_input("Height:"))
    return base, height

def triangle_area(b, h):
    area = b / 2 * h
    return area

if __name__ == '__main__':
    base, height = get_user_input()
    area = triangle_area(base, height)
    print "The area of a triangle of base", base, "and height" , height, "will be", area
于 2013-10-17T17:14:25.577 に答える
0

コードの問題:

# Area of a triangle

base = 0                   # You don't need to initialize these values. Even if you want 
height = 0                 # to make these global you can simple assign inside the if 
area = 0                   # __name__ == '__main__' condition

def inData():
    base = float(raw_input("Base:"))
    height = float(raw_input("Height:"))
    return base            # return immediately stops the execution of the function
    return height          # and returns the value

def triangle(b,h):
    area = b / 2 * h
    return area

if __name__ == '__main__':
    inData()              # You are not assigning the returned value to any variable
    triangle(base, height)
    print "The area of a triangle of base", base, "and height" , height, "will be", area

プログラムの正しいバージョン:

# Area of a triangle

def inData():
    base = float(raw_input("Base:"))
    height = float(raw_input("Height:"))
    return base, height

def triangle(b,h):
    area = b / 2 * h
    return area

if __name__ == '__main__':
    base, height = inData()
    area = triangle(base, height)
    print "The area of a triangle of base", base, "and height" , height, "will be", area
于 2013-10-17T17:24:55.353 に答える