[python] Na vsetko cyklus for ?

Petr Přikryl prikryl na atlas.cz
Úterý Listopad 14 18:29:53 CET 2006


Roman Miklos napsal(a):
> 
> Povodne je for-cyklus v Pythone cyklus iterujuci cez zoznam, t.j. 
> analogia cyklu foreach v Perle.
> Preto sa mi predsa len spaja ten for aj pri citani suboru vzdy so 
> zoznamom. Nedavno bolo este typicky pytonovske toto

Cyklus for je ale obecnější. Neslouží pouze pro
průchod řádky seznamu. Slouží pro průchod všemi
prvky kontejneru. Nikdy nesloužil pouze pro průchod
seznamem. Vždycky sloužil minimálně pro průchod
sekvencí. Dávno sloužil i pro průchod položkami
slovníku. Vše to spěje k zobecnění -- průchod
jakýmkoliv iterovatelným kontejnerem.

> lines=f.readlines()
> for line in lines:
> ...
> 
> teda najprv sa nacital cely subor do zoznamu a potom sa prechadzal 
> riadok po riadku. Toto moze byt pri niektorych ulohach vhodne, avsak 
> vseobecne je to blbost.

Proto byla zavedena metoda xreadlines(), která
realizuje iteraci přes řádky souboru.


> Ked neskor teda bolo napriklad zavedene toto
> 
> for line in file("data.txt"):
> ...
> 
> t.j. tento cyklus cita riadok po riadku, je to zasa len odchylka oproti 
> povodnemu cyklu for (ktory iteroval cez zoznam), takze zaciatocnik v 
> Pythone si musi pamatat rozne vynimky typu: "for iteruje cez zoznam, ale 
> 'for line in file("data.txt")' cita subor po riadkoch" /inac by si mohol 
> mysliet, ze file("data.txt") vracia zoznam, co nie je pravda, lebo je to 
> ekvivalentne s open("data.txt")/

Není. Otevřený textový soubor se typicky chápe jako
posloupnost řádků, kde každý řádek je řetězec.

> Takze ked to zhrnieme mame teraz takuto situaciu:
> 
> # cita subor po riadkoch
> for line in file('data.txt'):
> ...
>    
> # vrati naprv zoznam riadkov a iteruje cez tento zoznam    
> for line in file('data.txt').readlines():
> ...
> 
> Myslim si, ze citat subor po riadkoch alebo najprv vsetky riadky nacitat 
> do zoznamu a potom ho prechadzat je dost velky rozdiel.
> A ked sa obe tieto veci robia cez for .. zavadza to zbytocny zmatok, nie?  

V tom druhém, případě se ale neprochází soubor.
Prochází se seznam řetězců!

> Podla mna by bolo ovela jasnejsie zaviest na citanie po riadkoch:
> 
> while line = f.readline():
> ...

To jde v Pythonu odjakživa

line = 'init'
while line != '':   # nebo taky while line:
     line = f.readline()
     zpracuj(line)


pepr


Další informace o konferenci Python