Telekommunikációs hálózatok > Gyakorlati anyag >
Python alapok
Python alapok
Változók:
Pythonban az alábbi típusok léteznek, ezekre láthatunk néhány példát lentebb:
Szöveg típus: str
Szám típusok: int, float, complex
Sorozat típusok: list, tuple, range
Szótér típus: dict
Halmaz típusok: set, frozenset
Logikai típus: bool
Bináris típusok: bytes, bytearray, memoryview
None típus: NoneType
a = 42b = 'asd'# stringc = "asd"# also a stringd = f"{a} is a number"# format stringd = "%d is a number" % a# format stringe, f = 5, 6f, e = e, f# swap values
b = " I'm a String "# stringb.upper()b.lower()b.strip()# remove whitespacesb.lstrip()# remove whitespaces from the leftb.rstrip()# remove whitespaces from the rightb.replace("a", "b")b.split("s")
Adatszerkezetek:
Listák:
A listák inhomogének, tehát lehetnek benne különböző típusú elemek is. A
háttérben egy láncolt listaként van implementálva.
l = [1, 2, 'a', [5, 6]]l[3] # indexingl[-1] # last elementl.append("b")
l.insert(2, "b") # index, iteml.extend([1, 2, 3])
3inl# is 3 in the list?l.remove("b") # remove a specific itemdell[2] # remove item on a specific indexl.clear() # remove all items from the list but the list is still availabledell# delete the whole list
Slicing: A slicing segítségével nem csak egy elemet tudunk indexelni,
hanem akár az adatszerkezetnek egy részét is. Listán és tuple-ön is működik.
l = [1, 2, 'a', [5, 6]]l[1:] # slice from index 1 to the endl[:-1] # slice from the beginning to the second last elementl[1:-1] # slice from index 1 to the second last elementl[1:-1:2] # slice with step 2l[1:2] ==l[1] # False, [2] != 2
Tuple:
Hasonló a listához, de nem módosíthatók az elemek benne. Nem lehet törölni elemet
és felülírni sem.
l = (1, 'a', "c", 3)dell[2] # Errorl[2] ='a'# Error
Szótár (dictionary):
team = { 91: "Ayers, Robert", 13: "Beckham Jr,", 3: "Brown, Josh", 54: "Casillas, Jonathan", 21: "Collins, Landon"}len(team) # length of the dictionaryteam[3]
team[2] = "Brown"# add new elemdelteam[2] # remove elemteam.keys()
team.values()
team.items()
if100inteam:
print('Yes, 100 is in the team')
elif76inteam:
print('100 is not in the team, but 76 is in it...')
else:
print('Both 100 and 76 are not in the team')
Ha létrehozunk a függvényen belül egy ugyanolyan nevű változót, akkor az változó
csak a függvényen belül él és a globális változó értéke ugyanaz marad. Ha használjuk a global
kulcsszót, akkor a globális változót tudjuk módosítani a függvényen belül úgy, hogy a változtatás a
függvényen kívül is megmarad.
x = "awesome"defmyfunc():
x = "fantastic"# override the global variable in this scopeprint("Python is " + x)
myfunc()
print("Python is " + x) # this is the original 'x'
x = "awesome"defmyfunc():
globalxx = "fantastic"print("Python is " + x)
myfunc()
print("Python is " + x)
A read(x) függvénnyel bájtot vagy karaktert tudunk beolvasni, attól függően, hogy
hogyan nyitottuk meg. Ha binárisra van megnyitva, akkor x bájtot olvas be, ha szövegesen van
megnyitva, akkor x karaktert.
A seek() függvénnyel a fájlt pontert tudjuk átállítani. Például, ha már
beolvastuk a fájt vissza tudjuk állítani a fájl pointert az elejére és újra beolvashatjuk.
whence: alapért. 0: abszolút poz., 1: relatív aktuális poz.-hoz, 2: rel. a fájl végéhez
Bájtsorrend:
Az endianness jelzi azt a tulajdonságot, ami bizonyos adatok tárolási és/vagy
hálózaton való továbbítási sorrendjét jellemzi. Hálózaton való küldés esetén kulcsfontosságú. A
számítógépeken architechtúra függő, hogy melyik bájtsorrendet használják. Azonban az Internet
Protocol (IP) definiál egy szabványos nagy az elején (big-endian) hálózati bájtsorrendet. Ezt a
bájtsorrendet kell használni minden csomag fejlécében és több magas szintű protokollban és
fájlformátumban, amit IP szerinti kezelésre terveznek. Tehát a hosztokon (számítógépeken) eltérő
lehet a bájtsorrend, mint az interneten. Létezik big-endian (nagy az elején) és little-endian (kicsi
az elején) bájtsorrend. Például, ha van egy 4 bájtos string utána egy int és utána megint egy 4
bájtos string, akkor azok így néznek ki big- és little-endianban:
66 6f 6f 00 67 45 23 01 62 61 72 00
66 6f 6f 00 01 23 45 67 62 61 72 00
A 16 és 32 bites pozitív számok kódolása az alábbi függvényekkel történhet:
htons(), htonl() – host to network short / long
ntohs(), ntohl() – network to host short / long
Struktúra:
Az interneten való adatküldés során számos protokoll megköveteli, hogy bájt
formában küldjük az adatainkat és ne string formátumban. A stringeket könnyedén át tudjuk alakítani
bájt formába az encode() függvénnyel, visszalakítani a decode()-al lehet. A struct pythonban arra
jó, hogy át tudjunk alakítani különböző típusú adatokat egy bájtliterálba, amit már akár küldeni is
lehetne az interneten. (Megjegyzés: A stringeket bájt formában várja el.). A pack() függvénnyel
tudjuk előállítani ezt a bájtliterált. Első paraméterként meg kell adni, hogy milyen típusú adatokat
szeretnénk belerakni ebbe a bájtliterálba, illetve a bájtsorrendet is meg lehet adni. Második
paramétereként pedig fel kell soroljuk az adatainkat, amiknek meg kell egyezniük az első
paraméterben megadott formátummal.
Figyelni kell arra, hogy a valamilyen hosszú string ("Xs") X darab bájtból álló
bájtliterált jelent.
Ki tudjuk számolni, hogy milyen hosszú a bájtliterálunk, amit előállítottunk. Ezt
a struct.calcsize("i 2s f") fogja megadni, ahol a függvény paraméterét kicserélhetjuk bármire. Ha
ennél a példánál maradunk láthatjuk, hogy nem annyi jön ki, mint amennyire számítanánk. 4 bájt int +
2 bájt string + 4 bájt float != 12. Ez azért van, mert az int/float-ot mindig úgy igazítja, hogy a
kezdő pozíciója 4-gyel osztható legyen.
importstructpacker = struct.Struct("i 2s f")
print(struct.calcsize("i 2s f "))
print(packer.size)
Korábban láthattuk már a parancssori argumentumokat. Ezekkel a parancssori
argumentumokkal annyi a probléma, hogy minden parancssori argumentumunknak fix sorrendje van és nem
hagyhatunk ki elemeket. Erre egy remek eszköz az argument parser: https://docs.python.org/3/library/argparse.html.
Az argument parser használatával kapcsolók segítségével tudjuk megadni az argumentumokat. Nézzünk is
egy példát:
Futtatáskor a -t kapcsolóval meg tudjuk adni az argumentumot. Viszont ez a -t
kapcsoló opcionális. Továbbá ezeknek a kapcsolóknak a sorrendje is variálható.
Feladatok
Az alábbi feladatok a gyakorlatokon elvégzendő kötelező, illetve
gyakorló
feladatok.
1. feladat:
Írjunk függvényt ami megadja a paraméterben kapott évszámról,
hogy szökőév-e. Az évszámokat egy fájlból olvassuk be!
Egy év szökőév ha osztható néggyel, de akkor nem ha osztható
százzal, hacsak nem osztható négyszázzal.
Példák:
szökőév: 1992, 1996, 2000, 2400
nem szökőév: 1993, 1900
2. feladat:
Írjunk scriptet, ami kiszámolja, hogy hány pont szükséges a mininet
házifeladtból az egyes jegyek eléréséhez. A bement egy json-t tartalmazó
fájl legyen, amely tartalmazza a socket házik, az első ZH-n elért és
maximális pontot. A kimenet pedig az egyes érdemjegyekhez szükséges
minimális pont. (Rész pont nincs!)