2017-01-13 3 views
1

Ich habe gerade begonnen, Klassen in Python zu lernen, und ich habe ein Problem mit ihnen.Wie Iterationen einer Liste in einer Klasse zurückgegeben werden

Ich habe TXT-Datei mit den folgenden Zeilen:

3 37.5 200 

6 36.9 200 

9 36.6 100 

12 36.6 0 

Wenn ich den Code ausführen, druckt er nur die erste Zeile. Ich möchte jedoch alle Zeilen abrufen. Ich weiß, dass Sie print() verwenden können, aber ist es möglich, zurückzukehren?

class Meds: 

    def __init__(self, file): 
     self.file = file 

    def meds(self): 
     for i in source.readlines(): 
      data_split = i.strip().split(' ') 

      hour = data_split[0] 
      temp = data_split[1] 
      dose = data_split[2] 

      return 'At {0}:00 - he had {1} temp, and took {2} mg of meds'.format(hour, temp, dose) 

if __name__ == '__main__': 
    source = open('meds.txt', 'r', encoding='utf8') 

    a = Meds(source) 
    print(a.meds()) 

    source.close() 

Ich würde wirklich auf dieser Hilfe dankbar und würde unglaublich freuen, wenn Sie gut zur Verfügung stellen können, klar Quellen Klassen in Python zu erklären.

Antwort

1

readlines() gibt ALLE Zeilen in der Datei zurück. Sie möchten stattdessen readline() verwenden.

Sie scheinen durch source statt self.file zu iterieren. Sie kommen von der Methode meds() zurück, die nur über eine einzelne Linie auch geschleift hat. Sie können auch direkt über das Dateiobjekt schleifen. Mit dem im Verstand, Ihre Looping Funktion wie folgt aussehen könnte:

for line in self.file: 
    data_split = i.strip().split(' ') 
    hour = data_split[0] 
    temp = data_split[1] 
    dose = data_split[2] 
    yield 'At {0}:00 - he had {1} temp, and took {2} mg of meds'.format(hour, temp, dose) 

In Ihrem Code, meds() ruft, können Sie Folgendes verwenden:

for med in a.meds(): 
    print(med) 

Weiterführende Literatur finden Sie in der Dokumentation here .

+0

Dies ist nach wie vor nur eine Saite zurückkehren würde. Die Schleife wird niemals über die erste Iteration hinausgehen. – Kevin

+0

Ich habe den ersten Beispielcode geändert, um 'yield' zu verwenden und den Verwendungscode für den Generator hinzuzufügen, wo sie ihn aufrufen. Danke, dass du es aufgezeigt hast. – Thelmund

+0

Cool, sieht jetzt gut aus :-) – Kevin

0

Sie könnten Ihren Code so etwas wie es umschreiben:

class Meds: 

    def __init__(self, file): 
     self.file = file 

    def meds(self): 
     for i in self.file.readlines(): 
      data_split = i.strip().split(' ') 

      hour = data_split[0] 
      temp = data_split[1] 
      dose = data_split[2] 

      yield 'At {0}:00 - he had {1} temp, and took {2} mg of meds'.format(hour, temp, dose) 


source = open('meds.txt', 'r', encoding='utf8') 

a = Meds(source) 
print(list(a.meds())) 

source.close() 

In diesem Fall Sie generator Generator verwenden.

+0

die empfohlene Art der Behandlung einer Datei ist mit der 'with' Anweisung – Copperfield

1

Ihre Meds Klasse hat zwei Methoden, von denen eine __init__ ist, und die andere meds ist.

So ist es nicht eine Klasse, aber eine Funktion in Verkleidung.

Nicht jedes Programmierproblem kann und sollte durch das Schreiben von Klassen gelöst werden.

def meds(path): 
    with open(path) as medsfile: 
     data = [tuple(float(k) for k in ln.split()) 
       for ln in medsfile if len(ln.strip()) > 0] 
    return data 

Ausführen dieses auf Ihre Eingangsdaten gibt eine Liste von Tupeln:

In [4]: meds('meds.txt') 
Out[4]: [(3.0, 37.5, 200.0), (6.0, 36.9, 200.0), (9.0, 36.6, 100.0), (12.0, 36.6, 0.0)] 
+0

Sie können auch erstellen die' data' Liste beim Lesen der Datei – Copperfield

+0

Vielen Dank für Ihre Antwort. Ich verstehe es. Aber ich lerne Klassen und mein Mentor bat mich, meine Funktion in eine Klasse zu verwandeln. – Jasmont

Verwandte Themen