2016-11-16 98 views
-1

我正在努力研究一個程序,以判斷創建的磁盤是否觸及預定義框的邊緣。解析器會說的東西,如觸摸邊緣的圓形

NameError: global name 'disksdescription' is not defined 
Warning: variable 'left' is assigned to, but never used 

到目前爲止的代碼是:

import numpy.random as nr 

def touch_sides(disk, radius, x, y): 
    for disk in disksdescription: 
     for left in disk.values()[2]: 
      if x <= radius: 
       left = True 
      else: 
       left = False 
     for right in disk.values()[3]: 
      if x >= 1-radius: 
       right = True 
      else: 
       right = False   


def run_code(): 

    radius = 0.1 

    coordinates = nr.uniform(size=(1,2)) 
    print coordinates 
    disksdescription = [] 

    for row in range(0, coordinates): 

     x = coordinates[row, 0] 
     y = coordinates[row, 1] 

     disksdescription.append({'x': x, 'y': y, 'left': left, 'right': right}) 
     touch_sides(coordinates, radius, x, y) 

     print disksdescription 
+0

你爲什麼覺得'disksdescription' *可以在'touch_sides'中訪問? – jonrsharpe

+1

Python是詞法範圍的,這意味着變量的存在取決於它被寫入的位置,而不是被稱爲(動態範圍)的位置。您應該允許'disksdescription'作爲參數傳入'touch_sides'。你也應該避免在循環變量'left'和'right'上進行賦值,因爲這些值將被循環的下一次迭代覆蓋,這通常不是非常有用。 – ebolyen

+1

歡迎來到StackOverflow。請閱讀並遵守幫助文檔中的發佈準則。 [最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)適用於此處。最值得注意的是,應該有一個驅動程序來測試你的代碼和錯誤信息的全文。 – Prune

回答

0

概述

你必須在這段代碼相當多的基本問題。我要退後一步並嘗試解決您的一些過程問題。

最重要的是,我強烈建議您採用增量編程:寫幾行代碼,只需一個或兩個邏輯。然後測試一下,直到你確定它做到了你想要的。只有這樣你才能寫更多的代碼。

這樣做的好處是,問題通常很容易調試:只有新的2-5行是可疑的。將其與您當前的情況進行對比:您有幾個錯誤;修復它們中的任何一個都不會給你一個明顯更好的結果,所以你很難知道你做錯了什麼,直到你一次得到所有的結果。

什麼是功能?

把它想象成某種安全設置,或許就像通往餐廳廚房的通道窗口一樣。服務器通過窗口粘貼一張訂單(紙片)。當廚師完成時,食物盤子回來。 通訊的所有都經過該窗口。當我們要求一份煎蛋卷時,我們所知道的,廚師在烤肉架上將肉塊從牛排的整面上切下來......或者烘烤一些冷凍的東西。看不到它,說不出來;那是一間帶有不透明牆壁的獨立房間。

這意味着什麼對我?

您的方案三 「房間」:在(簡單)主程序,run_code,並touch_sides。他們中沒有人能看到其他人。變量left in run_code與變量touch_sides沒有關係。這些是完全獨立的實體,沒有更多的連接,比如說,Kim Jong Il和Kim Kardashian。

特別是,第一行touch_sides是一個終極呵呵? Python編譯器的時刻。沒有定義的東西叫做diskdescription。更進一步,你花費工作去得到左邊的值右邊的,但是你不會將它們滑回窗口。 run_code不知道你在那裏做了任何有用的事情。

什麼來解決

  1. 回去做你跳過了簡單的練習。他們的目的是阻止你一次性完成所有這些錯誤。寫簡單的函數和平凡的調用。學習使用輸入參數和返回值。
  2. 練習增量式編程。評論你的功能的身體。現在運行程序,簡單地調用run_code()。它不會做任何事情,但它沒有錯誤。
  3. 接下來,將「stub」代碼放入touch_sides:不計算任何內容,但打印參數值。忽略輸入參數併爲左側和右側返回False。將代碼添加到run_code,它調用touch_sides並打印結果。

在這一點上,你知道你可以可靠地傳遞函數之間的值。 現在你可以添加實際的代碼。


還有什麼?

熟悉布爾表達式的概念。瞭解您的原始代碼

if x <= radius: 
    left = True 
else: 
    left = False 

直接降低到

left = (x <= radius) # the parentheses aren't necessary 
  • 請注意,你有兩個變量,左,右,這是試圖描述的磁盤列表的屬性。
  • 請注意,這些變量與您用於迭代座標列表的變量相同。他們不能同時執行這兩個操作 - 創建更多的存儲區域,例如left_touchesright_touches

現在應該足夠了。活着,和程序。