0

PythonのTurtleモジュールを使用して、個別の関数を使用してアメリカの国旗を描画しようとしています。最初にすべての寸法を計算するdraw_flagがあり、次に実際に旗の形を描画するdraw_rectangleがあり、次にdraw_starsなどを作成して描画します。星条旗。

しかし、関数がどのように機能するかを理解するのに少し問題があります。これまでの私のコードは次のとおりです。

import turtle
import time
import random

def draw_rectangle(length, height):
    turtle.up()
    x = length
    y = height

    turtle.begin_fill()
    turtle.setpos(x,y)
    turtle.down()
    turtle.forward(418)
    turtle.right(90)
    turtle.forward(220)
    turtle.right(90)
    turtle.forward(418)
    turtle.right(90)
    turtle.forward(220)
    turtle.end_fill()

    turtle.sleep(2)
    turtle.bye

def draw_flag(A):
    height = int(A)
##    length = height*1.9
##    union_height = height*(7/13)
##    union_length = length*(2/5)
##    E = F = union_height/10
##    G = H = union_length/12
##    stripe_width = height/13
##    diameter_star = stripe_width*(4/5)
    length = height*1.9
    return

A = input("Please enter the height of the flag: ")

draw_rectangle(length, height)

長方形を描くことで返されることを期待していましたが、長さが定義されていないと言い続け、変数を認識する場所に「長さ」を配置する場所がわかりません。

Python3を使用しています。ありがとうございます。

4

6 に答える 6

2

2つの問題があります。まず、関数を定義しますdraw_flagが、それを呼び出すことはありません。

ただし、これを呼び出した場合、関数は実際には何も実行しないため、機能draw_flagしません。それはそれ自体の中にいくつかの変数を定義し、それが終了したときにそれらを捨てるだけです。長さと高さをで返しreturn length, height、次にそれらの値を使用しlength, height = draw_flag(A)て呼び出しdraw_rectangleます。(またはあなたがすることができますdraw_rectangle(*draw_flag(A))。)

length, height = draw_flag(A)
draw_rectangle(length, height)

関数は互いに魔法のように通信しません。関数は入力を受け取り、戻り値を生成します。その戻り値を別の場所で使用する場合は、値を使用する場所で関数を呼び出す必要があります。

于 2012-10-03T04:43:34.187 に答える
1

draw_rectangle長さと高さの2つの引数を期待する関数を呼び出しています。長さはdraw_flag関数によって計算されています。しかし、あなたは値を返しません。

これを解決する方法はいくつかあります。1つはdraw_flag、ユーザーが指定した高さで関数を呼び出し、戻り値を保存してから、次のように呼び出すことdraw_rectangleです。

def draw_flag(A):
    height = int(A)
##    length = height*1.9
##    union_height = height*(7/13)
##    union_length = length*(2/5)
##    E = F = union_height/10
##    G = H = union_length/12
##    stripe_width = height/13
##    diameter_star = stripe_width*(4/5)
    return height*1.9

A = input("Please enter the height of the flag: ")
length = draw_flag(A)
draw_rectangle(length, int(A))

もう1つは、関数に移動してinputから、関数内から関数をdraw_flag呼び出すことです。これを行う場合、関数は引数をまったく必要としません。draw_rectangledraw_flagdraw_flag

def draw_flag():
    A = input("Please enter the height of the flag: ")
    height = int(A)
##    length = height*1.9
##    union_height = height*(7/13)
##    union_length = length*(2/5)
##    E = F = union_height/10
##    G = H = union_length/12
##    stripe_width = height/13
##    diameter_star = stripe_width*(4/5)
    draw_rectangle(height*1.9, height)

draw_flag()

変数スコープに関するPythonの本のセクションも読む必要があると思います。後でいくつかの変数が出力されることを期待しているが、奇妙なエラーが発生する場合、特に関数を使用している場合に役立ちます。

于 2012-10-03T04:45:56.783 に答える
1

次を試してください

import turtle
import time
import random

def draw_rectangle(length, height):
   turtle.up()
   x = length
   y = height

   turtle.begin_fill()
   turtle.setpos(x,y)
   turtle.down()
   turtle.forward(418)
   turtle.right(90)
   turtle.forward(220)
   turtle.right(90)
   turtle.forward(418)
   turtle.right(90)
   turtle.forward(220)
   turtle.end_fill()

   turtle.sleep(2)
   turtle.bye

 def draw_flag(A):
   height = int(A)
   length = height*1.9
   draw_rectangle(length,height)
   return

A = input("Please enter the height of the flag: ")

draw_flag(A)
于 2012-10-03T04:47:11.737 に答える
1

さて、あなたのより一般的な質問に答えるために、Pythonの関数はそれらを呼び出すときに引数を受け入れます。これらは参照によって渡されます。つまり、関数内では呼び出し空間と同じデータになります。これは可変型にとって重要です。関数内で変更されると、関数外でも変更されるためです。(str、int、float、およびtupleは変更可能ではなく、dictおよびlistは変更可能です)。関数が戻ると、戻りトークンの後の値が呼び出し元に返されます。a=input('input? ')、関数inputは、プロンプトがユーザーに表示するための引数を取ります。これは参照によって渡されることに注意してください。これは文字列のコピーではありません。ユーザーが生成した入力を返し、これはに保存されます。関数から複数の値を返すことができ、それらは自動的にタプルに変換されます。あなたが持っている場合

def test():
    return 1,2
a,b = test()

a=1およびb=2になります。関数内で使用される名前を定義する必要があります。それらは最初に関数内で検索され、次にそれを囲む名前空間で検索され、最後にビルトインで検索されます。他の関数で定義された変数は、ローカル名前空間にもその親にも存在しないため、使用できません。これらの名前の値にアクセスするには、それらを関数に渡す必要があります。関数内で使用される名前は、関数外の名前と一致する必要はないことに注意してください。検討:

def fun1(a):
    return a * 2
def fun2():
    b = 5
    c = fun1(b)
    print c
fun2()

値5はbという名前でメモリに格納され、次に参照によってfun1に渡されます。今回はaという名前で、2倍にされて返されます(戻り値も参照によるものです)。その後、戻り値は名前で格納されます。 c、次に印刷されます。

于 2012-10-03T05:00:07.073 に答える
1

これはそれについて考える良い方法です。関数は、引数と呼ばれるいくつかの値を特定の順序で受け取り、それらを使用して他の値を生成する「ブラックボックス」です。「ブラックボックス」とは、関数を使用するときに、関数がどのように機能するかを気にする必要がなく、値を指定するだけで値が返されることを意味します。

与えられた2つの数値(最初の数値から2番目の数値を引いたもの)を減算する非常に単純な関数について考えてみましょう。つまり、「引数#1-引数#2」というルールを実装する関数を作成します。ここで、この関数のコードを作成するときは、引数#1を使用する場合と、引数#2を使用する場合をコンピューターに通知する方法が必要です。他のプログラミング言語では、使用する引数の数(#1または#2)を明示的に指定する必要がありますが、これらの値に名前を付けることができれば、コードを作成する方がはるかに簡単です。したがって、Pythonでは、他のほとんどの言語と同様に、選択した名前を使用して関数の引数を参照できます。たとえば、引数#1を名前の下に置きx、引数#2を名前の下に置くとします。y。あなたはこれを書くことによってそれを示すことができます:

def subtract(x, y):

この後に、関数を構成するコードが続きます。減算の例では、次のようになります。

def subtract(x, y):
    return x - y

Pythonコンパイラがこれに遭遇すると、コードを「値#1-値#2を計算し、それを呼び出し元に送り返す」という内部表現に変換します。次に、そのコードブロックをパックし、名前で保存しますsubtract(これは、関数に名前を付けたいと言ったためです)。

うまくいけば、このコードブロックの実行が終了すると、関数なしでは引数を持つことができないため、「引数#1」または「引数#2」を参照する意味がなくなります。同様に、関数がその機能を実行すると、引数に付けたラベル、xおよびy、は意味を失います。ラベルは、関数のコードの期間中のみ存在します。これはスコーピングと呼ばれます。ラベルをコードの何かを意味する部分に制限します。

ラベルxyローカルスコープであるため、言うかもしれませんが、ある意味では、それらが何であるかは問題ではありません。たとえば、コードにその定義がある場合、それらをとsubtractに変更することを任意に決定できます。変更する必要があるのは、その1つの関数内のコードだけです。定義を次のように変更するだけですfirstsecond

def subtract(first, second):
    return first - second

それだけです-あなたのコードは機能的にまったく同じです。プログラム内で発生する他xの場所でyは、この関数の引数以外のものを参照しているため、引数の名前を変更するときに変更する必要はありません。

あなたのケースで起こっていることはlength、それが定義された関数(つまり、あなたが保存した関数draw_rectangle)の外のどこかでラベルを使おうとしたことです。Pythonは、自分がいない関数の引数を参照できないことを認識しているため、length他の何かを意味するようにすでに定義されていることを前提としています。しかし、あなたはしませんでした。そのため、エラーが発生します。(まあ、とにかく、その1つのエラー)

于 2012-10-03T05:21:56.650 に答える
0

returnあなたがそれを発信者に返すものは何でも返します。関数内のローカル変数を外部で自動的に使用可能にすることはありませ(これらは理由によりローカルです!)。return引数がないと、特別な値が返されることにも注意してくださいNone(したがって、と同等return Noneです)。

したがって、いくつかの値を返したい場合はreturn height, length、関数の内部とheight, length = draw_flag(A)外部で使用します。

于 2012-10-03T04:41:14.237 に答える