2017-01-13 3 views
0

Ich habe 2 Funktionen fun1 und fun2, die als eine Zeichenfolge bzw. eine Zahl als Eingaben nehmen. Die beiden erhalten auch als Eingabe die gleiche Variable a. Dies ist der Code:Wie teilt man Variablen zwischen Funktionen in 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) 

Die Funktionen führen einige unsinnige Operationen aus. Mu Ziel wäre es, den Code so neu zu schreiben, dass die Variable a zwischen den Funktionen geteilt wird, so dass sie sie nicht mehr als Eingabe nehmen.

Eine Möglichkeit, die Variable a als Eingabe zu entfernen, wäre, sie innerhalb der Funktionen selbst zu definieren, aber das ist leider nicht sehr elegant. Können Sie mir einen möglichen Weg vorschlagen, um mein Ziel zu erreichen?

Die Funktionen sollten auf dieselbe Weise funktionieren, aber die Eingabeargumente sollten nur die Zeichenfolge und die Nummer sein (fun1(string), fun2(number)).

+1

Sie sind auf halbem Wege die objektorientierte Programmierung neu entdecken. – chepner

+0

Das Innere der Funktion kann "a" "sehen". Probieren Sie einfach 'for letter in a:' –

Antwort

6

Objektorientierte Programmierung hilft hier:

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

Sie können den Parameter 'vect' jetzt entfernen. ;) – Tagc

+0

Wenn 'a' eine Konstante ist, könnte es besser sein, es zu einem Klassenattribut (und möglicherweise einem Tupel) zu machen. Sonst könnte es besser sein, sie an den 'MyClass'-Initialisierer zu übergeben. –

+0

ist die Operation des Definierens von self.a wiederholt jedes Mal wenn ich fun1 oder fun2 nenne? Ich stelle diese Frage, weil, wenn self.a nach einer viel komplizierteren und anspruchsvolleren Operation erhalten wurde, ich möchte, dass sie nur einmal ausgeführt wird und nicht jedes Mal, wenn ich fun1 und fun2 anrufe –

4

Da a ist außerhalb der Funktionsumfang zu definieren und vor die Funktionen definiert sind, brauchen Sie es nicht als Argument zu füttern, können Sie einfach a verwenden. Python wird zuerst schauen, ob die Variable im Funktionsumfang definiert ist, wenn nicht, sieht sie außerhalb dieses Bereichs aus.

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) 

In diesem Fall können Sie auch Ihre Funktionen in eleganter Listenkomprehensionen umschreiben:

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

Wird das tatsächlich empfohlen oder sollte es vermieden werden? –

+0

@ Ev.Kounis: es wird nicht sehr elegant betrachtet, da man vergessen kann, dass es eine Variable gibt, die außerhalb des Bereichs definiert ist und ein "a" in eine Funktion einführt. Man benutzt besser objektorientierte Programmierung. –

+0

@ Ev.Kounis: Es sollte auf jeden Fall vermieden werden, es sei denn, "a" ist eine Konstante (nicht während des gesamten Prozesslebens ändern) - und selbst dann wäre es immer noch besser, "a" explizit zu übergeben (wenn Sie sich interessieren Testbarkeit das ist). –

Verwandte Themen