====== Függvények, modulok ====== **Miért kellenek függvények?** * Probléma: ismétlődő kód, átláthatatlanság. * Megoldás: a kódot logikai egységekre bontjuk. * A függvény csak akkor fut le, ha meghívjuk. def fuggveny_nev(): utasitas Egyszerű függvény: def koszones(): print("Szia!") def uzenet(): print("K") uzenet() uzenet() uzenet() koszones() **Paraméterek** Paraméter: adat, amit a függvény kap. Bármennyi lehet, akár 0 is. def koszones(nev): print("Szia", nev) koszones("Anna") def osszeg(a, b): print(a + b) osszeg(6,7) Példa: Írj függvényt, ami kiszámolja egy téglalap területét. Add át paraméterként a szélességet és magasságot. def teglalap_terulet(szelesseg, magassag): print(szelesseg * magassag) teglalap_terulet(5, 3) **return (visszatérési érték)** A return értéket ad vissza. def osszeg(a, b): return a + b x = osszeg(4, 6) print(x) Példa: Írj függvényt, ami visszaadja egy szám négyzetét. Használd az eredményt egy változóban. def negyzet(szam): return szam ** 2 eredmeny = negyzet(5) print("Négyzet:", eredmeny) ---- ==== Összefoglaló feladatok ==== **1. feladat:** Írj függvényt, ami: * kap egy listát paraméterként * visszaadja az elemek összegét def lista_osszeg(lista): osszeg = 0 for elem in lista: osszeg += elem return osszeg szamok = [1, 2, 3, 4] print(lista_osszeg(szamok)) **2. feladat:** Írj programot, ami: - Bekér 5 számot - Listába teszi - Függvénnyel kiszámolja: * az összegét * az átlagát - Kiírja az eredményeket def osszeg(lista): s = 0 for elem in lista: s += elem return s def atlag(lista): return osszeg(lista) / len(lista) szamok = [] for i in range(5): szam = float(input("Adj meg egy számot: ")) szamok.append(szam) print("Összeg:", osszeg(szamok)) print("Átlag:", atlag(szamok)) **3. feladat:** Írj egy függvényt osszeg névvel, ami egy lista számot kap és visszaadja az összegüket. Próbáld ki a függvényt egy felhasználótól bekért számok listájával. # Megoldás def osszeg(szamok): total = 0 for sz in szamok: total += sz return total # Példa input be = input("Adj meg számokat szóközzel elválasztva: ") szamok_lista = [int(x) for x in be.split()] print("Összeg:", osszeg(szamok_lista)) **4. feladat:** Írj egy függvényt legnagyobb_szo(szavak) névvel, ami egy szavak listáját kapja és visszaadja a leghosszabb szót. # Megoldás def legnagyobb_szo(szavak): max_szo = "" for szo in szavak: if len(szo) > len(max_szo): max_szo = szo return max_szo szavak = ["alma", "korte", "barack", "sargadinnye"] print("Leghosszabb szó:", legnagyobb_szo(szavak)) **5. feladat:** Készíts egy függvényt szavak_szamlalo(szoveg), ami visszaad egy dict-et: kulcs a szó, érték a darabszám. # Megoldás def szavak_szamlalo(szoveg): szavak = szoveg.split() szamolas = {} for szo in szavak: szamolas[szo] = szamolas.get(szo, 0) + 1 return szamolas szoveg = "alma korte alma barack alma" print(szavak_szamlalo(szoveg)) **6. feladat:** Írj egy függvényt paros_paratlan(szamok) névvel, ami egy lista számot kap és két listát ad vissza: párosok és páratlanok. # Megoldás def paros_paratlan(szamok): paros = [] paratlan = [] for sz in szamok: if sz % 2 == 0: paros.append(sz) else: paratlan.append(sz) return paros, paratlan szamok = [1,2,3,4,5,6,7,8] paros, paratlan = paros_paratlan(szamok) print("Párosok:", paros) print("Páratlanok:", paratlan) **7.feladat:** Írj egy függvényt egyedi_karakterek(szoveg), ami egy stringet kap és visszaad egy set-et, ami az összes egyedi karaktert tartalmazza. # Megoldás def egyedi_karakterek(szoveg): karakterek = set() for c in szoveg: karakterek.add(c) return karakterek szoveg = "programozas" print("Egyedi karakterek:", egyedi_karakterek(szoveg)) **8. feladat:** Képzeld el, hogy egy kis osztályban szeretnénk nyilvántartani a diákok nevét, tantárgyait és jegyeit. - Készíts egy programot, ami: - Bekéri a diákok nevét és tantárgyait. - Minden diákhoz több jegyet lehet felvinni listában. - Függvényekkel: * Egy függvény számolja ki a diákok átlagát tantárgyanként. * Egy függvény visszaadja a legjobb jegyet minden diákhoz. * Egy függvény megmondja, melyik diákoknak van 1-es jegye. - Külön set segítségével listázd az összes tantárgyat, amit az osztályban tanulnak. - Külön dict segítségével listázd, hogy hány diák tanul minden tantárgyat. # Függvények def atlag_diak(jegyek): """Lista jegyek -> átlag""" if len(jegyek) == 0: return 0 osszeg = 0 for szam in jegyek: osszeg += szam return osszeg / len(jegyek) def legjobb_jegy(jegyek): """Lista jegyek -> legnagyobb érték""" if len(jegyek) == 0: return None max_jegy = jegyek[0] for szam in jegyek: if szam > max_jegy: max_jegy = szam return max_jegy def egyes_jegy(jegyek): """Ellenőrzi, van-e 1-es jegy""" for szam in jegyek: if szam == 1: return True return False # Adatok felvitele diakok = {} while True: nev = input("Add meg a diák nevét (vagy ENTER a befejezéshez): ") if nev == "": break tantargyak = input("Add meg a tantárgyakat szóközzel elválasztva: ").split() jegyek = [] for tantargy in tantargyak: be = input(f"Add meg {nev} jegyeit a(z) {tantargy}-ból szóközzel elválasztva: ") jegyek_tantargy = [int(x) for x in be.split()] jegyek.append((tantargy, jegyek_tantargy)) diakok[nev] = jegyek # Összes tantárgy set osszes_tantargy = set() for jegyek_lista in diakok.values(): for tantargy, _ in jegyek_lista: osszes_tantargy.add(tantargy) print("\nÖsszes tantárgy az osztályban:", osszes_tantargy) # Tantárgyhoz hány diák tantargy_darab = {} for tantargy in osszes_tantargy: count = 0 for jegyek_lista in diakok.values(): for t, _ in jegyek_lista: if t == tantargy: count += 1 break tantargy_darab[tantargy] = count print("\nDiákok száma tantárgyanként:", tantargy_darab) # Diákok átlagai, legjobb jegyek, 1-es jegyek print("\nDiák statisztikák:") for nev, jegyek_lista in diakok.items(): print(f"\n{nev}:") for tantargy, jegyek_tantargy in jegyek_lista: print(f" {tantargy}: átlag={atlag_diak(jegyek_tantargy):.2f}, legjobb={legjobb_jegy(jegyek_tantargy)}") if egyes_jegy(jegyek_tantargy): print(" Figyelem: van 1-es jegy!") ---- ==== Osztályok ==== * Osztály (class): Sablon/tervrajz objektumokhoz. * Objektum (instance): Konkrét példány az osztályból. * Attribútum: Objektum tulajdonsága (self.nev, self.ev). * Metódus: Objektumhoz tartozó függvény (def metodus(self): ...). * Konstruktor: __init__ – automatikusan meghívódik objektum létrehozásakor. * Öröklődés: Egy osztály átveszi más osztály tulajdonságait és metódusait. * Felülírás: Gyerek osztály felülírja a szülő metódusát. **Egyszerű példa:** class Auto: def __init__(self, marka, ev): self.marka = marka self.ev = ev def bemutatkozik(self): print(f"Ez egy {self.marka} típusú autó, {self.ev}-es évjárat.") auto1 = Auto("Toyota", 2020) auto1.bemutatkozik() **Öröklés:** class Jarmu: def __init__(self, marka): self.marka = marka def bemutatkozik(self): print(f"Jármű: {self.marka}") class Auto(Jarmu): def __init__(self, marka, ev): super().__init__(marka) self.ev = ev def bemutatkozik(self): print(f"Autó: {self.marka}, évjárat: {self.ev}") auto2 = Auto("Audi", 2021) auto2.bemutatkozik() **1. feladat:** Diák osztály * Attribútumok: nev, eletkor, jegyek (lista) * Metódusok: jegyet_hozzaad, atlag, legjobb_jegy class Diak: def __init__(self, nev, eletkor): self.nev = nev self.eletkor = eletkor self.jegyek = [] def jegyet_hozzaad(self, jegy): self.jegyek.append(jegy) def atlag(self): if len(self.jegyek) == 0: return 0 return sum(self.jegyek)/len(self.jegyek) def legjobb_jegy(self): if len(self.jegyek) == 0: return None return max(self.jegyek) # Példa diak = Diak("Anna", 16) diak.jegyet_hozzaad(5) diak.jegyet_hozzaad(4) diak.jegyet_hozzaad(3) print(diak.nev, "átlaga:", diak.atlag()) print(diak.nev, "legjobb jegye:", diak.legjobb_jegy()) 2. feladat: Banki számla * Attribútumok: tulajdonos, egyenleg * Metódusok: betesz, kivesz, egyenleg_lekerdez class BankSzamla: def __init__(self, tulajdonos, egyenleg=0): self.tulajdonos = tulajdonos self.egyenleg = egyenleg def betesz(self, osszeg): self.egyenleg += osszeg def kivesz(self, osszeg): if osszeg <= self.egyenleg: self.egyenleg -= osszeg else: print("Nincs elég pénz!") def egyenleg_lekerdez(self): return self.egyenleg # Példa szamla = BankSzamla("Bence", 1000) szamla.betesz(500) szamla.kivesz(200) print(szamla.tulajdonos, "egyenlege:", szamla.egyenleg_lekerdez()) 3. feladat: Állat öröklődés: * Szülő osztály: Allat (attribútum: nev) * Gyerek osztályok: Kutya, Macska (metódus: hangot_ad) class Allat: def __init__(self, nev): self.nev = nev class Kutya(Allat): def hangot_ad(self): print(f"{self.nev} ugat: Vau-vau!") class Macska(Allat): def hangot_ad(self): print(f"{self.nev} nyávog: Miau!") kutya = Kutya("Bodri") macska = Macska("Cirmi") kutya.hangot_ad() macska.hangot_ad() **4. feladat:** Könyv osztály * Attribútumok: cim, szerzo, oldalszam * Metódus: bemutatkozik class Konyv: def __init__(self, cim, szerzo, oldalszam): self.cim = cim self.szerzo = szerzo self.oldalszam = oldalszam def bemutatkozik(self): print(f"{self.cim} ({self.szerzo}), {self.oldalszam} oldal") konyv = Konyv("Python alapok", "Kovács Péter", 250) konyv.bemutatkozik() 5. feladat: Jármű osztály + Auto és Motor * Szülő: Jarmu (típus, ev) * Gyerek: Auto, Motor * Metódus: bemutatkozik class Jarmu: def __init__(self, tipus, ev): self.tipus = tipus self.ev = ev class Auto(Jarmu): def bemutatkozik(self): print(f"Autó: {self.tipus}, évjárat: {self.ev}") class Motor(Jarmu): def bemutatkozik(self): print(f"Motor: {self.tipus}, évjárat: {self.ev}") auto = Auto("BMW", 2022) motor = Motor("Yamaha", 2021) auto.bemutatkozik() motor.bemutatkozik()