2017-08-16 76 views
0

假設我需要運行帶有循環的函數,直到遇到條件。爲了使函數正常工作,我只允許在函數中返回一個值,但一旦條件清除,我想將我執行的一些計算帶入全局範圍。我不允許使用return命令來做到這一點,所以我決定在之後將變量全球化。這引發了一個警告,但似乎工作正常。這是做事的最佳方式嗎?製作有條件的全局變量

下面是一個例子:

def check_cond(x,cond): 
    return (x - cond,3) 

def loop(x,func): 
    relevant_value = 0 
    while x > 0: 
     local_expensive_calculation = 1 #use your imagination 
     x = func(x,local_expensive_calculation)[0] 
     relevant_value += func(x,local_expensive_calculation)[1] 
     if x == 0: 
      global local_expensive_calculation 
    return relevant_value 

x = 4 
loop(x,check_cond) 

#then do stuff with local_expensive_calculation, which is now global 
+0

你能不能只是返回一個包含多個值的對象,如元組?另外,「我只能在函數中返回一個值......」似乎與「我不能使用返回命令」相矛盾。 – Carcigenicate

+0

那麼,我使用scipy的牛頓函數來做到這一點。它要求你在裏面使用的函數只返回一個浮點數,不允許使用元組。至於我的矛盾,我指的是使用我可以做的事情之外的回報。 – rp0

回答

1

這可能會稍微濫用系統,但你可以設置你的變量作爲函數的一個屬性,然後再通過該命名空間訪問:

def check_cond(x,cond): 
    return (x - cond,3) 

def loop(x,func): 
    relevant_value = 0 
    while x > 0: 
     local_expensive_calculation = 1 #use your imagination 
     x = func(x,local_expensive_calculation)[0] 
     relevant_value += func(x,local_expensive_calculation)[1] 
     if x == 0: 
      loop.local_expensive_calculation = local_expensive_calculation 
    return relevant_value 

x = 4 
loop(x,check_cond) 

print loop.local_expensive_calculation 
+0

這當然有效,並且不會引起任何錯誤,所以我接受它。 – rp0

0

如果你絕對堅持把它作爲一個全球性的,你可以做的一種方式是通過改變生產線:

global local_expensive_calculation 

至:

globals()['local_expensive_calculation'] = local_expensive_calculation 

它使您的SyntaxWarning消失。

我對上下文了解不多,看起來你想要一個Python 2.7的答案(Python 3?)有nonlocal

記住,在while statement can also have a else clause

你可以寫:

while x>0: 
    # do calculation and stuff 
else: 
    # make calculation result global 

PS:有一個在你分配一個錯字到x:(calcuation - >calculation