2020. október 13., kedd

Fájlok beolvasása -Python

 Nem számít, hogy milyen lassan megyünk, egészen addig, amíg meg nem állunk.

Ha azt érezzük, hogy a célt, amit kitűztünk magunk elé semmiképp sem tudjuk elérni, 

akkor ne a célunkat módosítsuk, hanem gondoljuk újra a lépéseket, amelyekkel eljutunk odáig.

- Konfúciusz -

hozzuk létre külön text fájlként

"""Hozzunk létre egy 4 soros versikét, egy text fájlban, majd 
olvassuk be az open beépített függvénnyel, kezdjük a nyitó és a 
záró close sorral, hogy biztosítva legyen, ha megnyitottuk le is 
legyen zárva. E kettő közé fogjuk a többi kódot írni """
file = open('20mondasok.txt', 'r')  #read 
print(file)
"""amikor kiprinteljük ezt kapjuk: 
<_io.TextIOWrapper name='20mondasok.txt' mode='r' encoding='cp1250'> 
mivel ez tartalmazza ezeket a szavakat.  Ha ki akarjuk írni txt 
fájlba akkor meg kell adnunk, hogy 
sor = file.readinline() és print(sor)"""
file = open('20mondasok.txt', 'r')
sor = file.readline()
print(sor)
"""ezzel kiírja nekünk az első sort, viszont a karakter kódolása
 nem megfelelő, mimvel nem ismeri fel az ékezetes betűt.
 Ezt úgy tudjuk kiküszöbölni, hogy a file = open('20mondasok.txt', 'r',
 encoding='utf-8') sorba megadjuk az encoding ipari sztenderdet."""
file = open('20mondasok.txt', 'r', encoding='utf-8')
sor = file.readline()
print(sor)
"""így máris szépen be tudja olvasni nekünk az á és í ékezetes betűket,
 ezért ha magyar szöveget akarunk beolvastatni, meg kell adni neki az 
utf-8 as karakter kódolást"""
file = open('20mondasok.txt', 'r', encoding='utf-8')
sor = file.readline()
print(sor.strip())
file.close()
"""Ezzel az első sort tudjuk kiíratni, viszont ha szeretnénk 
kiíratni a sorokat, megtehetjük a for loopal:"""
file = open('20mondasok.txt', 'r', encoding='utf-8')
for sor in file:
    print(sor.strip())
file.close()
# vagy a while-al
file = open('20mondasok.txt', 'r', encoding='utf-8')
sor = file.readline()
while sor:
    print(sor.strip())
    sor = file.readline()
file.close()

"""A különbség az az, hogy a while esetén be kell olvasnunk egy sort.
Tehát, egy több száz vagy ezer sorból álló szöveget kell beolvastatnunk,
 gyakorlatilag mindegy, hogy a for loop-ot vagy a while ciklust használjuk.

Másik módszer a with kontextus menedzser segítségével, megadva a fájl 
nevével, ugyanúgy for ciklust használva, a nyomtatásánál a strip 
kiküszöböli a felesleges sorközöket: """
with open('20mondasok.txt', 'r', encoding='utf-8') as file:
    for sor in file:
        print(sor.strip())
        
"""látható, hogy a with kontextus menedzser magától lezárja a fájl,
 nincs szükség a lezáró sorra, nem kell a file.close() metódust
 meghívnunk. Ezért ennek egyszerűbb is a használata fájl megnyitásra. 
Ha a 20mondasok.txt fájlt egy másik mappába helyezzük át, 
akkor nem fog lefutni, mert nem fogja megtalálni. 
Ilyen esetben meg kell adni neki az útvonalat, hogy hol találja 
meg a txt fájlt. pl: ('mappa/20mondasok,txt')"""

"""Vizsgáljuk meg a következő metódusokat a read a readline és
 a readlines metódusokat:"""

with open('20mondasok.txt', 'r', encoding='utf-8') as file:
    sor = file.readline()
print(sor)

"""ha lefuttatjuk látható, hogy csupán egy sort fog beolvasni,
 de folytathatjuk egy while új sorral"""
with open('20mondasok.txt', 'r', encoding='utf-8') as file:
    sor = file.readline()   
    while sor:
        print(sor.strip())  #olvassa be a sort,
        sor = file.readline()  #majd menjen a következő sorra
        
""" a 'sor' mindig egyenlő esz egy sorral a fájlból, majd kiprinteljük,
 és az utána követekző sor vegye fel a következő sort és olvassa be
 mint stringet. Tehát a readline csak soronként olvassa be a textet.
 Először az első sort, majd a másodikat és így tovább. 
A következő a readlines a readlines többes száma. """
with open('20mondasok.txt', 'r', encoding='utf-8') as file:
    sor = file.readlines()
print(sor)

"""lefuttatva megfigyelhetjük, hogy listába rendezve olvassa be a sorokat.
 A lista első eleme a szöveg első sora lesz, \n jelzi a sor végét,
 ami az new line karakter jelzése, melyet automatikusan hozzá ad. 
Ezt az \n -t is tartalmazza a txt fájl, csak nem látjuk, viszont
 a programunk beolvassa. 
Tehát a readline soronként olvassa be a txt fájlt, a readlines
 pedig az egész blokkot. 

Nézzük meg a read - et, hogyan fog viselkedni """
with open('20mondasok.txt', 'r', encoding='utf-8') as file:
    sor = file.read()
print(sor)

""" a read egyszerre fogja beolvasni nekünk az egész fájl tartalmát,
 mint string objektumot. 
Amíg kis méretű fájlokról van szó, addig nincs is gond azzal, 
ha egyszerre olvastatjuk be. (Nemcsak txt hanem xml fájlokat is 
beolvastathatunk.) Egy akár több millió soros fájl esetén a read 
már nem jöhet szóba, mivel feleslegesen terhelné le a memóriát, 
és az sem biztos, hogy be tudja olvasni. Ha több ezer soros fájlt 
kell beolvastatnunk, akkor mindenképpen érdemes soronként 
beolvastatni a readline segítségével. Ha csak pár tíz vagy pár 
100 sorot szeretnénk beolvastatni, akkor nyugodtan használhatjuk 
a read metódust.  """

Scope - Python

 """VAriable Scope, avagy a változók láthatósága és élettartama

A pythonban vannak a lokális és vannak a globális változók. 
A lokális azok általában egy függvényhez, vagy osztályhoz tartoznak. 
Tehát ún. funciton scope vagy class scope. 
A globális változók azok a modulhoz tartoznak. Modulnak számít 
pl egy python fájl, pl ez a 19scope.py ez egy python modulnak számít, 
és ennek a fájlnak ennek a modulnak megvan a saját scope-ja, un. modul scope.
 Ezen a scope-n belül, bármilyen változót, amit létrehozunk, az globál
is változónak számít a modulon belül. 
Elsőnek nézzük meg a funciton scope működését: a két változónk az a 
és a b a function scope-hoz tartozik, tehát a függvénynek a scope-jához. 
Ez az a és b kizárólagosan ennek a függvénynek a testén belül látható 
és elérhető"""
def test():
    a = 12
    b = 15
    print(a, b)
    
test() #meghívom, lefuttatom
print(a, b) # függvény testén való kiíratás nem fog lefutni
""", az a és b kizárólag ennek a függvénynek a testén belül látható és
elérhető, ha megpróbálom a fv.testén kívül kiíratni,hibát is jelez vissza
pirossal alá is húzza, mert nem találja ezt a két értéket az a és b-t, 
mert el vannak rejtve a függvénynek a testében. "a is not definied "


Élettartam: Amikor létre hoztam az a és b változót, és amikor a 
függvény meghívjuk, akkor ez a függvény létre hozza az a és b nevezetű 
változót, majd hozzá rendeli ezt a két értéket a 12-t és a 15-öt, 
majd kiprinteli őket. Amint ez a függvény véget ért, tehát lefutott, 
ez az a és b változó törlésre kerül a memóriából. Tehát ezek csak 
addig élnek amíg ez a függvény le nem fut. Amint vége ennek a 
függvénynek ez a két változó törlődik. 
Tehát csak a függvény testén belül léteznek, láthatók, és az
 élettartam, csak addig léteznek, amíg a függvény le nem fut, 
abba nem hagyja a végrehajtást.Ez volt a function scope, most
 pedig nézzük meg a modul scope - t """

"""Modulscope az a az egész modulon belül látható és ez az a 
nem egyenlő az előzőekben látott a-val, ami a függvény testében 
helyezkedik el."""
= 78 #ez az a az egész modulon belül látható, 
"""modulnak számít minden egyes python file, aminek a fájl 
kiterjesztése py, tehát ez az a bárhol a modulon azaz a fájlon 
belül elérhető, de fontos, hogy ez az a=78 nem egyenlő a függvény 
testében elhelyezkedő a=12-vel."""

def test():
    a = 12
    b = 15
    print(a, b)
    
test()
print(a)
"""a kiíratom a globális a-t, kiírja, hogy 78, mert a lokalis 
a az még mindig 12 lesz, tehát a függvényben lévő a nem írta felül,
 a globalis változót. Tehát a lokális függvényben elhelyezkedő a az
 egy külön változónak számít. Ha ezt a globális a=78-at akarom átírni 
a függvény testén belül, akkor meg lehet neki mondani a függvényen belül,
 hogy global=a:"""
= 78

def test():
    global a
"""itt azt mondjuk ezzel a paranccsal, hogy a globalis a-t irja 
felül és ne hozzon létre egy új változót a memóriában, hanem a már 
meglévő a változót írja felül. """
    a = 12
    b = 15
    print(a)
    
test()
print(a)  #ha most kiíratjuk, most a globalis a erték felveszi a lokál értéket
#Futtasuk le:
= 78

def test():
    global a
    a = 12
    b = 15
    
test()
print(a)
#adjunk hozzá egy b változót is:
= 78
= 47

def test():
    global a, b
    a = 12
    b = 15
    print(a, b)

test()  #meghívjuk kiírja, hogy 12 és 17
print(a, b)#szintén 12, 15öt ír ki, de amint elveszem a 
global a,b-t 78-at,47-et
""" Ez volt a modul scope. 
Fontos megemlíteni, hogy a for és while ciklusoknak nincs 
saját scope-juk, 
ha létre hozok egy for ciklust, akkor az i átfolyik a globalis
 scope-ba. Más nyelvekben, ha létre hozunk egy for loopot azon 
belül az indexet, vagyis az index változót, -ami lokális a for loophoz, tehát amint lefutott a for loop ez az i törlődik a memóriából  - ez a pythonban átfolyik a globális névtérbe úgymond a modul scope-ba  és azután, hogy lefutott a for loop az i még mindig elérhető"""
for i in range(5):
    pass

print(i)
"""tehát, ha ezt lefuttatjuk kiírja a 4-et, nem is ad hibát. 
Ha ebben létre hozok egy b változót b=54,más program nyelvekben ez 
lokális lenne a for loophoz, de a pythonban ez a b ugyanúgy ahogyan
 az i átfolyt a globális névtérbe, vagyis a modul scope-ba, és a for loop 
testén kívül is elérhető: ha lefuttajuk kiírja 54"""
for i in range(5):
    b=54
    pass

print(i)
print(b)

"""ugyanez érvényes a while ciklusokra is, tehát, ha a while ciklus
 testében lértre hozunk egy változót, az ugynaúgy átfolyik a globalis
 vagy  a modul scope-ba, és szintén elérhető, ezt a legjobban úgy
 tudjuk kijavítani , ha ezeket bele tesszük egy függvénybe"""
def test2():
    for i in range(5):
        b = 54
        pass

print(i)
print(b)
test2()
"""itt már hibát jelez, mert az i b aláhúzásra került, ha a printet 
behúzom akkor is elérhető a for loop testén kívül"""

#Akárcsak a for illetve a while esetében az if condicionálisnak 
sincsen saját scope - ja:
if True:
    c = 10

print(c)
"""A 10 elérhető, noha az if kondicionális testében hoztuk létre,
 de úgy néz ki, hogy az if kondicionálisnak sincs saját scopja, 
tehát ez a c változó átfolyik továbbra is a modul scope-ba, 
akárcsak a for illetve a while ciklusnál. 
Viszont itt is kiküszöbölhető, hogy az if-et bele tesszük egy függvénybe."""
def test():
    if True:
        c = 78

print(c)

"""Így már nem fog működni, mert ez a c benne van ennek a 
függvénynek a scope-jába. Ha megpróbáljuk lefuttatni hibát fog jelezni.
Tehát a függvény scope, modul scope és az osztály scope amik a
 legfontosabbak lesznek. Amint a függvény lefutott, a függvény testében
 létrehozott változók megszűnnek létezni, törlődnek a memóriából, 
ezt fontos megjegyezni.  Ugyanakkor a modul scope-on belül létrehozott
 változók, csak a modulon belül elérhetők, (kivéve, ha importáljuk 
a modult egy másik modulba)."""

Beépített függvények - Python

 """Számos beépített függvény létezik a pythonban, ezek közül a leggyakoriabbakat nézzük meg. 

https://docs.python.org/3/library/functions.html
abs(x) Egy szám abszolút értékét adja vissza.Pl:"""
print(abs(-78))  #megadja a szám abszolút értékét a 78-at

"""Az enumerate() függvényt ciklusokban használhatunk, és 
ahol a thing egy iterátor vagy  egy sorozat lehet. 
Visszatérési értéke egy itarátort, ami (0, thing[0]), 
(1, thing[1]), (2, thing[2]), stb.. Például gyakran előfordul,
 hogy egy lista minden elemét valamilyen számítás segítségével 
-amely függ a lista aktuális elemeitől- módosítani szeretnénk. """

nevek = ['Xena', 'Bozsi', 'Vica', 'Emi', 'Ildi', 'Zsuzsi', 'Evi']
for index, nev in enumerate(nevek):
    print(index, nev)
"""ha lefuttatjuk, láthatjuk, hogy tulajdoképpen megszámozta a 
listánk elemeit, a Xena 0, a Bozsi 1 stb. Tehát az enumerate 
két értéket ad vissza, az első az index szám, ami ebbe a változóba 
fog kerülni, a második érték pedig maga a név. Ez a függvény 
elég gyakran kerül felhasználásra."""

"""float(x) Az x számot lebegõpontos számmá konvertálja. 
Ez a függvény még akkor is hasznos, ha stringként adunk 
meg neki számot, vagy ha egy fájlból stringként kerül 
beolvasásra, de valamilyen matematikai műveletet akarunk 
végre hajtani rajta, szépenn átkonvertálja a stringet float típussá """
print(float(10))
print(float('147.879'))

"""hex(x) A számot hexadecimális sztringgé konvertálja."""
print(hex(125))  #vissza adja 0x7d

"""int(x) Egy számot sima egész számmá (integer) konvertál."""
print(int(24.78))  #levágja a .78-at és egész számot a 24-et 
adja vissza
print(int('87'))  #ha stringet adunk meg, azt is átkovertálja 
int típussá


"""len azaz lenght kiírja hány db érték van a listán, de ha stringet 
adunk meg annak is kiírja, hány karakterből áll, bele számolja a 
szóközöket is, tehát használhatjuk stringeken is és listákon is."""
print(len("még nyílnak a völgyben a kereti virágok"))


""" max(s) Egy nem üres szekvencia legnagyobb elemét adja vissza 
értékül. Példánkban kiírja a legnagyobb számot: a 102-t """
print(max(18,74,102,58,22,))

"""min(s) Egy nem üres szekvencia legkisebb elemét adja vissza 
értékül, jelen példánkban a 18-at"""
print(min(18, 74, 102, 58, 22,))

"""pow(x, y [, z]) x y [modulo z] hatványát adja vissza értékül. 
Hatványozásra már láttunk példát a print(2**10) stb. példán 
keresztül, de ezt megtehetjük a power azaz pow függvénnyel is,
vissza adja a 2 a tizediken értékét az 1024-et. """
print(pow(2,10))

"""range(start [,end [, lépés]])
A >= start és < end értékek közötti egész számokból képzett 
listát ad vissza értékül.
Egy argumentummal, lista 0-tól ..<argumentum>-1 értékig.
Két argumentummal, lista <start> értéktõl..<end>-1 értékig.
Három argumentummal, lista < start > értéktõl < end > értékig < lépés > -sel. """
print(range(100)) #ha listává akarom konvertálni:
print(list(range(100))) #0-tól 99 ig fog számokat megadni
print(list(range(50, 100, 2)))#ebben az esetben 50-től 
számol és kettesével

"""round(x,n=0) x lebegõpontos értékét a tizedes pont 
után n számjegyre kerekítve adja vissza. """
print(round(12.65546464, 2))  #ebben az esetben vissza 
kapjuk a 12,66-ot

"""sum(iterable, start=0) Visszaadja a két elem összegét. 
Csak szám típusú paramétert lehet neki megadni, tehát nem 
lehet például stringek konkatenálására használni."""
szamok = [1, 5, 6, 8, 54, 54, 54, 65, 87]
print(sum(szamok))

Függvények - Python

 """A függvény meghatározása nagyon egyszerű: ez egy kis 

kódrészlet, ami valami specifikus feladatot lát el. 

A függvény az utasítások olyan blokkja, ami végrehajtja 

a benne meghatározott művelet(ek)et, és miután lefutott, 

tetszőlegesen újra hívható, futtatható. A függvények modulárisabbá, 

áttekinthetőbbé teszik a kódot, lehetővé téve ugyanazon kódrészlet 

(függvény) újra és újra használatát.

A Python számos beépített függvénnyel rendelkezik, amikkel 
már megismerkedtünk, többek között:
print (), ami adatokat nyomtat a terminálra
int (), ami egy karakterlánc vagy szám adattípust egész a
dattípussá konvertál
len (), ami egy objektum (pl. string) hosszát adja vissza
A függvénynevek zárójeleket tartalmaznak, és tartalmazhatnak 
paramétereket."""

nevek1 = ['Xena', 'Bozsi', 'Vica', 'Emi', 'Ildi', 'Zsuzsi', 'Evi']
nevek2 = ['Pityu', 'Ati', 'Peti', 'Bence', 'Feri']
#ha ezt ki akarom íratni megthetem egy for ciklussal:
for nev in nevek1:
    print(nev) #ha lefuttatom akkor kiírja a neveket
for nev in nevek2:
    print(nev) # a masodik for loop kiprintelte a nevek 2 listából
#ennek van egy egyszerűbb módja is, ahelyett, hogy két for loopot írnánk

"""def nev_printer():
        pass #egyenlőre ne csináljon semmit, 
a függvény definíciónál a de kulcsszóval kezdjük, ami 
defináljon egy függvényt, aminek a neve az lesz hogy nev 
alsó aláhúzás printer, a függvény definiciónál a kulcsszó def, 
majd space és a függvény neve, a függvény neve akárcsak a 
változó neve lehet betű, szám, alsó aláhúzás, de nem kezdődhet 
számmal a függvény neve, ugyanazok a szabályok, mint a változóknál. 
A nev printernek a sima zárójelbe megadok egy bemeneti paramétert, 
ami a nev_lista lesz"""
def nev_printer(nev_lista):
    for nev in nev_lista:
        print(nev)
"""tehát létre hoztunk egy függvényt, ami végső soron ugyanazt 
csinálja, amit az előző kettő együtt, de ahelyett, hogy copy 
paste-nénk ezt a for loopot, akárhányszor csak ki akarom íratni 
a listában a benne lévő elemeket, már csak a függvényt a nev_printer -t 
kell meghívnom. A függvény meghívása úgy történik, hogy invokáció:
nev_printer(nevek1) function invocation ezzek meghívjuk
nev_printer(nevek2)
A függvények olyan utasításkód blokkok, amelyek egy programon 
belül hajtanak végre műveleteket, elősegítve a kód újrafelhasználhatóságát 
és moduláris használatát."""

"""hozzunk létre két változót, és egy egyszerű függvénnyel adjuk 
össze, ami olyan függvény aminek nincs paramétere, nincs bemente. 
A függvényeket a def szóval tudjuk definiálni."""
= 10
= 20
def osszeadas1():
    print(+ b)
osszeadas1()
    
def osszeadas2(a, b, c = 4):
    return a + b + c

print(osszeadas2(45, 25))

osszeg = osszeadas2(45, 25)
print(osszeg)

""" A „return” kulcsszót arra használhatjuk, hogy segítségével
 kilépjünk a függvényből, és a főprogram azon pontjára kerüljünk
 vissza, ahol a hívás történt. A „return” tartalmazhat 
visszatérési értéket is, ami például egy számítás eredménye lehet."""
    
def osszeadas3(*args):
        return sum(args)

print(osszeadas3(10,65,65,65,65,45,87,65,65))

#ha változó számú paramétert akarok megadni, akko jelölhetem *- al 
és arguments. 
#az args helyett bármit megahdatok, akár azt is hogy beka

""" Arguments paraméterek, az összeadás3 függvény 0 vagy akár 
több paraméteret is fogadhat. A return sum össze fogja adni az 
összes számot, ami ott található, bármennyit bele írhatunk. """

def udvozelesek(*args):
    koszones = "ennyi féle köszönés létezik"
    for k in args:
        koszones += k
        koszones += ''
    #print(koszones)
    print(koszones[0:len(koszones)-2])
udvozelesek(' szia', 'szevasz', 'hello', 'szervusz')

""" megadunk több üdvözlést, 4 példával, ha helyközt szeretnénk 
a kiíratás során, akkor a helyközt hozzá kell fűzni, egy empty 
stringet és egy vesszőt is hozzá fűzhetünk koszones += ', ' ezzel. 
De ha így íratjuk ki, akkor a végén lesz még egy fölösleges vessző, 
és egy szóköz. A length-et már használtuk listáknál, a len-t ha 
stringgel használjuk, vissza adja, mennyi karakter van ebben a stringben, 
ennek a segítségével a kiíratás végét megadhatjuk, hogy a vessző és 
a szóköz már ne kerüljön kiírásra, vagyis a -2-vel. """

""" Szeretnénk printelni a neveket, de ami nagy betűs, azt hagyja úgy, 
de de a kis betűket írja át nagy betűre. Erre alkalmas az upper 
metódus, amelyet csak stringeken használhatunk:  print(nev.upper()); 
Tegyük fel, hogy a slistába bekerül egy integer, akkor abban az 
esetben hibát ad. Ezért for loopba bele rakhatunk egy isitance 
parancsot, amely megkérdezi, hogy az adott név pl string típusú e,
 ha igen akkor printelje ki nagybetűvel. 
if isinstance(nev,str) de ha nem string típus mit tegyen? else: 
print('nem string típus, hanem ' + str)
Enélkül hibát ad, ha number kerül a listára, viszont ez az 
isinstatnce megkérdi, hogy az első iterációban a név string e, 
ha igen akkor printelje ki, mégpedig nagy betűvel"""
nevek1 = ['Xena', 'Bozsi', 'Vica', 'Emi', 'Ildi', 'Zsuzsi', 'Evi', 10, True]
nevek2 = ['Pityu', 'Ati', 'Peti', 'Bence', 'Feri']

def nev_printer(nev_lista):
    for nev in nev_lista:
        if isinstance(nev, str): 
            print(nev.upper())
        else:
            print('nem string típus, hanem: ' + str(type(nev)))

nev_printer(nevek1)
nev_printer(nevek2)
"""isinstance(object, classinfo) állásban van
 Igazzal tér vissza, ha object a classinfo argumentum egy példánya, 
illetve ha annak egy közvetlen vagy inderikt leszármazottja. 
A classinfo lehet objektumokat tartalmazó tuple is, ebben az 
esetben igazat ad a függvény, ha valamelyik objektumra teljesül 
az isinstance() reláció."""

12B 2024.04.16. helyettesítés

 Feladatokat ezen a linken találjátok: http://history.itwebguide.nhely.hu/tori_teszt.html az eredményről a képernyőképet kérem :D