2017-01-31 74 views
-2

我有一個遞歸函數simulation(),它每隔一分鐘左右就會從網絡中提取一些值(這些值是計數幾個動作的結果)。函數內部是一個嵌套函數raise_alarm,它也是遞歸的,它使用來自simulation()的值作爲參數並分析它們。我需要能夠檢測每次運行後價值是否有變化。Python:遞歸函數和存儲變量

因爲我一直在閱讀,所以我已經避免使用全局變量(對它們不太瞭解),它們應該是最後的手段。那麼是否有任何方法可以在嵌套函數內部或外部存儲值,以便在它到達後能夠將其與更新後的狀態進行比較?

下面是簡化的代碼:

def simulation(): 
     #generates the values_a, _b... 
     def raise_alarm(value_a, value_b,...): 
      if value_a_old < value_a: ###where do I place value_a_old?) 
       #do stuff 
      else: pass   
      if value_b_alt < value_b: 
       #do stuff 
      else: pass    
      if value_a > value_b+2 or value_b > value_a+2: 
       #do stuff 
      else: 
       #do other stuff 
     while True: 
      print' stuff ' 
      time.sleep(2) 
      raise_alarm(value_a, value_b) 
    simulation() 

那麼詳細,value_a,_b ...被刮掉網絡不斷。每次value_b平均增長了3次,value_b也增長了1.我需要一個變量在我的raise_alarm函數中,它是鏡像value_a,但是每次value_b變化時它都會被設置回0。 爲此,我想將value_a存儲在存儲變量value_a_old中,因此我可以將新傳入的value_a與value_a_old進行比較。需要在課程中更新value_a和value_a_old。

希望,你知道我在說什麼,我一直在一整天盯着...

乾杯,夥計們!

+0

我認爲最好的辦法是傳遞你需要的變量,例如'value_a_old',作爲'raise_alarm()'的參數。 –

+0

'simulation'似乎不是遞歸的;實際上,'raise_alarm'也不是。 –

+1

執行流程遞歸究竟在哪裏? – ospahiu

回答

0

也許在類中包含simulation()和raise_alarm()並使用對象參數?這將爲您想要分享的值提供一個很好的共享範圍。

+0

好的,除了如何創建類之外,我不太瞭解如何使用類。仿真()只是一個模擬網絡抓取功能的模擬,不確定,如果它應該在一個類中。我對這一切都很陌生。我會看看課程。謝謝! – user2822564

+0

我不知道,如何使用類爲此目的。我想,我會研究全局變量。 – user2822564

+0

我現在創建了幾個類,但是我遇到了麻煩,使它們通過我的網頁抓取功能進行交互和創建實例。你能推薦任何頁面/課程/來源,我可以閱讀更多關於使用面向OOP的類。我能找到的所有東西都不是太簡單,在解釋如何製作課堂和實例之後就會停下來,或者對我的經驗水平來說太過技術化。 – user2822564