Python (programozási nyelv)

A Wikipédiából, a szabad enciklopédiából
(Python programozási nyelv szócikkből átirányítva)
Python
250px

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.