2012-05-16 43 views
1

所以我有一些代碼,正在有點麻煩改寫:python中的Randomizer函數/全局變量的麻煩?

def func_A(): 

    x=[] 
    # the function picks random members of the local x and rearranges them, 
    # after giving x some initial value 
    return x 

現在我想創建一個迭代func_B這樣,對於每一個互爲作用行程中,func_B使用xfunc_A產生的事情。

但是,我想避免讓x成爲一個全局變量。

我的第一個想法是製作func_Bx=func_A()的def的第一行,但是這會運行隨機發生器兩次,並且x的值將會改變。

如何引用相同的xfunc_A產生在func_B,而無需再次運行隨機數發生器(直到func_B下一個迭代),無需使用全局變量?

+0

你的意思是不在函數之間傳遞'x'作爲參數? –

+0

是的,作爲參數傳遞似乎是明顯的解決方案 - 你不能這樣做的原因是什麼? –

+0

如果每次調用'func_B'時需要新的'x',爲什麼需要在'func_B'之外生成'x'?你在'func_B'之外做了些什麼? – zigg

回答

1

使用類

import random 
class Randomizer(): 
    def __init__(self): 
     # Generates a list of random values 
     self.x = [] 
     self.rng = 10 
     for i in range(1,self.rng+1): 
      self.x.append(random.random())    

     # Need to call once to make sure all vars defined 
     self.func_A() 

    # pick a random value from a list 
    def func_A(self): 
     self.recent = self.x[random.randint(0,self.rng-1)] 
     return self.recent 

    # Do something with random value picked by A 
    def func_B(self): 
     return self.recent*self.recent 

認爲這是你的意思?

>>> r = Randomizer() 
>>> r.func_A() 
0.91223345147715629 
>>> r.func_B() 
0.83216986999392528 
1

我能想到的與所提供的信息將是x的抽象產生一個新 功能simples方式。類似這樣的:

def gen_x(): 
    x = [] 
    # your code here 
    return x 

def func_a(x): 
    # your code here 
    return x 

def func_b(x): 
    # your code here 
    return x 


x = gen_x() 
func_a(x) 
func_b(x) 

另一種選擇可能是func_a返回一個帶有x和你當前func_a結果的元組。那麼你可以將在func_a生成的x傳遞給func_b