[[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}