Mi a Python? A Python alapjainak áttekintése Általános célú programnyelv rengeteg beépített és egyéb modullal. Óbudai Egyetem Alba Regia Egyetemi Központ (AREK) Székesfehérvár 2011. szeptember 16. Objektumorientált, de kezd k err l megfeledkezhetnek Funkcionális programozást is lehet vé teszi Platformfüggetlen bytekódot készít Könnyen beágyazhatóak C és Fortran programok Példaprogram feladatkit zés Példaprogram megvalósítás from math import sqrt Készítsünk egy függvényt, amely a egyenlet gyökeit adja vissza. A gyökök: ax 2 + bx + c = 0 x 1,2 = b ± b 2 4ac 2a def masodfoku(a, b, c): D = b**2-4*a*c if D < 0: print "Nincs valós gyök." return elif D == 0: print "Kett s (valós) gyök van." else: print "Két eltér valós gyök van." x1 = -b + sqrt(d) x1 /= 2*a x2 = -b - sqrt(d) x2 /= 2*a return x1, x2
A szerz Miért Python? Na vajon miért? Guido von Rossum, holland A szerz kedvence a Monty Jelenleg a Google Python's Flying Circus alkalmazottja A dokumentációban ajánlott a Monty Python idézet Számok Karakterláncok (string) egész (int) 1, 2123123123123123118978970 "Szelet", 'alma\nkörte', "that's it" Többsoros karakterlánc lebeg pontos ( oat) """A többsoros szövegeket három idéz jel (" vagy ') határolja.""" 3.14, 1.6e-19 (math modul) komplex (complex) 1+3j, 2j Metódusok: upper, center, rjust, split, splitlines... (cmath modul) M veletek: + M veletek +, -, *, /, //, ** (hatvány) M veletek egészeknél % (mod),... (bitenkénti m veletek) "AREK"*3 # AREKAREKAREK
Listák (list) n-esek (tuple) Bármilyen elemei lehetnek l = [1, "alma", 2+3j] Módosíthatjuk: hozzáf zhetünk, beszúrhatunk és törölhetünk bel le elemeket Metódusai: append, insert, count, pop... Új lista egyszer el állítása másikból: lista = ["alma", "egres", "barack"] hosszak = [ len(i) for i in lista ] # [4, 5, 6] lista.append("dió") lista.count("alma") # 1 Listához hasonló, de nem módosítható t = (1, "AREK", [1,2]) Példák értékadásra: (a, b, c) = (1, 2, 3) print a # 1 a, b, c = 1, 2, 3 # Ugyanaz a,b,c = "Ede" print a # 'E' a, b = a+b, a # Nem kell segédváltozó. Indexek, szeletek Szótárak (dictionary) M ködnek listaszer objektumoknál: karakterlánc, lista, tuple 0. elemmel kezdünk. ( MATLAB) s = "Szelet" +---+---+---+---+---+---+ S z e l e t +---+---+---+---+---+---+ 0 1 2 3 4 5 6-6 -5-4 -3-2 -1 Példák: s[0], s[2:4], s[:3], s[-2:] Használható a len() (hossz) függvény rájuk. Egy kulcs azonosít egy elemet. Példák: d = {1: "alma", (18.4, 47.2): "Fehérvár", "alak": "téglalap" } print d[1] # alma print d.keys() # [a, (18.4, 47.2), "alak"] d[1j] = "komplex" Csak nem megváltoztatható elem lehet kulcs.
Logikai (boolean) A Python vezérlési szerkezetei Értéke lehet True és False. Példák: s = "alma" # Értékadás, nem vizsgálat 2 < len(s) < 10 # True s == s.lower() and s!= "apple" # True not 3 == 4 # True "a" in s # True s is None # False s.endswith("ma") # True Vizsgálatnál hamis érték ek (a nulla és az üresek): 0; []; (,); ""; {} if while for def class try Vázlatosan: szerkezet eleje: els utasítás második utasítás harmadik utasítás ez már nincs benne Fontos a : és a behúzások. Feltételes elágazás Pythonban Függvények Pythonban from math import sqrt D = b**2-4*a*c if D < 0: print "Nincs valós gyök." elif D == 0: print "Kett s (valós) gyök van." else: print "Két eltér valós gyök van." def masodfoku(a, b, c): D = b**2-4*a*c if D < 0: print "Nincs valós gyök." return elif D == 0: print "Kett s (valós) gyök van." else: print "Két eltér valós gyök van." x1 = -b + sqrt(d) x1 /= 2*a x2 = -b - sqrt(d) x2 /= 2*a return x1, x2
Komplex változat for ciklus Pythonban from future import division from cmath import sqrt def masodfoku(a, b, c): """Másodfokú egyenlet megoldását adja vissza. a, b, c: az egyenlet együtthatói """ sd = sqrt(b**2-4*a*c) x1 = -b + sd x1 /= 2*a x2 = -b - sd x2 /= 2*a return x1, x2 Python példa; fontos a : és a behúzások: szoveg = "alma" for karakter in szoveg: print karakter print karakter.upper() Általános alakja: for <változó> in <listaszer objektum>: <parancsok egyformán behúzva> <parancs, ami már nincs a ciklusban> A listaszer objektum lehet például lista vagy tuple, ekkor az elemeiken megy végig a ciklus, de lehet karakterlánc is, akkor a karakterein. for ciklus Pythonban range Ciklus és számtípusok Gyakran használjuk for-ral a range(n) függvényt. range([start,] stop, [step]) range(5) -> [0, 1, 2, 3, 4] range(2, 5) -> [2, 3, 4] range(2, 8, 3) -> [2, 5] példa for i in [1, 1.03, 1j, 5]: print i, i**100 Eredmény: 1 1 1.03 19.2186319809 1j (1+0j) 5 78886090522101180541172856528278622967320643510902300477027
while ciklus Pythonban while ciklus Pythonban def Euklidesz(a, b): " Visszaadja a legnagyobb közös osztót." if a < b: a, b = b, a while b!= 0: print "%5d %5d" % (a, b) a, b = b, a % b return a lnko = Euklidesz(19*5*5*3*2, 11*7*5*3*2) print "A legnagyobb közös osztó:", lnko Eredmény: 2850 2310 2310 540 540 150 150 90 90 60 60 30 A legnagyobb közös osztó: 30 Lehet máshogy cserélni: a, b = (a,b) if a>b else (b,a) # C-ben: feltétel?igaz-érték:hamis-érték 3-as verzió Saját modulok pi = 3.14 smodul.py Nem teljesen kompatibilis a 2-essel. Pár elavult dolgot helyreraktak. print függvény lett print(a) range iterátort ad lista helyett, ami nem hozza létre az összes számot rögtön: for-ban ugyanúgy, ha lista kell list(range(8)) Küls modulok nem mind léteznek 3-ashoz. Alapból utf-8 kódolás (nem kell megadni). Ékezetes sztringek könnyebb kezelése. Általában python3 utasítással indíthatjuk, ha telepítve van. def negyzet(a): return a*a if name == ' main ': print negyzet(5) modulhivo.py import smodul print smodul.pi print smodul.negyzet(5) from smodul import pi print pi
Almodulok Standard könyvtár A modulok gyakran almodulokat is tartalmazhatnak. Például az os modul path almoduljában vannak az útvonalak összerakásával, szétszedésével kapcsolatos függvények. Példák: import os os.path.join('python', 'nx', 'xx.py') 'python/nx/xx.py' (Un*x), 'python\nx\xx.py' (Windows) from os import path path.join('python', 'nx', 'xx.py') from os.path import join from os.path import * join('python', 'nx', 'xx.py') os: az operációs rendszerrel kapcsolatos dolgokban segít (fájlmásolás, link létrehozása, parancs végrehajtása) sys: a Python m ködésével kapcsolatos modul (elérési útvonal, argumentumok kezelése) urllib: a weboldalak eléréséhez. re: reguláris kifejezések kezeléséhez random: véletlen számok (egyenletes vagy normáis eloszlású véletlen szám, visszatevés nélküli mintavétel listából) thread, threading: szálkezelés xml: XML-el kapcsolatos modul cgi, cgitb: CGI-szkripteléssel kapcsolatos modulok gettext: programok embernyelvi fordításához doctest, unittest: programok embernyelvi fordításához B vebben http://python.org Dokumentation The Python Standard Library Küls modulok Pylab numpy: mátrixm veletek, lineáris egyenletek scipy: széls értékkezelés, numerikus integrálás igraph: gráfok kezelése és kirajzolása, gyors pylab ( matplotlib): a MATLAB-hoz hasonló stílusú számítások, függvényrajzolás (numpy-t használja) NetworkX: gráfok kezelése, kirajzolása matplotlibbel PIL: Python Image Library PyTables: nagy mennyiség hierarchikus adat kezelése Star-P: A numpy párhuzamos rendszerekre írt megfelel je, kereskedelmi from pylab import * x = linspace(-pi, pi, 1024) y = zeros(1024) for i in range(1,16,2): # 1, 3,... 15 y += sin(i*x)/i plot(x,4/pi*y) title(u"négyszögjel Fourier-sora 15 tag") savefig("fourier15.png") show()
NetworkX, packages Adatbázis: DB API 2.0 import packages, pylab, lknegyzetek class DegreeDistribution(): def init (self, graph, direction=none, verbose=true): (...) def errorbar(self, intervals=none): (...) def info(self, file=none): (...) G=packages.get_graph() DD = DegreeDistribution(graph=G) DD.info() DD.info("info.txt") DD.errorbar([(1,100), (101, 20000), (0,100000)]) import pgdb # lehet itt MySQLdb, oracledb... connection = pgdb.connect(database='hp', user='diak',\ password='diak', dsn='mail.roik.bmf.hu') cursor = connection.cursor() # Itt lehet az utasítást megadni: cursor.execute("select * FROM adatok;") # Adatbázis módosításkor kell: connection.commit() eredmeny = cursor.fetchall() for sor in eredmeny: print ", ".join(sor) CGI import cgi import cgitb; cgitb.enable() # A hibafigyeléshez form = cgi.fieldstorage() # CGI-ként a kapott értékek if form.has_key('title'): title = form.getvalue('title') else: title = "CGI-oldal" print "Content-Type: text/html\n" ## CGI print "<html><body>" # és így tovább.