2016-11-21 2 views
0

Ich habe ein Mini-Programm, das ein grundlegendes Modell für den Lebenszyklus einer Zelle von Geburt zu Meiose bis zum Tod sein soll. Während die meisten davon habe ich herausgefunden gotten, bin ich am folgenden stecken:Warum gibt meine Funktion früh auf?

class cell: 
    def __init__(self): 
     self.name = random.randint(1,1000) 
     self.type = [random.choice(b)] 
     self.age = 0 
     self.evos = random.randint(1,5) #<-- need to access this attr 

def displayEvolutions(pop): # one of many methods, this one is a problem 
    p = [] 
    for i in pop: 
     p.append(i.evos) 
     return p 

community = [#a bunch of class instances] 
cells_that_evolved = displayEvolutions(community) 

Es soll in einer Schleife durch die Liste der Klasseninstanzen community, den Zugriff auf ihre evo Attribut, füllen cells_that_evolved mit dieser Daten und Zeigen Sie dann diese Liste dem Benutzer an.

Es soll wie folgt aussehen:

cells_that_evolved = displayEvolutions(community) 
print(cells_that_evolved) 

[3, 4, 5, 6, 7, 8, 3, 1, 5] #<--- 9 instances, 9 values = instance.evos 

Doch egal, was ich versuche, es hängt nur den ersten Wert auf die Liste, so dass die Liste wie folgt aussieht:

[3] 

Warum?

Antwort

2

Sie haben eine Vertiefung Problem:

def displayEvolutions(pop): 
    p = [] 
    for i in pop: 
     p.append(i.evos) 
     return p 

Das erste Mal durch Ihre Schleife, wenn return p angetroffen wird, wird der aktuelle Wert von p zurückgegeben und die Funktion beendet. Stattdessen sollten Sie p zurückkehren, nachdem die Schleife abgeschlossen ist, durch unindenting diese Zeile:

def displayEvolutions(pop): 
    p = [] 
    for i in pop: 
     p.append(i.evos) 
    return p 

Eine elegantere Möglichkeit, die Funktion zu schreiben, wäre mit einem list comprehension:

def displayEvolutions(pop): 
    return [i.evos for i in pop] 
+0

Und natürlich einem prägnanten Der Weg wäre, ein Listenverständnis zu verwenden: 'def displayEvolutions (pop): return [ievos für i in pop]'. Dies hat den zusätzlichen Vorteil, dass die Möglichkeit von Einkerbungsproblemen nicht möglich ist. – SethMMorton

+0

@SethMMorton Sie haben natürlich Recht - in dieser Antwort habe ich beschlossen, die einfachste mögliche Lösung für einen [selbst beschriebenen] (http://stackoverflow.com/revisions/40713367/1) Anfänger zu liefern. –

+0

Ja, ich weiß. Ich dachte nur, da das Listenverständnis für genau diesen Zweck erstellt wurde, dachte ich, dass es sich lohnte, das Konzept dem OP vorzustellen. – SethMMorton

Verwandte Themen