2012-05-16 3 views
1

Так что я какой-то код, который был несколько хлопотно переписать:Функция рандомизатора/проблемы глобальных переменных в python?

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 использует значение x что func_A генерирует, чтобы что-то делать.

Однако, я хочу, чтобы сделать x глобальной переменной.

Моя первая мысль состояла в том, чтобы сделать первую строчку def func_Bx=func_A(), но это будет запускать рандомизатор дважды, и значение x будет изменено.

Как я не ссылаться на то же самое, что xfunc_A производит в func_B без повторного запуска рандомизации (до следующей итерации в func_B) и без использования глобальных переменных?

+0

Вы имеете в виду, не передавая 'x' в качестве параметра между функциями? –

+0

Да, передача в качестве параметра представляется очевидным решением - в чем причина, почему вы не можете этого сделать? –

+0

Зачем вам нужно генерировать 'x' вне' func_B', если вы хотите новый 'x' каждый раз, когда вы вызываете' func_B'? Вы делаете что-то с ней вне '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

самые простые, как я могу думать с информацией, при условии, будет абстрагироваться от поколения х к новой функции. Что-то вроде этого:

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 возвращает кортеж с й и результатом текущего func_a. Затем вы можете передать x, сгенерированный на func_a, в func_b

Смежные вопросы