#!/usr/bin/env python # coding: utf-8 # Open In Colab #

# # #

# # #

# # # # # Python kezdő lépések, változók # # # # # --- # # Kezdő lépések Pythonban, ismerkedés a változókkal # # # Ebben a notebookban rövid példákon keresztül megismerkedünk a Python nyelv szintaxisával, # és néhány alapvető adattípussal és adatstruktúrával. # # Később ezeket és az ezekből származtatott adatstruktúrákat fogjuk lépten-nyomon használni. # # # # ### Sikeres nyelv: # # pl: Uber, Paypal, Google, MS Azure, Facebook, Instagram, NASA, Netflix, Dropbox, Reddit stb. # # # # # ### Alap jellemzők # # # - Guido van Rossum Holland programozó találta ki 1989 karácsonyán # - A nevét nem a hüllőről kapta, hanem a brit komédiasorozatról, a Monty Pythonról # - Nem gyors, de könnyen bevethető, sok beépülő modul segít bennünket # - A szkriptfileokat .py végződéssel szokás ellátni # - Bytekódot generál és ezt futtatja # - Futtatás közben el is menti .pyc végződésű filenévvel # - Automatikusan generálja # - Alapból interaktív interpreter # - Változók értékeit kiírja ha hivatkozunk rá # - Az értelmező szkriptfileokat futtat, és sorrol sorra halad... # - Szöveg elemzés, ML (machine learning), azaz a gépi tanulás és a big data berobbanásával lehet vele nagyot alkotni # # # # --- # #

# # #

#

# # #

#

# # #

# # # ## Programozási alapfogalmak # # # • Algoritmus: Valamely feladat megoldására alkalmas véges hosszú lépéssorozat. # # • Adatszerkezet: Adatelemek tárolására és hatékony használatára szolgáló séma (példa: lista). # # • Programozási nyelv: Szigorú szabályokra épülő nyelv, melynek segítségével az ember képes a számítógép felé kommunikálni az utasításait. # # • Programozás: Algoritmusok és adatszerkezetek megtervezése illetve megvalósításuk valamilyen programozási nyelven. # # --- # # ### Objektum tipusok, jelelmzők # # # # #### Iterálható objektum: # Olyan objektum, amelyből más objektumokat tudunk kinyerni. A kiolvasott objektumokat a továbbiakban elemnek fogjuk nevezni. Az elemeket az objektumon történő iterálással, más kifejezéssel az objektum bejárásával egymásután sorban elérhetjük. # # Pl.: listák, bájt-tömbök, karakterláncok, sokaságok, szótárak, generátorobjektumok. # # # #### Indexelhető objektum: # Az ilyen objektum elemeit a természetes számok sorozatának 0-val induló és eggyel növekedő tagjaival párosíthatjuk, s az ezekre történő hivatkozással (indexeléssel) az elemeket el is érhetjük. Ha egy objektum indexelhető, akkor iterálható is, de egy iterálható objektum nem feltétlen indexelhető, az indexelhetőség egy erősebb megszorítás. # # Pl.: listák, karakterláncok (string), sokaságok (tuple-k), bájt-tömbök (bytes) stb. # # # #### Nem indexelhető objektum: # # Pl.: készletek(set), szótárak(dir), egész számok stb. # # # # #### Leképező (mapping) szótár típusú objektum: # Ezen objektum elemeit kulcs-érték párok alkotják. Egy elemhez tartozó értéket a kulcs indexszerű megadásával érhetünk el. Kulcs nagyon sokféle objektum lehet, például számok, karakterláncok stb., és ezek keverten is alkalmazhatók. Ezek az objektumok a kulcsok szerint iterálhatók. # # Példa: szótár(dir). # # --- # # ### Progrmanyelvi jellemzők # # # • A program blokkokat a sorok behúzásával jelöljük. # A fordított perjel (\) segítségével egy hosszú sor kétfelé törhető. # # # • A for és while szerkezetekhez tartozhat egy else ág is, amely akkor hajtódik végre, ha a ciklustörzsből nem történt kilépés a break utasítással. # # # • enumerate (magyarul "felsorol"): Az iterálható bejárható objektum elemeit szolgáltatja egymásután, és minden elemhez ad egy sorszámot is, a sorszámozás 0-val kezdődik. Ha az objektum indexelhető, akkor a sorszám megegyezik az indexszel. # # # # • len(bejárható): A bejárható objektum elemszámát adja meg. # # • range(n): 0-tól n-1 -ig szolgáltatja az egész számokat egymásután. A range(m,n,l) kifejezésben az egész számok sorozata m-től indul, n-1-ig tart, és l a növekményük. A range(m,n) esetén a lépésköz 1 lesz. # # # • True, False: Az igaz és a hamis értékek. # # --- # # In[ ]: ## Automatikus összefűzés (nincs külön operátor) print ('Kicsi' " Dani " """játszik""" ) ## Kicsi Dani játszik // közvetlen összefüzés print ('Nagyobb', " Dani ", 2020, """-ban is \ játszik""" ) ## Nagyobb Dani 2020 -ban is játszik // vesszőnél space is megjelenik + töbsorba tördelés a \ jel # # --- # # ## A Jupyter Notebook környezet # # # AJupyterNotebook egy WEB böngésző alapú interaktívm unkakörnyezet. # # Elsődlegesen a Pythonnyelvhez fejlesztették ki, de más programozási nyelvekkel is használható. # # Egy notebook cellákból áll, a cellák lehetnek szöveges (Markdown) vagy kód típusúak. # # A kódcellákat le lehet futtatni, akár többször is egymás után. A futtatás eredménye megjelenik az adott kódcella utáni kimenetben. # # # # ### A notebook használata kétféle üzemmódban történik: # # # #### Parancsmódban # tudjuk elvégezni a cellaszintű műveleteket (pl. új cella beszúrása, cella törlése, cellák mozgatása, lépegetés a cellák között stb). # # ##### Néhány hasznos billentyűparancs: # – b: Új kódcella beszúrása az aktuális cella után. # – m: Az aktuális cella típusának átállítása szövegesre. # – dd: Az aktuális cella törlése. # – Enter: Átlépés szerkesztőmódba (az aktuális cella tartalmának szerkesztése). # # #### Szerkesztómódban # tudjuk szerkeszteni a cellák tartalmát. # # # ##### Néhány hasznos billentyűparancs: # – Ctrl+Enter: Az aktuális cella futtatása. # – Esc: Visszalépés parancsmódba. # # # A billentyűparancsokról a Help / Keyboard Shortcuts menü ad részletesebb leírást. # # --- # # # ### Változó névadásnál figelyni kell arra, hogy: # # - az értelmező nagybetű, kisbetű érzékenyen különbözteti meg őket # - vannak nyelvi azonosítók, ezek fentartott szavak amelyekt ne használjunk változó elnevezéskor # # # # # ### Karakterkészlet / Pszeudó-komment a file elején (alapértelmezet az utf-8) # # # ` #-*- coding: ISO-8859-1 -* # # ` #-*- coding: ISO-8859-2 -* # # ` #-*- coding: UTF-8 -* # # # # In[ ]: ## Csak konzol alkalmazásnál így töröljük le a képernyőt import os os.system('cls') # For Windows # os.system('clear') # For Linux/OS X # --- # # # ## A Python adattípusai # # ### Számok: # Integer # i=5 # # long # i=5L # # Float(lebegőpontos) # f=5.0 # # Komplex szám # 5+4j # # # ### Logikai / boolean: # b=True, # b=False # (nagy kezdőbetű!) True, False # # # ### Szöveg /string # # String # szoveg='Péda szöveg' # # # Bytes # b'akarmi' → (sztring) # bytes('talicska') → (sztring) # # # Bytearray: ua. mint bytes, csak módosítható # bytearray([66, 67, 68]) → bytearray(b'BCD') # # # List (lista) # l=[ 0, 15, 'beton', i ] (indexelhető, módosítható) # # Tuple (sokaság) # t=( 0, 15, 'beton', i ) (indexelhető, nem lehet módosítani) # # Dictionary (asszoc. tömb) # d= {'beton': 5, 'teherauto': 'KAMAZ'} # # Set (halmaz. készlet) # s={5, 9.9, 'beton'} # Halmazműveletekre (intersect, union, stb.) # 1 elem csak 1x lehet tag! # s.add(4) → {4, 5, 9.9, 'beton'} # # # Frozenset # mint az előbbi, csak nem módósítható # # # --- # # # # ## Az adattípusok dinamikusan (deklarálás nélkül) egyből használhatóak: # # type(1) # # type(1.2) # # type(1.) # # type("Hello") # string: ’ vagy ” vagy """ ill ''' # # type(None) # # type(int) # # # # ### Változók típusának konvertálása: # # Mint minden magasszintű programnyelvben itt is van castolásra lehetőségünk. A castolás # gyakorlatilag a változó eredeti típusát képes megváltoztatni az általunk kiválasztott változó típusra. # # # str(17) # # int("17") # # float("2.5") # # float("1") # # ### Változó rendszer azonosítója # # id(azonosito) # # # # ### Megjegyzések (Comment-ek) # A scriptnyelvek többségéhez hasonlóan a Python kommenteket a  #  karakter definiálja. A  #  karaktertől kezdődően az interpreter a sor végéig kommentként értelmezi a szöveget. # # Egy megjegyzés lehet sor elején, vagy követhet szóközt, tabulátor karaktert, de ha egy karakterlánc (string) belsejébe teszed, az nem lesz megjegyzés (lásd a példában!). A kettőskereszt karakter egy karakterláncon belül csak egy kettőskeresztet jelent. # # A komment csak a programozónak szól emlékeztetőül, vagy más programozók megértését segíti. Noha gyakran elmarad, a kódok rendszeres dokumentálása megjegyzésekkel később (amikor már a kód részleteit a feledés homálya borítja) nagyon kifizetődő lehet. # # --- # # In[ ]: nem_megjegyzes =' # ez itt nem # megjegyzés csak egy sima kettőskereszt karakter # ' print(nem_megjegyzes) # tipusok type(1) type(1.2) type(1.) type("Hello") # string: ’ vagy ” type(None) type(int) # Változók típusának konvertálása # str( 17) int("17") float("2.5") float("1") # Többszörös érték adás var1 = var2 = var3 = 1 var=0 print(var1,' ',var2,' ',var3) print('var1 = ', id(var1),'var2 = ', id(var2), 'var3 = ', id(var3), 'var = ', id(var)) print('---------') var2 = 'lajos' print('var1 = ', id(var1),'var2 = ', id(var2), 'var3 = ', id(var3), 'var = ', id(var)) print('---------') # egyszerre tőbb váltiozó érték beállítása var1, var2, var3 = 1, 2.5, "john" print(var1,' ',var2,' ',var3) # String műveletek str = 'Hello World!' # A string print(str) # megjelenítése teljes stringnek print(str[0]) # megjelenítése első karaktere print(str[2:5]) # megjelenítése harmadiktól az ötödikig print(str[2:]) # megjelenítése a szöveg harmadik karakterétől print(str[:2]) print(str * 2) # megjelenítése kétszer a szövegnek print(str + "TEST") # megjelenítése összefüzéses string # In[ ]: i=303 print (str(i), " - " , 'i' ) print ('i', " - ", str(i)) import unicodedata text = "àéêöhello" text = unicodedata.normalize('NFD', text) print ('t1', text) text = text.encode('ascii', 'ignore') # szöveg ascii-ra kódolása print ('t2', text) text = text.decode("utf-8") # szöveg utf-8-ra kódolása print ('t3', text) # In[ ]: # ez az első megjegyzés SPAM = 1 # ez a második megjegyzés tehetek további #### jeleket de ezeknek már nincs hatása # ... és ez a harmadik. STRING = "# Ez nem megjegyzés, mert idézőjelekben van." # csak innen kezdődik amegjegyzés print(STRING) def fuggveny() : """ ez így megjegyzésként hat és ez több sorban is folytatódhat, de mindig csak a függvény elején álhat""" pass # # --- # # # # ## A Python használata számológépként # # # # A notebookot lehet úgy használni, mint egy sima számológépet (interaktív mod): be lehet írni egy kifejezést, és az kiszámolja az értékét. # # A kifejezések nyelvtana a szokásos: a +, -, * és / műveletek ugyanúgy működnek, mint a legtöbb nyelvben (például Fortran vagy C). # # A zárójeleket értelemszerűen az elvégzendő műveletek csoportosítására, a műveleti sorrend meghatározására használjuk. # # # # # ### Szintaktikai lehetőségek # # egy sor egy utasítás, # vagy egysorba több utasítás, pontosveszzővel elválasztva # vagy több sorba de arészeket \ karakterrel 'ragasszuk össze' # # --- # # In[ ]: i=5 print(i) i=i + 1 print(i) print('-----------Elválasztás-----------') i=5 ; print(i) ; i=i + 1 ;print(i) print('-----------Elválasztás-----------') i = \ 5 print \ (i) i= \ i \ +1 print(i) # --- # ### Program tagolás (strukturálás) behuzással (Indentation) történik # In[ ]: # from __future__ import braces i=5 if i < 10: print(i) i = i + 1 # növel 1-el i += 4 # növel 4-el i *= 2 # megkétszerez print(i) if True: print('Ez egy mindíg igaz állítás') # --- # ### Program műveletek # # # # # ##### A legfontosabb általunk használt operátorok: # (Megnevezés szintaktika megjegyzés) # # Összeadás + Két nem karakter típusú változó összeadása # # Konketenáció + Két sztring összefűzése # # Szorzás * Két nem karakter típusú változó összeszorzása # # Exponenciális ** Az első operandus az alap, a második a kitevő. # # Értékadás = Egy tetszőleges változónak inicializálása # # Egyenlőség reláció == Egyenlőség feltétel megadása, IF elágazás esetén használhatjuk, figyelve, hogy a két operandus azonos típusú # legyen # # Tagadás reláció != Tagadás feltétel megadása, IF elágazás esetén használhatjuk, figyelve, hogy a két operandus azonos típusú legyen # # Tagadás reláció <> Tagadás feltétel megadása, IF elágazás esetén használhatjuk, figyelve, hogy a két operandus azonos típusú legyen # # Kisebb reláció < Kisebb feltétel megadása, IF elágazás esetén használhatjuk, figyelve, hogy a két operandus azonos típusú legyen # # Nagyobb reláció > Nagyobb feltétel megadása, IF elágazás esetén használhatjuk, figyelve, hogy a két operandus azonos típusú legyen # # Kisebb egyenlő <= Feltétel megadása, IF elágazás esetén használhatjuk, figyelve, hogy a két operandus azonos típusú legyen # # Nagyobb egyenlő >= Feltétel megadása, IF elágazás esetén használhatjuk, figyelve, hogy a két operandus azonos típusú legyen # # Logikai És and Két operandus közti és kapcsolatot teremti meg # # Logikai Vagy or Két operandus közti vagy kapcsolatot teremti meg # # Bitenkénti És & Két változó bitjei közötti és művelet # # Bitenkénti Vagy | Két változó bitjei közötti vagy művelet # # Bitenkénti kizáró vagy ^ Két változó bitjei közötti XOR művelet # # Bitenkénti Negáció ~ # # Bináris balra shiftelés << # # Bináris jobbra shiftelés >> # # # in, not in : A két operátorral megkérdezhetjük, hogy egy objektumot egy másik tartalmaz-e. Ezek a konténertípusú objektumok esetén rendkívül hasznosak. Az eredmény bool típusú lesz. # # # is, is not : Ezen operátorokkal az objektumok azonosságát tesztelhetjük. Az eredmény bool típusú lesz. # # # # not, or, and : A Boole-algebra operátorai is jól használhatók állítások megfogalmazására. A programozásban a kétértékű Boole-algebra használatos, amelyben csak két érték van, a hamis és az igaz, és ezek egymás ellentettjei. # # # Nagyon fontos jellemzője a logikai kifejezések használatának, hogy az értelmező az utoljára kiszámított részkifejezés értékét adja eredményként, ami nem feltétlen bool típusú. # # |ESET1|ESET2|ESET3|ESET4| # |---|---|---|---| # |T = T and T | F = F and F | F = F and T | F = T and F | # |T = T or T | F = F or F | T = F or T | T = T or F | # # # # --- # In[ ]: 2 + 2 # In[ ]: 50 - 5*6 # In[ ]: (50 - 5*6) / 4 # In[ ]: 8 / 5 # az osztás egész számok esetén is lebegőpontos eredményt ad. # --- # # ### feltételes értákadás # # `obj = kif1 if tesztkif else kif2` # # Az értelmező először a tesztkif kifejezést értékeli ki, és ha az igaz, akkor a kif1 kiértékelésének az eredményét írja be az obj nevű változóba, ha hamis akkor a kif2 eredményét. # # --- # In[ ]: miez = 2 or 4 ## Ha az első tag nem null akkor annak értékét veszi fel print('2 or 4 -> ',miez) miez = 0 and 5 ## Ha az első tag null akkor annak értékét veszi fel (null lesz) print('3 and 5 -> ',miez) miez= "Van" if miez else "Nincs" ## feltételes értékadás (az előzők is erre jók) print('if else -> ',miez) # In[ ]: a = 'Lajos' print('L betű van az a változóban :','L' in a) print('X betű van az a változóban :','X' in a) # # --- # # az egész számok (pl. 2, 4, 20) alkotják az **int** típust, # # a valós számok (pl 5.0, 1.6) pedig a **float** típust. # # # --- # # # `Pythonban` 3-ban az osztás (/) mindig lebegőpontos értékeket ad vissza. # # lefelé kerekítő egészosztás elvégzéséhez, amellyel egész értéket kapunk, a // operátor használható; # # az osztás maradékához a %-t használhatjuk # # --- # # In[ ]: 17 / 3 # hagyományos osztás lebegőpontos eredménnyel # In[ ]: 17 // 3 # az egészosztással megszabadulunk a törtrésztől # In[ ]: 17 % 3 # a % operátor az osztás maradékával tér vissza # In[ ]: 5 * 3 + 2 # eredmény * osztó + maradék # --- # # A `Pythonban` a ** operátor használható a hatvány kiszámítására: # # --- # # In[ ]: 5 ** 2 # 5 négyzete # In[ ]: 2 ** 7 # 2 7-dik hatványa # # --- # # A `Python` a lebegőpontos számokat bizonyos tekintetben előnyben részesíti az egész számokhoz képest. Azok a műveletek, amelyeknél keverednek a típusok, az egészeket lebegőpontossá alakítják: # # --- # # # In[ ]: 3 * 3.75 / 1.5 # In[ ]: 7.0 / 2 # # --- # # Előfordul néha, hogy egyes függvények `int` típusú változót, várnak és ezt egy `float` típusúból kell előállítanunk. A típusok közti konverziót az int() és float() függvények segítségével tehetjük meg. # # --- # # In[ ]: int(3.1415) # In[ ]: float(42) # # --- # # A `Python` komplex számokat is tud kezelni – a képzetes részt a j vagy J jellel képezhetjük. A komplex számot (valós+képzetes j) formában írhatjuk: # # --- # # In[ ]: 1j * 1J # In[ ]: 3+1j*3 # In[ ]: (3+1j)*3 # In[ ]: (1+2j)/(1+1j) # A komplex számokat gyakran két lebegőpontos számmal ábrázolják: a képzetes és a valós résszel. A `z` komplex számnak ezeket a részeit talán kicsit szokatlan módon (a változó után írt `.` és a megfelelő szó ) a `z.real` és `z.imag` utasításokkal olvashatjuk vissza. # In[ ]: (1.5+0.5j).real # In[ ]: (1.5+0.5j).imag # # --- # # A lebegőpontos és egész típusú konverziós függvények (`float()` és `int()`) nem működnek komplex számokra. # # A komplex-valós átalakításnak több lehetséges módja is van: ahhoz, # hogy egy komplex számból valósat csinálj, használd az abs(z) utasítást, # hogy megkapd a nagyságát, vagy a fennt már megismert `z.real` és `z.imag` utasítást, # ha a valós része vagy a képzetes része kell. # # --- # # In[ ]: float(3.0+4.0j) # ez nem működik // can't convert complex to float # In[ ]: abs(3.0+4.0j) # sqrt(a.real**2 + a.imag**2) # --- # # #### A programjainkban különböző előtagokkal kell jeleznünk, hogy melyik szám rendszerben adjuk meg a számokat: # # decimális: nincs előtag # # bináris: 0b # # hexadecimális: 0x # # oktális: 0o # # # # ord(), amely az argumentumként megadott karakter Unikód táblázat szerinti kódpontját adja vissza, # # chr(), amely a megadott kódpontnak megfelelő karaktert jeleníti meg, ha van ilyen. # # # --- # In[ ]: print(bin(19)) print(bin(0x13)) print(hex(19 + 0b10011 + 0o23)) print(hex( ord('A'))) print(chr(65)) # --- # # ## Változók # # Programozási feladatok során rendszerint változókban tároljuk a hasznos információkat. # A megírt programok nem konkrét számértékekre hanem, változókra hivatkoznak, ez teszi lehetővé, hogy különböző bemeneti adatokra ugyanazt az algoritmust ha kell, többször is lefuttathassuk. # A változók neveit rendszerint az angol ABC betűiből és esetleg néhány egyéb karakterből szokás összeállítani. # # Például: # # ```python # szelesseg # ebben csak betűk vannak # a_folyoso_hossza # ebben a változó névben szerepel a _ karakter is # ``` # # A változók alapértelmezetten lokálisak, tehát csak egy class-on, fuggvényen belül használhatók, ahhoz, hogy a # modulon belül más class is használhassa az adott változót ’’global’’ kiterjesztéssel kell ellátnunk. # # `global global_valtozo` # # A változók neveit célszerű úgy megválasztani hogy később könnyen kitalálható legyen, mit is jelölünk vele. # A legtöbb programozási nyelvhez hasonlóan az egyenlőségjellel (=) lehet értéket adni egy változónak. # Az értékadás után az értelmező újabb utasításra vár, látszólag nem történik semmi: # # --- # In[ ]: szelesseg = 20 magassag = 5*9 # A háttérben viszont létrejöttek a `szelesseg` és `magassag` változók, amikkel most már hasznos dolgokat tudunk művelni. Számítsuk ki például a két változó szorzatát: # In[ ]: szelesseg * magassag # Ha egy változó nincs definiálva (nincs érték rendelve hozzá), és használni próbáljuk, akkor hibaüzenetet kapunk: # In[ ]: n # Az n változót még nem definiáltuk # Interaktív módban az utoljára kiírt kifejezés értéke a _ (alsóvonás) változóban van. Így ha a Pythont asztali számológépként használod, akkor egyszerűbb folytatni a számolásokat, például: # In[ ]: ado = 12.5 / 100 # In[ ]: ar = 100.50 # In[ ]: ar * ado # In[ ]: ar + _ # In[ ]: round(_, 2) #kerekítés 2 tizedes jegyre # # --- # # Ezt a _ változót csak olvasható változóként kezelhetjük. Ne adjunk értéket neki, mert ha adunk, akkor létrehozunk egy független helyi változót azonos névvel, amely meggátolja a beépített változó elérését, amely mágikus módon viselkedik. # # (Ha egy globális változó nevével létrehozunk egy helyi változót, akkor az értelmező a helyit használja.) # # # A notebookban az előző eredményen kívül jóval korábbi eredményekre is hivatkozhatunk. Például 1. parancs kimenetére a következőképpen: # # --- # # In[ ]: Out[1] # --- # # ### None # # A szó jelentése semmi vagy egyik sem. A Pythonban a None értéknek helykitöltő szerepe van. # # Ezzel jelölhetjük pl. a hiányzó vagy érvénytelen eredményt vagy az alapértelmezett beállítást. # # A None érték típusa.` # type(None) # # NoneType # # Ha a cella utolsó kifejezése None érték¶, akkor nincs kimenet. # 1 + 1 # None # # # -- # # --- # # ## Logikai Bool-változók és feltételes végrehajtás # # # Ahhoz, hogy a program reagálni tudjon bemenetekre, vagy egy már kiszámolt részeredménytől függhessen további működése, szükség van feltételek vizsgálatára. # # Gondoljunk például a másodfokú egyenlet megoldóképletére! Attól függően, hogy a diszkrimináns pozitív vagy negatív, léteznek, ill. nem léteznek valós gyökök, így értelemszerűen egy ilyen programnak "döntenie" kell. # # A döntés egy feltétel vizsgálatán alapul (pl. poz. vagy neg. diszkrimináns), ami lehet igaz, vagy hamis, angolul *True*, ill. *False*. Az igaz és hamis értéket tárolni képes változó típusa: **boolean** (Bool-változó). (Emlékezzünk vissza az **int** ill. **float** típusokra). # # --- # # Két objektum azonosságáról dupla egyenlőségjellel, azaz a == operátor segítségével tájékozódhatunk. # In[ ]: 1 == 1 # 1 megeggyezik 1-el ? # In[ ]: 1 == 2 # 1 megeggyezik 2-vel ? # Ha arról akarunk meggyőződni hogy két objektum nem ugyanaz, akkor ezt a != operátor segítségével tehetjük meg: # In[ ]: 1!=2 #1 nem 2 ? # Természetszerűen számok esetén a <,> operátorok segítségével dönthetjük el, hogy melyik szám a nagyobb: # In[ ]: 1>2 # In[ ]: 1<2 # In[ ]: 1j+3>2 # complex számokra nem értelmezzük a <> jeleket!! # Egy igaz/hamis értéket változóban is tárolhatunk: # In[ ]: igazvagyhamis= 2*2==5 # In[ ]: igazvagyhamis # Az **is** és **is not** relációk összehasonlítják, hogy két dolog valóban azonos-e. Minden összehasonlító relációnak azonos precedenciája van, mely magasabb, mint a számokkal végzett műveleteké. # In[ ]: 1==1.0 # A számegyenesen történő összehasonlítás # In[ ]: 1 is 1.0 # Objektum típusa és értéke szerint történő összehasonlítás: int vs float # Egy objektumról az **isinstance** parancs segítségével tudjuk eldönteni, hogy milyen típusú: # In[ ]: isinstance(1,int) # Vajon az '1' az int típusú ? # In[ ]: isinstance(2,float) # Vajon a '2' float típusú ? # Relációkat láncolhatunk is, például: az a < b == c megvizsgálja, hogy az a kisebb-e mint b, és ezen felül b egyenlő-e c-vel. # In[ ]: b=2 1 < 2 == b # In[ ]: b=3 1 < 2 == b # A relációkat összefűzhetjük **and** és **or** logikai műveletekkel is. Reláció erdményét (vagy bármely logikai műveletét) ellentettjére változtathatjuk a **not** művelettel. # In[ ]: not 2*2==5 # Az **and**, **or** és **not** fügvények, ha zárójelezést nem alkalmazunk, akkor a relációjelek után kerülnek kiértékelésre (más szóval mondva a relációjelekhez képest alacsonyabb a precedenciájuk). # A három logikai művelet közül a **not** értékelődik ki legelőször (neki a magasabb a precedenciája a másik kettőhöz képest), és az **or** értékelődik ki utolsónak. # # Tehát az A and not B or C ugyanazt jelenti, mint az (A and (not B)) or C. Természetesen a zárójeleket használhatjuk a kívánt feltétel eléréséhez. # In[ ]: b=3 ((1==2) and (3==4)) or (b==3) # --- # # ### Összes névtér foglat szavak listája # # # ``` # dir(__builtins__) # ``` # --- # # --- # # ## Karakterláncok (Stringek) # # A számok mellett a Python karakterláncokkal, például szavakkal is tud műveleteket végezni. A karakterláncokat egyszeres ('...') vagy dupla idézőjelek ("...") közé lehet zárni. A két jelölés között nincs jelentős különbség. A \\ használható arra, hogy a karakterláncbeli idézőjeleket levédjük # # A sztring adattípus szöveges értékek tárolására szolgál. Pythonban a sztring nem más mint Unicode # szimbólumok (másnéven Unicode karakterek) nem módosítható sorozata. # # A jelőlés választást gyakran a karakterlánc tartalma szabja meg egyszeres idézőjelet tartalmazó stringet kettős idézőjellel deklarálunk és viszont.  # # A többi  esetben az idézőjel fajtája indifferens.  # # A Pythonban minden objektum, így a karakterláncok is azok # # --- # # In[ ]: 'spam eggs' # In[ ]: 'doesn\'t' # In[ ]: "doesn't" # In[ ]: '"Yes," he said.' # In[ ]: "\"Yes,\" he said." # In[ ]: '"Isn\'t," she said.' # --- # # A kimeneti karakterlánc idézőjelekben jelenik meg, a speciális karakterek vissza-perrel (\\) levédve. # # Bár ez néha különbözőnek látszik a bemenettől (az idézőjel fajtája megváltozhat), a két karakterlánc egyenértékű. # # A `print()` függvény egy sokkal olvashatóbb kimenetet eredményez, elhagyva az idézőjeleket és kiírva a levédett és speciális karaktereket: # # --- # # In[ ]: print('"Isn\'t," she said.') # In[ ]: s = 'First line.\nSecond line.' # \n újsort jelent # In[ ]: s # print() nélkül a \n benne van a kimenetben # In[ ]: print(s) # print()-tel az \n újsort hoz létre # Ha nem akarod, hogy a \ jellel kezdődő karakterek speciális karakterként értelmeződjenek, akkor nyers karakterláncokat használhatsz egy r-et helyezve a kezdő idézőjel elé: # In[ ]: print('C:\some\name') # \n újsort jelent # In[ ]: print(r'C:\some\name') # r van az idézőjel előtt # A literális karakterláncok többsorosak is lehetnek. Egy lehetőség erre a hármas idézőjelek használata: """...""" vagy '''...'''. Ilyenkor az újsorok automatikusan belekerülnek a karakterláncba, de ez a viselkedés megszüntethető, ha a sor végére egy \\-t adsz. A következő példa # In[ ]: print("""\ Usage: thingy [OPTIONS] -h Display this usage message -H hostname Hostname to connect to """) # Karakterláncokat a + művelettel ragaszthatunk össze, és *-gal ismételhetünk. # In[ ]: 3 * 'un' + 'ium' # Két egymást követő literális karakterláncot (azokat, amik idézőjelben vannak, és nem egy változóban, vagy nem egy függvény hoz létre) az értelmező magától összefűz: # In[ ]: 'Py' 'thon' # De ez csak két literálissal működik, változóval vagy kifejezéssel nem: # In[ ]: prefix = 'Py' prefix 'thon' # nem tud változót és literális karakterláncot összefűzni # Ha változókat akarsz összefűzni, vagy változót literálissal, használj + műveletet: # In[ ]: prefix = 'Py' prefix + 'thon' # A literálisok összefűzése különösen hasznos hosszú sorok széttörésére: # In[ ]: text = ('Több karakterláncot írhatunk zárójelbe, ' 'hogy összefűzhessük azokat.') text # Minden karakterhez a karakterláncban a `Python` rendel egy sorszámot (indexet). Az első karakterhez tartozik a `0` index, a következőhöz az `1`-es index és így tovább. (Ez a konvenció tükrözi a C-ben megszokottakat.) # In[ ]: szo = 'Python' # In[ ]: szo[0] # karakter a 0 pozícióban # In[ ]: szo[5] # karakter a 5 pozícióban # Az indexek negatívak is lehetnek, ilyenkor jobbról kezdünk el számolni: # In[ ]: szo[-1] # utolsó karakter # In[ ]: szo[-2] # utolsó előtti karakter # In[ ]: szo[-6] # Az indexelésen felül a szeletelés is támogatott. Míg az indexelés egyetlen karaktert jelöl ki, a szeletelés egy részkarakterláncot: # In[ ]: szo[0:2] # karakterek a 0 pozíciótól (benne van) a 2-esig (az már nem) # In[ ]: szo[2:5] # karakterek a 2 pozíciótól (benne van) a 5-esig (az már nem) # A kezdő index mindig beleértendő az eredménybe, a végső index pedig nem. Ez teszi lehetővé, hogy s[:i] + s[i:] mindig egyenlő s-el: # In[ ]: szo[:2] + szo[2:] # In[ ]: szo[:4] + szo[4:] # A szeletek indexeinek hasznos alapértékei vannak; a kihagyott első index alapértéke 0, az elhagyott második index alapértéke a szeletelendő karakterlánc hossza: # In[ ]: szo[:2] # karakterek az elejétől a 2-esig (már nincs benne) # In[ ]: szo[4:] # karekterek a 4-es pozíciótól (benne van) a végéig # In[ ]: szo[-2:] # karakterek az utolsó előttitől (beleértve) a végéig # Jegyezd meg, hogy a -0 valóban azonos a 0-val, így ez nem jobbról számol! # In[ ]: szo[-0] # mivel -0 és 0 egyenlőek # A nem negatív indexek esetén a szelet hossza az indexek különbségével egyenlő, ha mindkettő a valódi szóhatárokon belül van. Például a szo[1:3] hossza 2. # Ha olyan indexet használunk, amely túl nagy, az eredmény hibát ad: # In[ ]: szo[42] # a szo csak 7 karakteres # A Python karakterláncait nem lehet megváltoztatni, azok megváltoztathatatlanok. Ezért, ha egy adott indexű helyhez értéket rendelünk, hibát kapunk: # In[ ]: szo[0] = 'J' # Ha másik karakterláncra van szükség, alkothatunk egy újat: # In[ ]: 'J' + szo[1:] # In[ ]: szo[:2] + 'py' # A beépített len() függvény a karakterlánc hosszával tér vissza: # In[ ]: s = 'legeslegelkáposztásíthatatlanságoskodásaitokért' len(s) # In[ ]: # Hány bájton tárolódnak a magyar ábécé ékezetes kisbetüi UTF-8 kódolás esetén? print(len('á'.encode('utf-8'))) print(len('é'.encode('utf-8'))) print(len('í'.encode('utf-8'))) print(len('ó'.encode('utf-8'))) print(len('ö'.encode('utf-8'))) print(len('®'.encode('utf-8'))) print(len('ú'.encode('utf-8'))) print(len('ü'.encode('utf-8'))) print(len('¶'.encode('utf-8'))) # In[ ]: # Hány bájton tárolódik a π és a ∞ szimbólum? print(len('π'.encode('utf-8'))) print(len('∞'.encode('utf-8'))) # # --- # # ### Hasznos szöveg sztring metodusok # # # `s.lower(), s.upper()` a sztring kisbetűs, nagybetűs verziójával tér vissza # # `s.strip()` a whitespace karaktereket levágja a sztring elejéről és végéről # # `s.isalpha() / s.isdigit() / s.isspace()`... megnézi, hogy a sztring vmennyi karaktere az adott karakterosztályba tartozik-e # # `s.startswith('other'), s.endswith('other')` megnézi, hogy a sztring a másik sztringgel kezdődik-e / végződik-e # # `s.find('other')` A sztringben szerepel-e a másik sztring (nem reguláris kifejezésként adjuk meg). Ha igen, akkor az első előfordulás első karakterének indexével tér vissza. Ha nem, akkor -1 a visszatérési érték. # # `s.replace('old', 'new')` a sztringben az 'old' vmennyi előfordulását 'new'-ra cseréli # # `s.split('delim')` A sztringet az adott szeparátor mentén részsztringek listájára bontja. A szeparátor nem reguláris kifejezés. Ha csak `s.split()` -et írunk, akkor a whitespace karakterek mentén bontja fel a sztringet. # # `s.join(list)` A `split()` ellentéte. Egy lista elemeit kapcsolja össze egy adott szeparátorral (ez lesz az s sztring). # # # --- # # In[ ]: # Fehér karakterek (szóköz, tabulátor, sortörés) eltávolítása # a sztring elejéről és végéről. print('e1 : ',' \talma\n'.strip()) # Megadott karakterek eltávolítása a sztring elejér®l és végér®l. print('e2 : ','---alma+++'.strip('+-')) # In[ ]: ## Minták szoveg='minta szüveg a python bemutatására' print(szoveg.upper()) ## -> MINTA SZÜVEG A PYTHON BEMUTATÁSÁRA print('old szovegben az old részt kicseréli majd'.replace('old', 'new')) ## -> new szovegben az new részt kicseréli majd print('aaa,bbb,ccc'.split(',')) ## -> ['aaa', 'bbb', 'ccc']. print('---'.join(['aaa', 'bbb', 'ccc']) ) ## -> aaa---bbb---ccc # In[ ]: ##--- tömeges replace() ##--- használat : str=s.maketrans( régiek, újak, törlendők) cserélő= str.maketrans("alk", "k?a") print('V1 : ',"ablak".translate( cserélő)) ## -> 'kb?ka' cser= str.maketrans("öü","üö", " k") print('V2 : ', "tükröm tükröm".translate(cser)) ## -> 'törümtörüm' # ### Módosított jelentéssel bíró karaktersorozatok és hatásuk: # # \n : A karakterfolyam kiírása a következő sorban folytatódik. # # \t : A kiírás a következő tabulátorpozíción folytatódik. # # \r : A kiírás a sor elejére visszaugorva folytatódik (carriage return, azaz „kocsi vissza” parancs, aminek elnevezése még az írógépes-teleprinteres korszakból származik). # # \\ : Maga a '\', a visszavágás jele kerül kiírásra. # # \a : A számítógép hangszóróján egy pittyegés lesz halható( bell, csengő). # # \xhh : A kiírandó karakter kódját hexa-számrendszerben adtuk meg két számjeggyel. # # \ooo : A kiírandó karakter kódja oktális számrendszerben három számjeggyel. # # \uxxxx : A kiírandó karakter kódpontja hexa-számrendszerben négy számjeggyel. # # \Uxxxxxxxx : A kiírandó karakter kódpontja hexa-számrendszerben nyolc számjeggyel. # # # # ### A karakterláncok leghasznosabb metódusait: # # upper() - nagybetűs láncot állít elő az eredetit alapul véve; # # lower() - kisbetűs láncot állít elő; # # capitalize() - az első karakter nagybetűs lesz, a többi kicsi; # # title() - minden szó nagybetűvel fog kezdődni; # # # # #### center(), ljust(), rjust() # # az új lánc az első argumentumként megadott hosszúságú lesz, amiben az eredeti lánc másolata középre ill. # balra vagy jobbra igazítva kerül elhelyezésre, az üres helyeken a második argumentumként szereplő „kitöltő” karakter fog ismétlődni. # # Ha nem adunk meg „kitöltőt”, akkor az a szóköz lesz. # # # # #### strip() # # az új lánc két végéről levágja a szóköz és az egyéb vezérlő karaktereket, az ún. 'whitespace'-ket. Ezek a string modulban a whitespace változóban vannak felsorolva: # # # # #### startswith(minta, start, stop), endswith(minta, start, stop) # # Általuk ellenőrizhetjük, hogy egy karakterlánc egy megadott mintával kezdődik-e ill. végződik. # # A start, stop értékeivel kijelölhetünk egy szeletet, amikor is csak ezen történik az ellenőrzés. # # Egyszerre több mintát is megadhatunk zárójelek között felsorolva. # # # # #### count(minta, start, stop) # # Megszámolja a minta előfordulását a láncban vagy annak egy szeletében és a darabszám lesz a visszatérési érték. # # # # #### find(), rfind(), index(), rindex() # # Mind a négy metódus a (minta, start, stop) paramétereket fogadja el és a megadott minta első # előfordulásának az indexét adja meg. # A start és stop értékeivel kijelölhetünk egy szeletet, ha nem az egész láncban szeretnénk keresni. # # Az rfind() és az rindex() jobbról balra keres. # # Ha a keresett minta nincs a láncban vagy a szeletben, akkor az első két metódus -1-et ad vissza, míg az utolsó kettő „ValueError” típusú eseményt hoz létre. # # Választhatunk, hogy melyik módon kívánjuk a hiányt kezelni. # # Azonban, ha csak a minta tartalmazásának ténye fontos és nem az indexe, akkor használjuk az in-operátort! # # # # #### replace(régi, új, darabszám) # A láncban a régiként megadott összes mintát az újra cseréli ill. ha a darabszámot megadtuk, akkor csak annyit. # # Az új minta lehet az üres lánc is, ami a régi törlését eredményezi. # # # # ### A sztring ellenőzések # # isalpha() - Igaz értéket ad vissza, ha a karakterlánc csak betűket tartalmaz, egyébként hamisat. # # isdecimal() - Igaz, ha csak számok vannak a láncban, egyébként hamis. # # islower() - Igaz, ha csupa kisbetűs karakter van a láncban. # # isupper()- Igaz, ha csupa nagybetűs karakter van a láncban. # # isspace() - Igaz, ha a lánc csak az ún. whitespace típusú karakterekből áll. # # # # A speciális írásjeleket a string modulban lévő `punctuation` nevű változó tartalmazza, ami # ugyancsak jól használható a karakterláncok kezelésénél. # # # # ### formázó hivatkozással, ami általánosságban ilyen lehet: # # { [sorszám|név][:[[kitöltő]igazító][előjel][#][0][szélesség][,][.pontosság][típus]] } # # print( "\n Csak {0}? Nem hiszem, hogy csak {0}!\n".format( kor) ) # # # # #### típus # a számok formázására szolgál, és az így megadható ábrázolási módok két csoportba sorolhatók. Az elsőben, az egész számok esetében az alábbiak adhatók meg: # # • 'd' - decimális, azaz tízes számrendszer szerinti megjelenítés, ez lesz érvényben akkor is, ha nem adunk meg típust; # # • 'b' - bináris, azaz kettes számrendszerbeli megjelenítés; # # • 'x', 'X' - hexadecimális, azaz tizenhatos számrendszerbeli megjelenítés kis (abcdef) betűkkel ill. nagyokkal (ABCDEF). # # • 'o' - oktális, azaz nyolcas számrendszerbeli megjelenítés; # # • 'c' - karakteres (angolul: character) megjelenítés, amikor a megadott egész számot egy karakter kódjaként kell értelmezni. # # --- # In[ ]: for x in range(1, 11): print(repr(x).rjust(2), repr(x * x).rjust(3), end=' ') print(repr(x * x * x).rjust(4)) #----------------------------------- for x in range(1,11): print('{0:2d} {1:3d} {2:4d}'.format(x, x * x, x * x * x)) #----------------------------------- print('12'.zfill(5)) print('Nevem {}, születtem "{}-en."'.format('Lajos', 'Budapest')) #----------------------------------- import math print('PI értéke {!r}.'.format(math.pi)) print('PI kerekített értéke {0:.3f}.'.format(math.pi)) # --- # # # ### Bytes tipus: # Nem módosítható byte kód sorozat # # # ``` python # b'akarmi' → (sztring) # bytes('talicska') → (sztring) # ``` # # `bytes([source[, encoding[, errors]]])` # # # # # ### Bytearray tipus: # # ua. mint bytes, csak módosítható # # ``` python # bytearray([66, 67, 68]) → bytearray(b'BCD') # ``` # # # `bytearray([source[, encoding[, errors]]])` # # --- # In[ ]: bt = b'Byte tipus' print('bsz : ', bt) z = list(bt) print('z : ', z) bat = bytes('Bytearray tipus éáűúőóüö', 'utf8') print('bat : ', bat) s = bat.decode() print('s : ', s) # # --- # # # ## Különleges értékadások # # # In[ ]: ## Kicsomagolás (unpacking) x, (y, z) = [10, (20, [30, 40])] # Általános eset # Többszörös értékadás. a, b = 20, 30 print(a) print(b) # Csere. a, b = b, a print(a) print(b) # Kicsomagolás alkalmazása for ciklusnál. data = [('a', 1), ('b', 2), ('c', 3)] for x, y in data: print(x) print(y) # # --- # # # ## Kollekciók, összetett adat tipusok # # # # - Nem modosítható lista(tuple) / sokaság, # # - Lista (list), # # - Halmaz(set), # # - Nem módósítható halmaz (Frozenset), # # - Könyvtár(dir) / szótárhoz hasonló típusú objektumokat összefoglalóan asszociatív tömböknek nevezzük. # # # # --- # # # # ### Tuple használata (nem változtatható lista) / sokaság # # () # # # # A tuplek megváltoztathatatlan (immutable) elemek rendezett együttesei.  # # A tuplek különböző típusú elemeket tartalmazhatnak.  # # A tuple természetes számokkal indexelhető, nem módosítható tömb. # # A tuple-ok mindig zárójelezve vannak, így azok egymásba ágyazva is helyesen értelmezhetők. # # Megadhatjuk zárójelekkel és anélkül is, néha azonban feltétlenül szükségesek a zárójelek (amikor az egy nagyobb kifejezés része). # # Nem lehetséges a tuple elemeinek új értéket adni, de létrehozható olyan tuple, amelynek vannak megváltoztatható elemei, például listák. # # A listákhoz hasonlóan a tuplek elemeihez is indexeléssel férhetünk hozzá és az in szerkezettel tesztelhetjük egy elem jelenlétét a listában.  # # Ha már létrehoztunk egy listát,  akkor annak a tartalma többé nem változtatható meg. # # # # Jegyezzük meg, hogy a többszörös értékadás valójában csak a tuple-ba csomagolás és a sorozat-szétpakolás kombinációja és minden jobboldalon álló sorozattípusra működik. # # A sorozat szétpakolásához az szükséges, hogy a bal oldalon annyi elem szerepeljen, ahány elem van a tuple-ban. # # ``` python # t = 1234, 4321, 'Itt vagyok' # # >>> x, y, z = t # # ``` # # # #### Egy lista illetve egy tuple közötti választás kritériumai : # # - a tuplek bejárása gyorsabb, mint a listáké # # - konstansok definiálására használjunk tupleket # # # # --- # In[ ]: t = 12345, 54321, 'Lajos' print( t[0]) print(t) t = ('Lajos', 12345, 54321, 'Dani') print(t) u = t, (1, 2, 3, 4, 5) print(u) egyTuple = 'Lajos', print(egyTuple) # # --- # # ## Listák (List) # # [] # # A Python többfajta összetett adattípust ismer, amellyel több különböző értéket csoportosíthatunk. # # Egy igen sokoldalú összetett adattípus a lista, amelyet vesszőkkel elválasztott értékekként írhatunk be szögletes zárójelbe zárva. # # Az alábbiakban a listákkal kapcsolatos műveletek alapjait tekintjük át. # # A lista elemeinek nem kell azonos típusúaknak lenniük, bár sok alkalmazásban minden elem azonos típusú. # # A lista a tuple módosítható változata. Új elemet is hozzálehet adni, illetve meglévő elemeken is lehet módosítani. # # +---+---+---+---+---+---+ # # | 1 | 2 | 4 | 8 | 16| 32| # # +---+---+---+---+---+---+ # # | a | b | c | d | e | f | # # +---+---+---+---+---+---+ # # | P | y | t | h | o | n | # # +---+---+---+---+---+---+ # # 0 1 2 3 4 5 6 # # -6 -5 -4 -3 -2 -1 # # # # # #### Lista műveletek : # # A lista végéhez az `append()` metódussal,  # # egy adott indexű helyéhez az `insert()` metódussal adhatunk elemeket.  # # Az `extend()` metódus a paramétereként megadott lista tartalmát hozzáadja a  listához. # # Az `index()` metódus megadja egy elem listabeli első előfordulásának indexét.  # # Abban az esetben,  ha a paraméterként megadott elem nincs a listában, egy `ValueError` generálódik.  # # Az `in` utasítás  `True` értéket ad vissza, ha az elem a listában van, egyébként `False` -ot. # # Ahhoz hasonlóan, ahogyan elemeket adunk egy listához, törölhetünk is elemeket egy listából. A  `remove()` metódus segítségével törölhetjük a megadott elem első elpfordulását egy listából.  # # Ha a paraméterként megadott elem nem fordul elő a listában, akkor egy  `ValueError`  kivétel  (exeption) generálódik.  # # # A Pythonban minden objektum, így egy lista is, a `del` (delete)  operátorral szüntethető meg. # # # # --- # # In[ ]: ## Üres lista létrehozása. a=[] a.append('bor') a.append('sör') a.insert(1, '''pálinka''') ## beszúrás 1 pozicióba (0 val kezdődik) print(a) ## ['bor', 'pálinka', 'sör'] print('---------') a = ['spam', 'tojások', 100, 1234] print(a) ## ['spam', 'tojások', 100, 1234] print('---------') # Tartalmazásvizsgálat. print('tartalmazás',30 in a) ## Első előfordulás / indexének meghatározása print('index', a.index('spam')) print('---------') ## Egy szekvencia összes elemének hozzáfűzése a listához. a.extend([22, 23, 24, 'sör', 'bor']) print('extend',a) ## ['spam', 'tojások', 100, 1234, 22, 23, 24, 'sör', 'bor'] print('---------') ##Az extend különbözik az append-től! a.append([22, 23, 24]) print('append', a) print('---------') # Adott indexű elem törlése. a.pop(2) print('pop(2)', a) # Utolsó elem törlése. a.pop() print('pop()', a) # Ahogy a karakterláncokat, a listákat is indexelhetjük és szeletelhetjük: # In[ ]: a[0] # In[ ]: a[3] # In[ ]: a[-2] # In[ ]: a[1:-1] # a szeletelés új listát ad # A listák az összefűzést is támogatják: # In[ ]: a[:2] + ['sonka', 2*2] # In[ ]: 3*a[:3] + ['Boe!'] # A karakterláncokkal ellentétben – amelyek megváltoztathatatlanok – a listák egyes elemeit módosíthatjuk: # In[ ]: a[2] = a[2] + 23 a # A szeleteknek értékeket is adhatunk, és ez akár a lista elemszámát is megváltoztathatja: # In[ ]: a[0:2] = [1, 12] # Pár elem átírása: a # In[ ]: a[0:2] = [] # Pár elem törlése: a # In[ ]: a[1:1] = ['bletch', 'xyzzy'] # Pár elem beszúrása: a # In[ ]: a[:0] = a # Beszúrja magát (pontosabban egy másolatát) a saját elejére. a # A beépített len() függvény listákra is alkalmazható: # In[ ]: len(a) # A listák egymásba ágyazhatóak, azaz listába elhelyezhetünk listát elemként: # In[ ]: a = ['a', 'b', 'c'] n = [1, 2, 3] x = [a, n] x # In[ ]: x[0] # In[ ]: x[0][1] # In[ ]: x[0][1] # Előfordul hogy meg szeretnénk tudni, hogy egy adott elem hanyadik helyen van a listában ezt az `.index()` függvény alkalmazásával kaphatjuk meg. Például nézzük meg hogy a lent definiált `autok` lista hanyadik eleme a `'merci'` karakter: # In[ ]: autok=['skoda','vw','merci','mazda'] # In[ ]: autok.index('merci') # Mint ahogy azt láttuk, a karakterláncok is indexelhetőek. Karakterláncban szereplő karakterek indexére is rákérdezhetünk az `.index()` paranccsal: # In[ ]: betuk='abcdef' # In[ ]: betuk.index('e') # --- # # ### Listát többféleképpen hozhatunk létre: # # • szögletes zárójelek között vesszővel elválasztott elemeket felsorolva, s ha nem adunk meg # # elemet, akkor az üres lista jön létre; # # • a list() standard függvénnyel, amelynek argumentumként bármilyen olyan objektumot # # megadhatunk, amelynek az elemei felsorolhatók, s ekkor ezen elemek lesznek a lista # # elemei; az üres lista jön létre, ha nem adunk meg elemet; # # • a [ kif1 for elem in obj if kif2 ] kifejezéssel, ahol az obj egy felsorolható elemekkel bíró # # objektum. A 'kif1' elemképző kifejezéssel hozzuk létre az új elemeket, de a kif2 kifejezéssel # # ezeket még előzetesen megszűrhetjük. Az if szerkezetet nem kötelező megadni. E # # konstrukciót listaépítő vagy listaalkotó kifejezésnek fogjuk nevezni. # # --- # # A teljes körű másolásnál a másolandó listának nem csak az elemei, hanem az általuk hivatkozott módosítható objektumok is duplikálásra kerülnek, s az elemek ezekre fognak mutatni (angolul: deep copy). # # Az eljárás során a módosíthatatlan objektumok nem lesznek megkettőzve. # # A másolást a copy modulban lévő deepcopy() függvénnyel végezhetjük el. # # --- # ### Pár minta a listák használatára # In[ ]: a = [42.25, 420, 4200, 1, 42.5] print(a.count(420), a.count(42.25), a.count('x')) a.insert(2, -1) a.append(420) print(a) print(a.index(420)) a.remove(420) print(a) a.reverse() print(a) a.sort() print(a) print(a.pop()) del a[2:4] print(a) print('----------------- Csúcs Négyzet sor számítás --------------------') print(list(map(lambda x: x**2, range(10)))) print('==') print([x ** 2 for x in range(10)]) print('----------------- Csúcs márix számítás azonos kizárással --------------------') print([(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]) print('==') combs = [] for x in [1,2,3]: for y in [3,1,4]: if x != y: combs.append((x, y)) print(combs) print('----------------- Csúcs négyzet sor számítás --------------------') print([(x, x ** 2) for x in range(11)]) print('----------------- Csúcs sor kibontás --------------------') vec = [[1,2,3], [4,5,6], [7,8,9]] print( [num for elem in vec for num in elem]) print('----------------- Csúcs PI kerekítgetés --------------------') from math import pi print( [str(round(pi, i)) for i in range(1, 6)]) print('----------------- Csúcs mátrix átszámolás 4x3 -> 3x4--------------------') matriz = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], ] print( [[fila[i] for fila in matriz] for i in range(4)]) print('==') trans = [] for i in range(4): trans.append([fila[i] for fila in matriz]) print( trans) print('==') print(list(zip(*matriz))) # # --- # # # ### Halmaz (SET) # # {} `Jegyezzük meg, hogy az üres halmaz létrehozásához csak a set() használható, a {} nem, mert az utóbbi üres szótárat hoz létre.` # # # # A Python a set / halmaz adattípust is tartalmazza. # # A halmaz adat típus a matematikai halmaz fogalom számítógépes megfelelője. # # A halmaz elemek rendezetlen halmaza, amelyben minden elem csak egyszer fordulhat elő. # # # #### Alapvető használata: # # - megadott elem meglétének ellenőrzése, # - elemek kettőzésének kiszűrése. # # # # ##### A set /halmaz objektumok támogatják az olyan matematikai műveleteket, mint # # - az egyesítés, # - metszet, # - különbség, # - és a szimmetrikus eltérés. # # # A halmazok létrehozására a kapcsos zárójel, vagy a set() függvény használható. # # # # # # Halmazt indexelni nem lehet. # # # In[ ]: # Üres halmaz létrehozása. a= set() ## üres halmaz / set létrehozása print(type(a)) a={} ## üres szótár / Dict létrehozása print(type(a)) s= {2, 3, 42} s.remove(2) # Elem eltávolítása. s print(type(s), len(s),s) a = set('abracadabra') b = set('alkatresz') print(a) print(a - b) print(a | b) print(a & b) print(a ^ b) a = {x for x in 'abracadabra' if x not in 'abc'} print(a) # In[ ]: # Hozzunk létre egy s nevű halmazváltozót! s = {2, 3, 4} # Ellen®rizzük s típusát és elemszámát! type(s), len(s) # Halmazműveletek. print({1, 2, 3} | {3, 4, 5}) # unió print({1, 2, 3} & {3, 4, 5}) # metszet print({1, 2, 3} - {3, 4, 5}) # kivonás # A halmazba bármilyen nem módosítható típusú elemet be lehet tenni. print({1, 2, (3, 4)}) # Üres halmaz létrehozása. set() # ---- # # --- # # ## Szótárak (Dictionary) # # { : } # # A szótárhoz hasonló típusú objektumokat összefoglalóan asszociatív tömböknek nevezzük. # # A szótár kulcs érték párok halmaza, ahol a kulcsok egyediek. A kulcs lehet egyszeru˝ típus, tuple, vagy bármely módosíthatatlan adatszerkezet. Indexelni a kulccsal lehet # # Sokszor előfordul, hogy adatokat nem valamilyen sorrendben, hanem inkább valamilyen címke szerint szeretnénk tárolni. # # Tipikus példája ennek egy idegen nyelvű szótár, ahol egy magyar kifejezést egy más nyelvbeli kifejezéssel párosítunk. # # Ezeknél a struktúráknál sokszor nem lényeges a sorrend, gondoljunk itt például valamilyen tárgy tulajdonságaira. Legyen mondjuk egy autónk ami # # - piros színű # - 1976-ban gyártották # - 3m hosszú # - aok621 rendszámú # # Ezek a tulajdonságok egyértelműen meghatározzák az autót attól függetlenül, hogy a felsorolást milyen sorrendben tettük. # # Ilyen jellegű adatstruktúra a Python nyelvben a szótár vagy angolul a dictionary, röviden dict. # # A szótárak − néha asszociatív tömböknek is nevezik őket − kulcsokkal indexelt, nem rendezett adategyüttesek.  # # Egy kulcsnak kötelezően megváltoztathatatlannak (immutábilisnak) (string, egész  vagy tuple) kell lenni.  # # Másrészt egy kulcs mindig egyedi. Egy üres szótárat két kapcsos zárójellel  definiálunk.  # # # A szótárak létrehozása kulcsszavak és a hozzájuk rendelt érték segítségével az alábbi szintaxis alapján történik: # # --- # # In[ ]: tel = {'János': 4098, 'Simon': 4139} tel # A listákkal ellenben, ahol sorszám alapján hivatkozunk egy elemre, itt kulcsszó alapján: # In[ ]: tel['János'] # Új elemet is kulcsszó alapján adhatunk egy dict-hez: # In[ ]: tel['Géza'] = 4127 tel # Természetesen nem csak számokat adhatunk meg a szótárunkba mint hozzárendelt értéket: # In[ ]: tel['Brünhilda']='NEM TUDOM A SZÁMÁT' tel # Így törlünk valakit a telefonkönyvből: # In[ ]: del tel['Simon'] tel # A dict-ben szereplő kulcsszavakat a ".keys()" metódus alkalmazásával tudjuk elérni. # In[ ]: tel.keys() # A fenti parancs kimenete látszólag tartalmazza az általunk kért információt. Sokszor azonban célszerű ezt az outputot a `list()` parancs segítségével listává konvertálni: # In[ ]: list(tel.keys()) # Vajon Géza benne van a telefonkönyvben? Ezt a listáknál megismert "in" parancsal tudjuk ellenőrizni: # In[ ]: 'Géza' in tel # *Megjegyzés:* Nyilván attól, mert Brünhilda benne van a telefonkönyvben, nem biztos, hogy tudjuk a telefonszámát: # In[ ]: 'Brünhilda' in tel # In[ ]: tel['Brünhilda'] # # --- # # A szótáraknak vannak a kulcsok manipulálására szolgáló metódusai.  # # A `keys()` metódus a  szótár kulcsainak listáját adja visszatérési értékként, a has_key metódus True értéket ad vissza,  ha a paraméterként megadott kulcs szerepel a szótárban, ellenkező esetben False -ot. # # A `values()` metódussal egy szótárban tárolt értékeket tartalmazó listához férünk hozzá.  # # Az `items()` metódus egy tuplekből álló listát ad, melyben midegyik tuple egy kulcs-érték párt  tartalmaz # # Egy kulcshoz asszociált értéket úgy módosítunk, hogy újra értéket rendelünk a szótárban a kérdéses  indexhe.  # # Végul a `del` operátorral törölhetünk egy kulcs-érték párt a szótárból # # # # A **dict** függvény segítségével az alábbi módon is definiálhatunk szótárakat: # In[ ]: tel2=dict(Ica=1234,Maca=4321,Dada=5567) tel2 # In[ ]: tel = {'jack': 4098, 'sape': 4139} tel['guido'] = 4127 print( tel) print(sorted(tel.keys())) print(list(tel.keys())) print(list(tel.values())) dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]) print('==') dict(sape=4139, guido=4127, jack=4098) for k, v in tel.items(): print(k, v) print('----------------- Csúcs generálás--------------------') print( {x: x ** 2 for x in (2, 4, 6)}) print('----------------- Csúcs generálás--------------------') for i, v in enumerate(['ta', 'te', 'ti']): print(i, v) print('----------------- Csúcs generálás--------------------') pre = ['pre1', 'pre2', 'pre3'] res = ['res1', 'res2', 'res3'] for p, r in zip(pre, res): print(p,r) # --- # ## Bool változók és más változók kapcsolata # Ahogy fentebb láttuk, egy objektumot egész számmá (**int()** függvény) vagy lebegőpontos számmá tudunk konvertálni ( **float()** függvény), illetve láttunk példát arra is hogy listává konvertáljunk valamit. Objektumokat Bool-változóvá is tudunk konvertálni. Erre szolgál a **bool()** függvény. Alább néhány példát nézzünk meg, hogy bizonyos dolgok hogy konvertálódnak a **bool()** függvénnyel. # # Egy szám vagy egy karakterlánc **True** értéket ad: # In[ ]: bool(1.0) # In[ ]: bool('szoveg') # Hasonlóan **True** értéked ad, ha egy nem üres listát vagy általában egy más létező objektumot vizsgálunk: # In[ ]: bool([1,'Bela']) # **False** értéket ad a 0 az üres karakterlánc, illetve az üres lista: # In[ ]: bool(0) # In[ ]: bool(0.0) # In[ ]: bool('') # In[ ]: bool([]) # Egy látszólag rosszul működő példa: # In[ ]: 'a' == ('a' or 'b') # In[ ]: 'b' == ('a' or 'b') # In[ ]: 'a' == ('a' and 'b') # In[ ]: 'b' == ('a' and 'b') # A második példa vajon miért **False**, ha az első **True** ? # # A harmadik miért **False**, ha a látszólag hasonló negyedik **True**? # Ezen a ponton úgy tűnhet, hogy az **and** és **or** utasítások nem működnek megfelelően! # # Ha részletesen kiböngésszük, hogy mit is csinál a Python-értelmező, akkor kiderül, hogy pontosan azt teszi, amire megkértük. DE ez nem pontosan az, amire elsőnek gondolnánk! Az első két példa tehát nem azt ellenőrzi, hogy a **==** előtt álló karakter az szerepel-e a zárójelben. Mi is történik pontosan? # # Amikor a Python egy **or** kifejezéssel találkozik (a zárójeleken belül), sorba megy az **or** kifejezés által kapcsolatba hozott elemeken, és az első **True**-ként kiértékelhető objektum **értékét** adja vissza, tehát nem **True** vagy **False**-t hanem a változó értékét. # # Ez azért van így, mert ha egy **or** kifejezés egyik tagja igaz, akkor az egész kifejezés igaz. Az **and** ezzel szemben addig lépdel végig az alkotó kifejezéseken, amíg meggyőződött róla, hogy mindegyik kifejezés igaznak számít, és a legutolsó értéket adja vissza. # # A bool operációk ezen viselkedését *rövid zár*-nak hívják, és sok programozási nyelvben hasonlóan működik. # Tehát ha arról akarunk meggyőződni, hogy egy kifejezés valamely kifejezéscsoport egyikével megegyezik, akkor az alábbiak szerint szükséges eljárni: # In[ ]: (('a' == 'a') or ('a' == 'b')) # In[ ]: (('b' == 'a') or ('b' == 'b')) # Előfordul azonban sokszor, hogy az a csoport, amihez egy lehetséges elemet össze kell hasonlítani, igen népes. Például hogy mondjuk meg, hogy egy karakterlánc szerepel egy adott hosszú listában? Erre alkalmazható az **in** kulcsszó: # In[ ]: nemet_hetnevek=['Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag','Sonntag'] # In[ ]: 'hetfo' in nemet_hetnevek # In[ ]: 'Montag' in nemet_hetnevek # # --- # # ## Standard függvények használata # # A nyelvhez tartozó ún. alapfüggvények („standard” függvények), modulok # # # # ### Modulokat többféleképpen importálhatunk. # # Az `import modul_név` parancs használata esetén a modul elemeire úgy hivatkozhatunk, hogy elé írjuk a modul nevét. # # A másik módszer esetén `from modul_név import elem`, nem kell a modul nevét használnunk a modul elemére hivatkozásnál, viszont ilyenkor könnyen név ütközés fordulhat elő. # # Ez utóbbi változat esetén vesszővel elválasztva a modul több felhasználandó elemét is megadhatjuk vagy * karakterrel az összes elemet importálhatjuk (pl. `from math import *` ). # # --- # # In[ ]: print("Tömb tagjainak összege: ",sum([1,2,3,4])) print("Tömb tagjainak száma: ",len([1,2,3,4])) print("Abszolult érték: ",abs(-1234)) print("Kerekített érték: ",round(1.2234)) nevem='lajos' print('A nevem tipusa : ', type(nevem)) import math as mt # Csopmag importálása (matematikai csomag) print("Log értéke : ",mt.log(10)) ## rövid név és pont utánni konkrét névvel hívatkozhatonk rá(használhatjuk) from math import log print("Log értéke : ",log(10)) ## mostmár így is hivatkozhatunk rá # --- # # Ha információt szeretnénk kapni egy függványról, csomagrol # # --- # In[ ]: import pydoc ## importáljuk a pydoc modult import sys ## importáljuk a kérdéses modult # pydoc.help(sys) ## használjuk sys modulra meghívva from pydoc import help ## vagy mportáljuk a pydoc modulból csak a help fuugvényt # help(sum) ## használjuk fuggvényre meghívva # help(int) ## használjuk typusra meghívva print(globals) ## kinyomtathatjuk a global változóinkat print(locals) ## kinyomtathatjuk a local változóinkat # --- # # #### A math modul néhány függvényei : # # • A ceil(a) az argumentumként megadott a-hoz a nála nagyobb legkisebb egész számot # # rendeli (az angol 'ceil' plafont jelent, utalva arra, hogy felfelé kerekít). # # • A floor(a) az a-hoz a nála kisebb legnagyobb számot rendeli ('floor': padló, mert lefelé kerekít). # # • A trunc(a) azt az egészet adja meg, ami a-ból a törtrész levágása után marad ('truncate': levág). # # # # # # 'inf' és '-inf' hatására egy float típusú objektumot, ami bizonyos vonatkozásokban úgy viselkedik mint ahogy azt a matematikában a végtelentől elvárjuk. # # Az 'inf' rövidítés az angol 'infinity', azaz végtelenség szóból származik. # # --- # --- # # Az eddig megismert standard függvények, mint például a `min(), type(), len()` mindig meghívhatók a program bármely részében. # # A metódusokhoz az objektumok belső függvényei, ezért előszőr az nobjektumot kell létrehozni és utánna az objektumra hívatkozva kell meghívni, hiszen abban vannak ezek a függvények „beágyazva”. # # ` objektum.metodus(valtozo)` # # --- # --- # # ## Különleges parancsok # # ### pass --> nem csinál semmit jelző parancs oda ahol kötelező parancs megadása # # A pass utasítás egy null operáció, amikor kiértékelődik, semmi sem történik. Vagyis az üres utasításnak felel meg. # # Ez akkor hasznos, amikor az utasítás szintaktikailag elvárt, ott az utasítás számunkra felesleges. # # # # ### assert --> Az assert utasítás talán a legalkalmasabb arra, hogy hibát keressünk a programunkban. # # a feltétel teljesülése esetén nem történik semmi, de nem talsesülés esetén hiba váltódik ki # # # # ### yield # szüneteltet egy függvényt. # Ez egy különleges függvény, amely időről időre értékeket állít elő. Úgy képzelheted el, mint egy folytatható függvényt. A meghívása egy generátort ad vissza, amely az x egymást követő értékeinek előállítására használható. # # # ### next() # ott folytatja, ahol az abbamaradt. # ismételt hívása ugyanazzal a generátor objektummal pontosan ott folytatja a végrehajtást, ahol abbahagyta, és addig folytatja, amíg nem találja meg a következő yield utasítást. # Minden változó, helyi állapot stb. mentésre kerül a yield hívásakor, és visszaállításra kerül a next() hívásakor. # A végrehajtásra váró következő kódsor a print() függvényt hívja, amely kiírja az incrementing x kifejezést. # Ezután végrehajtja az x = x + 1 utasítást. # Majd végighalad újra a while cikluson, és az első dolog, amivel találkozik, az a yield x utasítás, amely elmenti az összes állapotot, és visszaadja az x aktuális értékét . # # --- # # # In[ ]: x = "hello" assert x == "hello" # OK, ág nem csinál semmit assert x == "goodbye" # hiba üzenettel elszál //AssertionError is raised: assert x == "goodbye", "x should be 'hello'" assert 2 + 2 == 5, "Nagy baj van nem működik a matematika, vagy csak bennem van a hiba?" # In[ ]: