Tengo 2 funciones fun1 y fun2 que toman como entradas una cadena y un número respectivamente. Ambos también obtienen como entrada la misma variable a. Este es el código:

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)

Las funciones realizan algunas operaciones sin sentido. Mi objetivo sería reescribir el código de tal manera que la variable a se comparta entre las funciones para que ya no la tomen como entrada.

Una forma de eliminar la variable a como entrada sería definiéndola dentro de las funciones mismas, pero desafortunadamente eso no es muy elegante. ¿Podría sugerirme una posible forma de alcanzar mi meta?

Las funciones deben funcionar de la misma manera, pero los argumentos de entrada solo deben ser la cadena y el número (fun1(string), fun2(number)).

9
Federico Gentile 13 ene. 2017 a las 17:30

3 respuestas

La mejor respuesta

La programación orientada a objetos ayuda aquí:

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)
16
Willem Van Onsem 13 ene. 2017 a las 14:49

Una alternativa al uso de clases: Puede usar la palabra clave global para usar variables que se encuentran fuera de la función.

a = 5
def func():
    global a
    return a+1

print (func())

Esto imprimirá 6

Pero las variables globales deben evitarse tanto como sea posible

11
goweon 29 sep. 2019 a las 08:14

Dado que a se define fuera del alcance de la función y antes se definen las funciones, no es necesario que lo alimente como argumento, simplemente puede usar a. Python primero verá si la variable está definida en el alcance de la función, si no, se ve fuera de ese alcance.

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)

En este caso, también puede reescribir sus funciones en comprensiones de listas más elegantes:

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)
5
Willem Van Onsem 13 ene. 2017 a las 14:32