students = []
def read_file():
try:
f = open("students.txt", "r")
for student in read_students(f): # lub (2) "for student in f" lub (3) "for student in f.readlines()"
students.append(student)
f.close()
except Exception:
print("Could not read a file.")
def read_students(f):
for line in f:
yield line
Witam,
-
Pierwsze pytanie, jaka jest różnica między pierwszym sposobem dołączania linii pliku do listy, a drugim (2), poza tym, że drugi używa własnej funkcji? Skutek jest taki sam. Poza tym z tego co mi wiadomo
for
działa z listami i generatorami, af
przechowuje plik. -
Druga sprawa, z moich testów wynika, że funkcja po słowie kluczowym
in
w pętlifor
jest wywoływana jeden raz (moja teza). Dlaczego więc pętla ta spełnia swoją funkcję z generatorem? Z tego co czytałem toyield
powoduje, że funkcja się zatrzymuje, zapisuje punkt, w którym się zatrzymała oraz zwraca określoną wartość. Zatem kłóci się to z moją tezą, ponieważ przypisane zostają wszystkie linie z pliku tekstowego do listystudents
. -
Dlaczego
print(read_students("test")
nie wyswietla "test", tylko adres pamięci (o ile dobrze pamiętam), a w petli jest inaczej? Zapewneyield
działa trochę inaczej niż ja zakładam. -
Trzeci sposób dołączania linii do listy jest błędny/mało efektywny, bo w czasie działania pętli
for
pamięć RAM musi przechowywać wszystkie linie tekstu na raz?
Proszę o wyjaśnienie i wyrozumiałość z uwagi na to, że Pythona uczę się od kilku dni.
Z góry dziękuję za odpowiedź.
Pozdrawiam