Matematikai Algoritmusok és Felfedezések I.

6. Előadás: String formatálás, Kivéltelkezelés, Iteráció, Fájlkezelés

2021 március 15.

String formatálás

Több módszer van arra, hogy kényelmesebben generáljunk szöveges kimenetet. Az egyik a format() függvény. Ez egy stringből egy másik stringet készít úgy, hogy hogy a megadott paramétereket behelyettesíti a kapcsos zárójelek közé. A függvényekhez hasonlóan több féle paraméter átadás működik:

Ha az adatok egy dicitionaryben vannak, azt is használhatjuk.

string interpolation

Egy másik lehetőség az f-stringek használata. (részletek: PEP498)

Kivételkezelés

Feladvány

Mi fog történni ha lefuttatjuk az alábbi kódot?

Néhány tipikus hiba:

Hiba neve Tipikusan miért történt
IndexError: string index out of range Egy stringnél túlindexeltél
KeyError: 'some_text_here' Egy dictionaryben olyan kulcsot használtál, ami nincs benne
ModuleNotFoundError: No module named 'some_text_here' Egy olyan modult próbáltál importálni, ami nem található
NameError: name 'some_text_here' is not defined Olyan változó nevet próbáltál kiértékelni, ami még nem mutat objektumra
SyntaxError: can't assign to literal Egy stringet próbáltál meg változó névként használni. Pl 'a'=3
SyntaxError: EOL while scanning string literal Valamelyik stringet rosszul adtad meg.
IndentationError: expected an indented block Elrontottad az indentálást.
SyntaxError: invalid syntax Szintaktikai hiba. Gyakran azért van, mert lemarad a : valahonnan.
TypeError: can only concatenate str (not "int") to str Stringként kezeltél valamit, ami nem string. Pl egy számot.
TypeError: 'str' object is not callable Függvényként kezeltél egy stringet. Pl: "asd"(5)
ValueError: invalid literal for int() with base 10: 'some_text_here' Számmá próbáltál konvertálni egy szöveget, ami nem számokból áll.
ZeroDivisionError: division by zero Nullával osztottál

Futásidejű hibák

A futásidejű hibákat tudjuk futásidőben kezelni. Erre valók a try és except parancsok. Megadhatjuk, hogy hiba esetén mit tegyen a program, így nem fog rögtön elszállni. A try és az except közti részben figyel a program és ha olyan hibába ütközik, ami az except után áll, akkor végrehajtja a megadott parancsokat.

Többféle hibát tudunk együtt is kezelni

Együtt:

except típus nélkül

finally és else

Hibakezelés kibővitése

raise kulcsszó

Hibák definiálása

Iterálás, funkcionális eszközök

Sokféle objektumot tudunk használni for ciklusokban:

Ezeket az osztályokat közösen iterálható osztályoknak hívjuk. Az iterálható osztályokhoz tartozik egy-egy iterátor, amit megkaphatunk az iter függvénnyel. A next() függvény megadja az iterátor következő elemét. Ha már nincs több elem, StopIteration hibát kapunk. (Emiatt egyszerhasználatosak az iterátorok.)

Ez a két tulajdonság definiálja is az iterátorokat. Tehát egy iterátornak a következőket kell tudnia:

  1. Van egy __next__ függvénye, ami visszadja sorban az elemeket és
  2. StopIteration hibát ad, ha nincs több elem.

Egy osztály iterálható ha a van egy __iter__ függvénye ami visszatér egy iterátorral.

Rengeteg függvény van, ami elfogad bármilyen iterátort!

Iterátorok gyártása gyorsabban

Generátor kifejezések

A generátorok speciális iterátorok. A fő gondolat mögöttük, hogy sokszor nincs szükség egy list összes elemének a legyártásához, ha csak végig akarunk haladni a listán, hanem elég, ha mindig ki tudjuk számítani a következő elemet. Így sokkal kevesebb memóriát használ a gép.

Több mód is van a generátorok létrehozására, az egyik a generátor kifejezések, amik a list comprehensionök általánosításai.

Egy generátor kifejezést megadhatunk úgy, hogy () zárójelek közé írjuk a list comprehension kódját a [] zárójelek helyett.

Mivel a generátorok csak végéghaladnak a listán és nem gyártják azt le, így ezek is csak egyszerhasználatosak.

Második futásra már üres:

Minden generátor objektum is egyben iterátor, tehát a next() függvény megadja a következő elemet, ha pedig már nincs, StopIteration hibát ad.

itertools modul

Végtelen iterátorok:

filter

map

a map meghívja a megadott függvényt az iterátor minden elemére

zip

Fájlok írása és olvasása

A legfontosabb operációk:

A következő példa fájlt fogjuk használni, amit a pelda_fajl.txt-be mentettem:

1,Donielle,Vickar,dvickar0@tmall.com,true 2,Perle,Claye,pclaye1@blogs.com,true 3,Flori,Wharf,fwharf2@zdnet.com,true 4,Kristen,Haryngton,kharyngton3@yelp.com,false 5,Bibby,Covill,bcovill4@psu.edu,true 6,Illa,D'Elias,idelias5@twitter.com,true 7,Genia,Woodyear,gwoodyear6@reuters.com,false 8,Patrice,Rhys,prhys7@meetup.com,false 9,Rich,Gavozzi,rgavozzi8@istockphoto.com,false 10,Elfie,Comben,ecomben9@un.org,true

Fájl beolvasása

Egy sort beolvashatunk a .readline() függvénnyel:

Egy fájlon a for ciklus segítségével is végighaladhatunk:

Egyéb lehetőségek:

Fájlok írása

A fajlobj.write(egy_string) parancs a fájl végére írja a megadott stringet. Ehhez a fajlobj-nak egy írásra megnyitott fájlnak kell lennie.

Hibalehetőségek

Miért kell lezárni egy fájlt?

Ha nem zárjuk be, gondokat okozhat, hogy korábbi operációk még nem hajtódtak végre. Például:

with kulcsszó

A with kulcsszó automatikusan megoldja nekünk a lezárást és a hibakezelést. Használat:

with open(argumentumok) as valtozonev:

kód indentálva

Ha sikerül megnyitni a fájlt, lefuttatja az indentált részt, majd meghívja helyettünk a close() parancsot.

Karakterkódolás

json (JavaScript Object Notation)