2016-07-16 14 views
0

わかりまし定義されたので、私は私のプログラムの最終的な結果は次のようになりたくはないが、私はそれらの正確な数は必要ありません。このため、シミュレーションにロボットを置くので、結果は変わるはずです。ここでパイソン:NameError「」は今...</p> <p><a href="https://i.stack.imgur.com/tryyh.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/tryyh.png" alt="Desired output"></a></p> <p>を

は私のコードです:

# This program makes the robot calculate the average amount of light in a simulated room 

from myro import * 
init("simulator") 

from random import* 

def pressC(): 
    """ Wait for "c" to be entered from the keyboard in the Python shell """ 
    entry = " " 
    while(entry != "c"): 
     entry = raw_input("Press c to continue. ") 
    print("Thank you. ") 
    print 

def randomPosition(): 
    """ This gets the robot to drive to a random position """ 
    result = randint(1, 2) 
    if(result == 1): 
     forward(random(), random()) 
    if(result == 2): 
     backward(random(), random()) 

def scan(): 
    """ This allows the robot to rotate and print the numbers that each light sensors obtains """ 
    leftLightSeries = [0,0,0,0,0,0] 
    centerLightSeries = [0,0,0,0,0,0] 
    rightLightSeries = [0,0,0,0,0,0] 
    for index in range(1,6): 
     leftLight = getLight("left") 
     leftLightSeries[index] = leftLightSeries[index] + leftLight 
     centerLight = getLight("center") 
     centerLightSeries[index] = centerLightSeries[index] + centerLight 
     rightLight = getLight("right") 
     rightLightSeries[index] = rightLightSeries[index] + rightLight 
     turnRight(.5,2.739) 
    return leftLightSeries, centerLightSeries, rightLightSeries 

def printResults(): 
    """ This function prints the results of the dice roll simulation.""" 
    print " Average Light Levels " 
    print " L  C  R " 
    print "=========================" 
    for index in range(1, 6): 
     print str(index) + " " + str(leftLightSeries[index]) + " " + str(centerLightSeries[index]) + " " + str(rightLightSeries[index]) 

def main(): 
    senses() 
    pressC() 
    randomPosition() 
    leftLightSeries, centerLightSeries, rightLightSeries = scan() 
    printResults() 

main() 

そして、私は自分のコードを実行すると、このエラーを取得しています:だから

Traceback (most recent call last): 
    File "C:/Users/Owner-pc/Desktop/Computer Programming 1/Mod05/Code/Created/AverageLight.py", line 58, in -toplevel- 
    main() 
    File "C:/Users/Owner-pc/Desktop/Computer Programming 1/Mod05/Code/Created/AverageLight.py", line 56, in main 
    printResults() 
    File "C:/Users/Owner-pc/Desktop/Computer Programming 1/Mod05/Code/Created/AverageLight.py", line 49, in printResults 
    print str(index) + " " + str(leftLightSeries[index]) + " " + str(centerLightSeries[index]) + " " + str(rightLightSeries[index]) 
NameError: global name 'leftLightSeries' is not defined 

を、私は私のreturn文が動作していない理由として混乱していますなぜ私が望むリストが得られないのか、助けてください。

+2

この質問は、同じ質問[ここ](http://stackoverflow.com/questions/38404825/python-is-not-defined)を投稿してから12時間以内に投稿しました。それは機械的なトルコのように扱わないでください。 – zeantsoi

答えて

2

leftLightSeriescenterLightSeries、およびrightLightSeriesは、あなたがそのエラーを取得している理由であるprintResultsの範囲で定義されていません。

これらの引数に取るようにあなたのprintResults機能を更新します。これらの変数を渡す、

def printResults(leftLightSeries, centerLightSeries, rightLightSeries):

その後、あなたはprintResultsを呼び出すとき:

def main(): 
    ... 
    printResults(leftLightSeries, centerLightSeries, rightLightSeries) 

今ここでの問題は、そのあなたですメインのスコープ内で定義された3つの変数はまだありません。scan内でのみ定義されています。 scanからどうやってそれらを引き出すのですか?ただ、そのような変数にscanの戻り値を格納します。

def main(): 
    senses() 
    pressC() 
    randomPosition() 
    leftLightSeries, centerLightSeries, rightLightSeries = scan() 
    printResults(leftLightSeries, centerLightSeries, rightLightSeries) 

ます。また、直接一時的な変数を必要とせずにprintResultsscanの出力を送信することができますprintResults(*scan())

0

あなたはleftLightSeries機能でcenterLightSeriesスキャン()を定義しました。外部スコープ(この場合はグローバルスコープ)に定義されていないため、関数printResultsはそれらにアクセスできません。

ザPythonドキュメントは、セクション4.2.2. Resolution of names

範囲は、ブロック内の名前の可視性を定義し、それを説明しています。ローカル 変数がブロック内で定義されている場合、そのスコープにはそのブロックが含まれます。ファンクションブロック内で の定義が発生した場合、スコープは、包含ブロックが に異なるバインディングを導入しない限り、定義中のブロック に拡張されます。

名前がコードブロックで使用される場合、最も近い 囲みスコープを使用して解決されます。コードブロックに表示されるすべてのそのようなスコープのセットは、ブロックの環境と呼ばれる です。

名前がまったく見つからない場合、NameError例外が発生します。 現在のスコープが関数スコープであり、その名前が の名前が使用されているポイントの値にまだバインドされていないローカルの 変数を参照する場合、UnboundLocalError例外が発生します。 UnboundLocalErrorはNameErrorのサブクラスです。

+0

どうすればこの問題を解決できますか? 3つの変数をprintResults関数に割り当てる必要がありますか? –

+0

はい、グローバル変数は通常、悪いソフトウェア設計の悪い方法です。私はあなたが「合格」を意味していると思います。これは正しいアプローチです。 scan()からの戻り値をprint関数に渡すことは役に立ちます。 ** printResults **のパラメータリストに追加する必要があることに注意してください。 – HelloWorld

+0

私はあなたが何を意味するか分かりません。私はかなり新しいです、私は現在コンピュータプログラミングコースを受けてPythonを学んでいます。あなたはこれをどうやって行うのか教えてください。 –

0

あなたが持っている問題はscopingです問題。

leftLightSeriesは、関数scan()の範囲内で定義されています。つまり、その関数内からのみアクセスできます。したがって、関数printResults()の範囲内では利用できません。

return leftLightSeries 
return centerLightSeries 
return rightLightSeries 

コードのこのブロックはleftLightSeriesを返却した後、次の2つのreturn文に到達することはありません:

あなたのコードを持つもう一つの問題は、あなたが到達することはありません複数のreturn文を持っているということです。

leftSeries, centerSeries, rightSeries = scan() 

for index in range(0,6): 
    print str(index) + " " + str(leftSeries[index]) + " " + str(centerSeries[index]) + " " + str(rightSeries[index]) 

またrange(0,6)は何であることに注意してください:複数の値を返すために望むことはタプルを返すようになります場合は、検討することもでき一つのオプション:そうは次のように

return (leftLightSeries, centerLightSeries, rightLightSeries,) 

はその後printResults()に、あなたのシリーズをつかむことができ範囲(1,6)の代わりに欲しい。配列はインデックス0から始まり、rangeは第1引数から第2引数までの範囲を提供します。

関連する問題

 関連する問題