[[oktatas:programozás:python|< Python]] ====== Python haladó ====== * **Szerző:** Sallai András * Copyright (c) 2020, Sallai András * Szerkesztve: 2020-2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== A None ===== A None nem létező érték, mint más nyelvekben a NULL. Írassuk ki típusát: print(type(None)) ===== Halmazok ===== A halmaz, angolul set egy olyan kollekció amely nincs számozva, nincs indexelve. A halmazban egy elem csak egyszer szerepelhet. A Python nyelvben a halmazokat kapcsos-zárójelek között adjuk meg. egyHalmaz = {'alma', 'barack', 'szilva'} print(egyHalmaz) A halmaz bejárása: egyHalmaz = {'alma', 'barack', 'szilva'} for elem in egyHalmaz: print(elem) Hozzáadás a halmazhoz: egyHalmaz = {'alma', 'barack', 'szilva'} egyHalmaz.add('körte') print(egyHalmaz) Ha a halmaz már tartalmazza az elemet, nem történik semmi. Halmaz mérete: egyHalmaz = {'alma', 'barack', 'szilva'} print(len(egyHalmaz)) Törlés a halmazból: egyHalmaz = {'alma', 'barack', 'szilva', 'körte'} egyHalmaz.remove('barack') print(egyHalmaz) Törlés másként: egyHalmaz = {'alma', 'barack', 'szilva', 'körte'} egyHalmaz.discard('barack') print(egyHalmaz) A pop() függvény is használható, de mivel nem rendezett a halmaz, nem lehet tudni, melyik elem kerül eltávolításra. Halmaz ürítése: egyHalmaz = {'alma', 'barack', 'szilva', 'körte'} egyHalmaz.clear() print(egyHalmaz) A halmaz törlése: egyHalmaz = {'alma', 'barack', 'szilva', 'körte'} del egyHalmaz print(egyHalmaz) A print() függvény hibát ad, mivel a halmaz már nem létezik. Halmazok uniója: egyHalmaz = {'alma', 'barack', 'szilva', 'körte'} kettoHalmaz = {'banán', 'citrom'} haromHalmaz = egyHalmaz.union(kettoHalmaz) print(haromHalmaz) Új halmaz keletkezik. Egy halmazt bővítünk egy másikkal: egyHalmaz = {'alma', 'barack', 'szilva', 'körte'} kettoHalmaz = {'banán', 'citrom'} egyHalmaz.update(kettoHalmaz) print(egyHalmaz) Itt nem keletkezik új halmaz, egyHalmaz kerül bővítésre. Halmaz létrehozása konstruktorral: egyHalmaz = set(('alma', 'barack', 'szilva', 'körte')) print(egyHalmaz) | add() | Elem hozzáadása | | clear() | Összes elem törlése | | copy() | Másolat | | difference() | Visszatér kettő vagy több halmaz különbségével. \\ Új halmaz jön létre | | difference_update() | Eltávolítja azokat az elemeket, amelyek szerepelnek a másik halmazban. | | discard() | Adott elem törlése. | | intersection() | Két halmaz metszete. | | intersection_update | Azon elemek törlése, amely szerepel a másik halmazban. | | isdisjoint() | Van-e metszéspontja a két halmaznak. | | issubset() | A másik halmazt tartalmazza-e. | | pop() | Elem eltávolítása | | remove() | Adott elem eltávolítása | | symmetric_difference() | Olyan halmaz létrehozása, \\ amely a nem közös részeket tartalmazza. | | symmetric_difference_update() | Adott halmazban csak a nem közös elemek maradnak. \\ Nem jön létre új halmaz. | | union() | Két halmaz uniója. Új halmaz jön létre | | update() | Halmazok uniója, de nem jön létre új halmaz | ===== Szótár ===== A szótár, angolul dictionary, egy kollekció, amely számozatlan, változtatható és indexelt. A Python nyelvben kulcs érték párokkal határozzuk meg a szótárakat. Létrehozás: egySzotar = { 'nev': 'Nagy János', 'telepules': 'Szolnok', 'fizetes': 2850000 } print(egySzotar) Hivatkozás egy elemre: egySzotar = { 'nev': 'Nagy János', 'telepules': 'Szolnok', 'fizetes': 2850000 } print(egySzotar['nev']) Vagy: print(egySzotar.get('nev')) Érték cseréje: egySzotar['nev'] = 'Kiss Mihály' Szótár bejárása: egySzotar = { 'nev': 'Nagy János', 'telepules': 'Szolnok', 'fizetes': 2850000 } for elem in egySzotar: print(elem) Vagy: for kulcs in egySzotar: print(egySzotar[kulcs]) Vagy: for elem in egySzotar.values(): print(elem) Kulcsok és értékpárok kiíratása: for kulcs, elem in egySzotar.items(): print(kulcs, elem) Van-e ilyen kulcs: if 'fizetes' in egySzotar: print('Van fizetes kulcs') Szótár mérete: print(len(egySzotar)) Plusz elem hozzáadása: egySzotar = { 'nev': 'Nagy János', 'telepules': 'Szolnok', 'fizetes': 2850000 } egySzotar['kor'] = 38 print(len(egySzotar)) Elem törlése: egySzotar.pop('kor') Utoljára beszúrt elem törlése: egySzotar.popitem() Elem törlése: del egySzotar['kor'] A szótár törlése: del egySzotar Az elemek törlése: egySzotar.clear() A szótár másolása: kettoSzotar = egySzotar.copy() Másolás másként: kettoSzotar = dict(egySzotar) Beágyazott szótár: dolgozok = { 'janos' : { 'nev': 'Nagy János', 'telepules': 'Szolnok', 'fizetes': 2850000, }, 'mari' : { 'nev': 'Pere Mária', 'telepules': 'Miskolc', 'fizetes': 2810000 }, 'kati' : { 'nev': 'Lamp Katalin', 'telepules': 'Szeged', 'fizetes': 2500000 } } print(dolgozok) Külön szótárak: janos = { 'nev': 'Nagy János', 'telepules': 'Szolnok', 'fizetes': 2850000, } mari = { 'nev': 'Pere Mária', 'telepules': 'Miskolc', 'fizetes': 2810000 } kati = { 'nev': 'Lamp Katalin', 'telepules': 'Szeged', 'fizetes': 2500000 } dolgozok = { 'janos' : janos, 'mari' : mari, 'kati' : kati } print(dolgozok) Konstruktor használata dolgozo = dict( nev= 'Nagy János', telepules= 'Szolnok', fizetes= 2850000, ) print(dolgozo) | clear() | Az összes elem törlése | | copy() | Szótár másolása | | fromkeys() | Egy szótárat kapunk adott kulccsal és értékkel | | get() | Visszatérés adott kulcs értékével | | items() | Egy tuple-t kapunk, amely tartalmazza \\ az összes kulcs értékpárokat. | | keys() | A kulcsok listáját kapjuk | | pop() | Adott elem törlése, kulcs alapján | | popitem() | Utoljára beszúrt elem törlése | | setdefault() | Adott értéket kapjuk kulcs alapján. \\ Ha a megadott kulcs nem létezik \\ létrejön. | | update() | Adott kulcsa értékpár frissítése | | values() | Az értékek listáját kapjuk | ===== Változó hosszúságú argumentum ===== A függvények használhatnak változó hosszúságú argumentumokat. def osszead(*args): osszeg = 0 for szam in args: osszeg = osszeg + szam return osszeg print(osszead(3, 4)) print(osszead(3, 4, 5)) A másik megoldás, ha listaként adom át a paramétereket: def osszead(args): osszeg = 0 for szam in args: osszeg = osszeg + szam return osszeg print(osszead([3, 4])) print(osszead([3, 4, 5])) ==== Kulcs alapú argumentumok ==== Változó hosszúságú kulcs alapú argumentumokat a kettő darab * operátorral hozunk létre. Például **kwargs. def szamitTerulet(**kwargs): alap = kwargs.get('alap') magassag = kwargs.get('magassag') return alap * magassag / 2 print(szamitTerulet(alap=30, magassag=35)) ==== Vegyes argumentumok ==== Az argumentumok lehetnek vegyesen kulcs nélküli és kulcs alapú argumentumok. def doit(*args, **kwargs): if kwargs.get('operator') == '+': return args[0] + args[1] if kwargs.get('operator') == '-': return args[0] - args[1] print(doit(3, 4, operator='-')) ===== Lambda ===== Kis névtelen függvény, amely csak egyetlen kifejezést tartalmazhat. lambda argumentumok : kifejezés dupla = lambda szam : szam * 2 print(dupla(5)) haromszogTerulet = lambda alap, magassag : (alap*magassag)/2 print(haromszogTerulet(30, 35)) haromszogKerulet = lambda a, b, c : a + b + c print(haromszogKerulet(30, 35, 40)) Lehetséges használat: def sokszorozo(n): return lambda a : a * n duplazo = sokszorozo(2) triplazo = sokszorozo(3) print(duplazo(5)) print(triplazo(5)) ===== Üresek ===== def fuggveny(): pass Üres végtelen ciklus: while(True): pass Üres if ág: igaz = True if igaz : pass else : print('Hamis') ==== Üres osztály ==== class Dolgozo: pass Munka üres osztállyal: class Dolgozo: pass janos = Dolgozo() janos.name = 'Valaki' janos.tisztseg = 'kocka' janos.telefon = 12345678 print(janos.name) print(janos.tisztseg) print(janos.telefon) Az üres osztály használható osztály. Bármilyen adattagot beállíthatunk, és amit beállítottunk lekérdezhetjük. ==== Üres érték ==== valami = None ===== Python fájlok ===== ==== WHL fájlok ==== A WHL a **Python Wheel Package** szavakból származik. A **Wheel** a Python saját csomagformátuma. A Wheel valójában egy ZIP formátumú archív fájl, amelyet whl kiterjesztéssel rendelkezik. ==== Python fájlok ==== * .py -- Python script * .pyc -- Python bájtkód * .pyd -- Python dinamikus modul * .pyo -- Python optimalizált kód * .pyr -- Python tároló (repository) * .p4a -- Python for Android Script * .re -- Python szabályos kifejezés forráskód * .pyt -- Python adatdeklaráció ===== Python könyvtárak ===== * __pycache__ A Python futtatáskor elsőként bájtkódot fordít. A bájtkód ebben a könyvtárban jön létre. A forráskódban importálás mellett szokott megjelenni. A könyvtárban .pyc vagy .pyo kiterjesztésű fájlokat talál, amelyek a lefordított, optimalizált bájtkódok. Ha másnak küldjük el a Python kódot, ezt a könyvtárat töröljük. Git esetén a .gitignore fájlban szokás szerepeltetni. ===== Változó behelyettesítés ===== a = 35 b = 'valami %d' % a print(b) a = 35 b = 'valami {0}'.format(a) print(b) a = 35 b = """ valami %s """ % a print(b) ===== Operációs rendszer parancsok ===== import os os.system('ls') A program végrehajtja az operációs rendszer ls parancsát. ===== Külső könyvtárak használata ===== sys.path.append('/ahol/a/libek/vannak/') ===== Egy fájlban több osztály ===== Azok az osztályok, amikre hivatkozunk egy állományon belül előrébb kell legyenek, mint a hivatkozott hely. class View: pass class Model: pass class Controller: view = View() model = Model() ===== f-String ===== Az f-Stringet a Python 3.6-ban vezették be. ==== Változó behelyettesítés ==== Lehetővé teszi változók behelyettesítését. name = 'Nagy János' city = 'Szolnok' print(f'Név: {name} Város: {city} ') Mindegy, hogy aposztrófokat vagy idézőjeleket használunk: name = 'Nagy János' city = 'Szolnok' print(f"Név: {name} Város: {city} ") ==== Kifejezés ==== A f-sztring alkalmas kifejezések kiértékelésére is. oldal = 30 print(f'Kerület: {oldal*3}') ==== Szótár ==== Hivatkozhatunk szótárak tagjaira: employee = {'name': 'Nagy János', 'city': 'Szolnok'} print(f"{employee['name']}:{employee['city']}") ==== Többsoros ==== name = 'Nagy János' city = 'Szolnok' salary = 3845000 datas = ( f'Név: {name}\n' f'Város: {city}\n' f'Fizetés: {salary}\n' ) print(datas) ==== Formázás ==== num = 3.834384 print(f'{num:.2f}') Szélesség is: num = 3.834384 print(f'{num:20.2f}') Igazítás jobbra: num1=1 num2=12 num3=123 print(f'{num1:>5d}') print(f'{num2:>5d}') print(f'{num3:>5d}') Számrendszerek és tárolási osztályok: num=12 print(f'{num:d}') # decimális egész print(f'{num:x}') # hexadecimális print(f'{num:o}') # oktális print(f'{num:f}') # fixpontos alak print(f'{num:e}') # tudományos alak print(f'{num:b}') # bináris ==== Dátum ==== import datetime today = datetime.datetime.today() print(f'{today: %Y}') ===== Kurzor mozgatása ===== def gotoxy(x,y): print ("%c[%d;%df" % (0x1B, y, x), end='') ===== Útvonal lekérdezése ===== Honnan fut a Python script? real_path = os.path.realpath(__file__) base_path = os.path.dirname(real_path) real_path = os.path.realpath(__file__) base_path = os.path.split(real_path)[0] A real_path-ban megkapom a teljes útvonalat és a fájlnevét is. A bas_path-ban csak az útvonalat kapom, fájlnév nélkül. A fájl neve: real_path = os.path.realpath(__file__) base_name = os.path.basename(real_path) ===== Locale ===== Ha egy állományból olyan számokat olvasunk amelyekben tizedesvesszők vannak, át kell azokat konvertálni, ha számolni szeretnénk vele. Át is alakíthatjuk: num = float(num_str.replace(',', '.')) Vagy locale-t használunk: from locale import atof, setlocale, LC_NUMERIC setlocale(LC_NUMERIC, 'hu_HU.UTF-8') num_str = '35,47' print(atof(num_str) * 2) Beírható locale értékek lekérdezése: >>> import locale >>> locale.locale_alias ===== Típusok ===== def double_num(num1: float, num2: float): return num1 + num2 print(double_num(6.2, 5.4)) def double_num(num1: int, num2: int): return num1 + num2 print(double_num(6, 5)) a: List[str] = ['alma', 'körte', 'barack'] b: Tuple[int, int, int] = [35, 40, 45] c: Dict[str, int] = {'első': 35, 'második': 40}