Python (programozási nyelv)

A Wikipédiából, a szabad enciklopédiából
Python
Python logo and wordmark.svg

Paradigma többelvű
Jellemző kiterjesztés .py, .pyw, .pyc, .pyo, .pyd
Megjelent 1991
Tervező Guido van Rossum
Fejlesztő Python Software Foundation
Utolsó kiadás 3.3.3/2.7.6 (2013. november 19./2013. november 10.)
Típusosság erős, dinamikus
Fordítóprogram CPython, Jython, IronPython, PyPy
Megvalósítások CPython, IronPython, Jython, Python for S60, PyPy
Hatással volt rá ABC, C, Haskell, Icon, Lisp, Modula-3, Perl, Smalltalk, Tcl
Befolyásolt nyelvek Ruby, Boo
Operációs rendszer platformfüggetlen
Licenc Python Software Foundation License
Weboldal


A Python egy általános célú, nagyon magas szintű programozási nyelv[1], melyet Guido van Rossum holland programozó kezdett el fejleszteni 1989 végén, majd hozott nyilvánosságra 1991-ben.[2] A nyelv tervezési filozófiája az olvashatóságot és a programozói munka megkönnyítését helyezi előtérbe a futási sebességgel szemben.[3][4]

A Python többek között a funkcionális, az objektumorientált, az imperatív és a procedurális programozási paradigmákat támogatja. Dinamikus típusokat és automatikus memóriakezelést használ, ilyen szempontból hasonlít a Scheme, Perl és Ruby nyelvekhez, emellett szigorú típusrendszerrel rendelkezik.

A Python úgynevezett interpreteres nyelv, ami azt jelenti, hogy nincs különválasztva a forrás- és tárgykód, a megírt program máris futtatható, ha rendelkezünk a Python értelmezővel. A Python értelmezőt számos géptípusra és operációs rendszerre elkészítették, továbbá számtalan kiegészítő könyvtár készült hozzá, így rendkívül széles körben használhatóvá vált.

Története[szerkesztés | forrásszöveg szerkesztése]

A Python alapötlete az 1980-as évek végén született meg.[5] A fejlesztést 1989 decemberében kezdte el Guido van Rossum a CWI-n.[6] A CWI (Centrum Wiskunde & Informatica, magyarul Matematikai és Informatikai Központ) egy kutatóintézet Amszterdamban. A nyelv a nevét a Monty Python csoportról kapta.[7] 1991 februárjában jelent meg az első nyilvános változat (0.9.0 verzió néven) az alt.sources hírcsoportban.[8] 1994-ben jött létre a comp.lang.python hírcsoport, ami egy jelentős mérföldkő volt a nyelv fejlődésében.[5] Szintén 1994-ben látott napvilágot az 1.0 verzió, amit az ezredfordulón, 2000 októberében követett a Python 2.0, majd pedig 2008-ban a Python 3.0.[9]

Egyszerű adattípusok[szerkesztés | forrásszöveg szerkesztése]

A Python különbséget tesz a mutálható és a mutálhatatlan típusok között. Ezek a fogalmak első közelítésben a megváltoztathatóságra utalnak, ám a pontos különbség ennél finomabb.[10] [11]

A Python 3 beépített típusai
típus leírás példa
str
Unicode string
'Wikipédia'
"Wikipédia"

"""Több
soros
string"""
bytearray
Bájtok (mutálható) sorozata.
bytearray(b'Some ASCII')

bytearray(b"ASCII karakterek")

bytearray([119, 105, 107, 105])
bytes
Bájtok (mutálhatatlan) sorozata.
b'ASCII karakterek'

b"ASCII karakterek"

bytes([119, 105, 107, 105])
list
List típus, ami eltérő típusokat is tartalmazhat, azaz nem tipizált lista.
[4.0, 'string', True]
tuple
Rendezett n-es.
(4.0, 'string', True)
set
frozenset
Rendezetlen halmaz adattípusok. Duplikátumokat nem tartalmazhatnak.
Nem tipizáltak, azaz eltérő típusú elemeket is tartalmazhatnak, ha azok hasíthatóak.
{4.0, 'string', True}

frozenset([4.0, 'string', True])
dict
Hasítótábla, más néven szótár vagy asszociatív tömb adattípus.
Kulcs-érték párokat tartalmazhat. A kulcsoknak hasíthatónak kell lenniük.
{'key1': 1.0, 3: False}
int
Tetszőleges méretű egész szám adattípus.
42
float
Lebegőpontos szám, melynek pontossága az implementáló rendszertől függ.
3.1415927
complex
komplex szám adattípus valós és képzetes résszel.
3+2.7j
bool
Kétértékű logikai adattípus.
True

False

Kivételkezelés[szerkesztés | forrásszöveg szerkesztése]

A kivételkezelés a try kulcsszóval történik. Például így:

 try:
  f()
 except (NameError,TypeError):
  print('Az f függvény végrehajtása során NameError vagy TypeError lépett fel.')
 except:
  print('Nem várt kivétel lépett fel.')
 else:
  print('Semmilyen kivétel nem lépett fel.')
 finally:
  print('Ez a mondat mindenképp kiíródik'.)

Ha olyan kivétel lép fel a try blokkban, ami valamely except ágban szerepel, akkor a vezérlés az illető except ágnak adódik át. Egy except ág több kivételtípust is kezelhet, az egyes kivételtípusokat vesszővel elválasztva lehet megadni.

Az except ág lefutása után a try blokk utáni részen folytatódik a program. Ha nem lép fel semmilyen kivétel, akkor a vezérlés az else ágra kerül a lefutás után, ha az létezik. Mindig csak egy except ág fut le. Ha az utolsó except ág nem ad meg kivételtípust, akkor az kezeli az összes olyan kivételt, amit a megelőző ágak nem kezeltek. Végül szerepelhet egy opcionális finally blokk, ami mindenképpen lefut.

Ha nincs megfelelő except ág, akkor továbbadódik a kivétel a tartalmazó blokknak. Az except ágakban fellépő kivételek szintén a tartalmazó blokknak adódnak át. Ha egyáltalán nincs try blokk, például egy függvényben, akkor minden kivétel a tartalmazó blokknak adódik át.

 def hibas_fuggveny():
  x=1/0
 try:
  hibas_fuggveny()
 except ZeroDivisionError as ex:
  print('Nullával osztás.', ex)

A nyelv tartalmaz beépített kivételeket, de a lehetőség van saját kivételeket definiálására is. A kivételek paraméterezhetőek, típusuktól függően más és más paraméterük lehet. Kivétel kiváltására a raise kulcsszó alkalmazható:

 raise NameError('Hello')

Osztályok, öröklődés[szerkesztés | forrásszöveg szerkesztése]

A Python osztálymechanizmusának tervezésénél a szempont az volt, hogy minimális szintaktikai és szemantikai újdonságokat vezessenek be. C++ és a Modula-3 osztálymechanizmusának a keveréke. Többszörös öröklődésre is lehetőséget ad, a származtatott osztály átdefiniálhatja az ősosztálya(inak) metódusait, egy metódus hívhatja az ősosztály metódusát ugyanazon a néven. Az objektumok tartalmazhatnak privát adatokat. Különbségek a C++-hoz képest, hogy az osztály- és objektumváltozók publikusak (kivéve a dupla aláhuzással kezdődőeket), és minden tagfüggvény virtuális.

A Python a szokásos értelemben nem használ konstruktor és destruktor függvényeket, de a nem kötelezően definiálandó, speciális "__init__" és "__del__" tagfüggvényeket a rendszer az objektumpéldány létrehozásakor, illetve az objektum explicit törlésekor ("del" utasítás) vagy amikor a "szemétgyűjtő" felszabadítja a tárhelyet, automatikusan meghívja. Az "__init__"-et nagyon gyakran használják az tagváltozók kezdeti értékadására:

  class MyObject:
    def __init__(self,name):
       self.name = name
 
  myobj = MyObject("Ez a nevem")
  print(myobj.name) # Kiírja, hogy "Ez a nevem"

Az osztályok maguk is objektumok – valójában a Pythonban minden adattípus objektum. A 2.2-es verziótól kezdve a beépített típusokat is bővítheti a felhasználó. Minden operátor felüldefiniálható speciális nevű tagfüggvényekben. (Például a "+" a "__add__", "__radd__", "__ladd__" segítségével, a "*" a "__mul__", "__rmul__", "__lmul__" segítségével stb.)

Ugyanarra az objektumra több néven is lehet hivatkozni, objektumok esetében értékadás alapértelmezés szerint referenciát (hivatkozást) jelent, nem új objektumpéldány létrehozását.

Osztálydefiníció:

 class ClassName:
    statement-1
    ...
    statement-N
 
#Például:
 
 class MyClass:
    "Egy egyszerű példa osztály"
    i = 42
    def f(x):
        return 'hello world!'

Az osztálynak mielőtt hatása lenne, a vezérlésnek rá kell futnia az osztálydefinícióra, így akár egy if-ágban is lehet osztálydefiníció! Az osztály-objektum az osztálydefiníció végén automatikusan létrejön. Példányosítani úgy tudunk, mintha egy paraméter nélküli függvényt hívnánk meg ( x = MyClass() ). Az adat attribútumok, mint lokális változók, nem előre definiálandók: első használatukkor jönnek létre. Példa:

 x = MyClass
 x.counter = 1
 while x.counter < 10:
     x.counter = x.counter * 2
 print(x.counter)
 del x.counter

Ez a kis példa 16-ot ír ki (nem a legegyszerűbb módon), és semmilyen nyoma nem marad az osztályban, hisz a del utasítással töröltük. Metódus attribútum:

  • x.f helyes hivatkozás, hisz MyClass.f egy függvény
  • x.i helytelen, hiszen MyClass.i nem függvény

x.f nem ugyanaz, mint MyClass.f! x.f egy metódus objektum, nem függvényobjektum. x.f() – ki fogja írni: hello world. Ugyanis az objektum, mint első argumentum átadódik a függvénynek, azaz x.f() ekvivalens MyClass.f(x) -szel.

További megjegyzések:

  • az adat attribútumok felülírják az ugyanolyan nevű metódus attribútumot! Ezért célszerű valamilyen névkonvencióval kizárni az ilyen lehetőséget.
  • nincs lehetőség az adatelrejtésre – az adat attribútumokat éppúgy elérik a metódusok, mint az objektum kliensei.
  • az előbbi megjegyzés lehetővé teszi, hogy kliensek elrontsák az invariánst, ha meglévő adat attribútumot írnak. Ezt kerülni kell, mivel a nyelv nem nyújt rá lehetőséget.
  • ha létezik egy __init__() metódusa az osztálynak, akkor példányosításkor az objektum létrehozása után meghívódik, átadva a példányosításkor esetleg megadott paramétereket:
    class Complex:
        def __init__(self, realpart, imagpart):
            self.r = realpart
            self.i = imagpart
 
    x = Complex(3.0,-4.5)
#(többszörös) öröklődés
 
class DerivedClassName([modulename.]Base1[,[[modulename.]Base2,])

Ha egy hivatkozást nem talál az aktuális osztályban, akkor Base1-ben keresi,ha Base1-ben sincs, akkor Base1 őseiben. Ezután ha még mindig nem találta, akkor Base2-ben kezdi el keresni, és így tovább. Rekord vagy struct-szerű objektumok létrehozása:

 class Dolgozo:
    pass        # ez egy űres osztálydefiníció
 
 John = Dolgozo()
 John.nev = 'John Cosinus'
 John.osztaly = 'Matematikai reszleg'
 John.fizetes = 42000

A kivételek lehetnek osztályok és nem csak string objektumok. Forma: raise instance vagy raise Class, instance. Egy except klóz kompatibilis a kivétellel, ha ugyanabban az osztályban vannak vagy a kivétel egy ősosztályban van. Példa:

 class B:
    pass
 class C(B):
    pass
 class D(C):
    pass
 
 for c in [B,C,D]:
    try:
        raise c()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")

Az eredmény B,C,D ebben a sorrrendben. Ha azonban az except ágakat fordítva írtuk volna, akkor az eredmény B,B,B lett volna, mert a legelső illeszkedő except ág aktivizálódik.

Szabványos könyvtárak[szerkesztés | forrásszöveg szerkesztése]

A Pythonnak igen kiterjedt és széles körű standard könyvtára van, amit még kiegészítenek az egyéb (mások által megírt) publikus modulok. A standard könyvtár adattípusokat (például számokat és listákat) tartalmaz, amelyeket egyébként a nyelv magjának tekintenek. Tartalmaz még beépített függvényeket és kivételeket, melyeket használni lehet import nélkül, viszont a legnagyobb rész természetesen modulokban van. A modulok egy részét C-ben írták meg, és beépítették az interpreterbe, másokat python forráskódban kell importálni.

Ismertebb Pythonra épülő alkalmazások[szerkesztés | forrásszöveg szerkesztése]

A LAMP tartalmazza a Pythont is
  • a Zope alkalmazáskiszolgáló,
  • ill. a Zope-ra épülő Plone tartalomkezelő-rendszer (CMS)
  • Mailman levelezési listakezelő
  • Trac projekt-kezelő rendszer
  • a kéretlen reklámleveleket kiszűrő SpamBayes
  • az egyik leghíresebb fájlcserélő szoftver, a BitTorrent eredeti implementációja
  • A Blender 3D modellező-animációs program, ami ezért GE-ként is működik, pythonból scriptelhető

Jegyzetek[szerkesztés | forrásszöveg szerkesztése]

  1. General Python FAQ. python.org. Python Software Foundation. (Hozzáférés: 2009. június 27.)
  2. General Python FAQ. Python Programming Language – Official Website. Python Software Foundation. (Hozzáférés: 2010. március 16.)
  3. What is Python Good For?. General Python FAQ. Python Software Foundation. (Hozzáférés: 2008. szeptember 5.)
  4. What is Python? Executive Summary. Python documentation. Python Software Foundation. (Hozzáférés: 2007. március 21.)
  5. ^ a b The Making of Python. Artima Developer. (Hozzáférés: 2007. március 22.)
  6. A Brief Timeline of Python. Guido van Rossum. (Hozzáférés: 2009. január 20.)
  7. http://docs.python.org/2/faq/general.html#why-is-it-called-python
  8. HISTORY. Python source distribution. Python Foundation. (Hozzáférés: 2007. március 21.)
  9. http://www.python.org/download/releases
  10. Python Documentation - 3. Data Types. (Hozzáférés: 2013. október 7.)
  11. Immutable vs mutable types - Python. (Hozzáférés: 2013. október 7.)

További információk[szerkesztés | forrásszöveg szerkesztése]

Commons
A Wikimédia Commons tartalmaz Python (programozási nyelv) témájú médiaállományokat.