2017-01-13 5 views
0

У меня есть 2 функции fun1 и fun2, которые принимают в качестве входов строку и число соответственно. Также оба получат в качестве входных данных одну и ту же переменную a. Это код:Как передать переменную между функциями в python?

a = ['A','X','R','N','L'] 

def fun1(string,vect): 
    out = [] 
    for letter in vect: 
     out. append(string+letter) 
    return out 

def fun2(number,vect): 
    out = [] 
    for letter in vect: 
     out.append(str(number)+letter) 
    return out 

x = fun1('Hello ',a) 
y = fun2(2,a) 

Функции выполняют некоторые бессмысленные операции. Целью Mu было бы переписать код таким образом, чтобы переменная a делилась между функциями, чтобы они больше не воспринимали ее как входную.

Одним из способов удаления переменной a в качестве входных данных является определение ее внутри самих функций, но, к сожалению, это не очень элегантно. Не могли бы вы предложить мне возможный способ достичь моей цели?

Функции должны работать одинаково, но входными аргументами должны быть только строка и номер (fun1(string), fun2(number)).

+1

Вы на полпути к переопределение объектно-ориентированного программирования. – chepner

+0

Внутренняя часть функции может «видеть» 'a'. Попробуйте просто «для буквы в a:' –

ответ

6

Объектно-ориентированное программирования помогает здесь:

class MyClass(object): 
    def __init__(self): 
     self.a = ['A','X','R','N','L'] # Shared instance member :D 

    def fun1(self, string): 
     out = [] 
     for letter in self.a: 
      out.append(string+letter) 
     return out 

    def fun2(self, number): 
     out = [] 
     for letter in self.a: 
      out.append(str(number)+letter) 
     return out 

a = MyClass() 
x = a.fun1('Hello ') 
y = a.fun2(2) 
+1

Теперь вы можете удалить параметр 'vect'. ;) – Tagc

+0

Если 'a' является константой, было бы лучше сделать его атрибутом класса (и, возможно, кортежем). В противном случае, возможно, лучше передать его в инициализатор MyClass. –

+0

- операция определения self.a повторяется каждый раз, когда я вызываю fun1 или fun2? Я задаю этот вопрос, потому что если self.a был получен после более сложной и требовательной операции, я бы хотел, чтобы он выполнялся только один раз, а не каждый раз, когда я вызываю fun1 и fun2 –

4

С a это определить вне области видимости функции и до определены функции, вам не нужно кормить его в качестве аргумента, вы можете просто использовать a. Python сначала посмотрит, будет ли переменная определена в области функций, если нет, то она выходит за пределы этой области.

a = ['A','X','R','N','L'] 

def fun1(string): 
    out = [] 
    for letter in a: 
     out.append(string+letter) 
    return out 

def fun2(number): 
    out = [] 
    for letter in a: 
     out.append(str(number)+letter) 
    return out 

x = fun1('Hello ') 
y = fun2(2) 

В этом случае вы можете также переписать свои функции в более изящный списковые:

a = ['A','X','R','N','L'] 

def fun1(string): 
    return [string+letter for letter in a] 

def fun2(number): 
    return [str(number)+letter for letter in a] 

x = fun1('Hello ') 
y = fun2(2) 
+1

Действительно ли это рекомендуется или его следует избегать? –

+0

@ Ev.Kounis: это не считается очень элегантным, поскольку можно забыть, что существует переменная, определенная вне области видимости, и вводит функцию 'a' в функцию. Поэтому лучше использовать объектно-ориентированное программирование. –

+0

@ Ev.Kounis: его следует избегать, если только «a» не является константой (не предполагаемой изменением в течение всего процесса жизни), - и даже тогда было бы лучше явно пропустить «a» (если вам небезразлично проверяемость). –

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