Python (ohjelmointikieli)

Wikipediasta
Siirry navigaatioon Siirry hakuun
Tämä artikkeli käsittelee ohjelmointikieltä. Muita merkityksiä on täsmennyssivulla.
Python
Python logo and wordmark.svg
Paradigma olio, proseduraalinen, funktionaalinen
Tyypitys vahva, dynaaminen
Yleinen suoritusmalli tulkattava
Muistinhallinta roskienkeruu
Julkaistu 1990
Kehittäjä Guido van Rossum
Vakaa versio 3.11.0 ()[1]
Kehitysversio 3.12.0a2 ()[2]
Merkittävimmät toteutukset CPython, Jython, IronPython, PyPy
Vaikutteet ABC, C, Haskell, Modula-3, Icon, Lisp, Perl, Smalltalk, TCL
Vaikuttanut Ruby, Boo
Käyttöjärjestelmä alustariippumaton
Verkkosivu www.python.org
Uutisryhmä comp.lang.python

Python on ohjelmointikieli, jolle on tunnusomaista hyvä luettavuus, korkea abstraktiotaso ja kehittyneet kirjastot monilla eri sovellusalueilla. Python on yksi suosituimmista ohjelmointikielistä[3][4].

Esimerkit[muokkaa | muokkaa wikitekstiä]

Pythonia voi kokeilla helposti interaktiivisen tulkin avulla:

>>> print("Hello, world!")
Hello, world!
>>> 2*42 
84
>>> # Määritellään funktio ja kutsutaan sitä:
>>> def tuntipalkka(palkka, aika):
>>>     return palkka / aika
>>>
>>> tuntipalkka(210, 8)
26.25

Käyttöaiheet[muokkaa | muokkaa wikitekstiä]

Python on yksi suosituimmista ohjelmointikielistä, joten sille on kehitetty runsaasti suosittuja kirjastoja, ohjelmistokehyksiä ja rajapintoja, joiden avulla voidaan luoda paljon erilaisia sovelluksia esim. numeerisen laskennan, grafiikan ja web-kehityksen alueilla.

Pythonia voi käyttää aina yksinkertaisesta numeerisesta laskennasta datatieteeseen ja vaativaan tieteelliseen laskentaan (esim. kirjastot NumPy, SciPy, skicit-learn, pandas). Kuvaajien tekemiseen on useita suosittuja kirjastoja (esim. matplotlib, seaborn).

Pythonissa itsessään ei ole mahdollisuutta ladata kuvia tai muuta mediaa, mutta tämä onnistuu esimerkiksi Pygame-moduulin avulla. Pythonilla voidaan tehdä graafisia käyttöliittymiä muun muassa käyttämällä C++-kielellä kirjoitettua Qt-käyttöliittymäkirjastoa[5]. Myös esim wxPython-, PySide- ja Kivy-kirjastolla voi tehdä GUI-ohjelmia[6].

Python on yleistynyt verkkosivustojen ohjelmointikielenä ja Python-kielelle on saatavilla sekä minimaalisia että kehittyneitä kehitysympäristöjä (esim. Django). Pythonia voidaan ajaa palvelimella WSGI (Web Server Gateway Interface) -rajapinnan avulla, joka on viime aikoina kehitetty Pythonilla toteutettujen verkkosivustojen suorituskykyistä ajoa varten. Pythonille on saatavilla rajapintoja tietokantojen (MySQL, PostgreSQL, SQLite) käsittelyyn.

Pythonia voi laajentaa C- ja C++-ohjelmointikielillä.[7] Toisaalta Pythonia voi sisällyttää C- ja C++-kielisiin ohjelmiin skriptikielenä. Mainittavaa on myös kyky vuorovaikuttaa matlabin kanssa. Nvidian grafiikkapiirien CUDA-ohjelmointi on mahdollista Pythonilla; tällä tavalla laskenta voidaan antaa grafiikkapiirin rinnakkain suoritettavaksi[8].

Ominaisuudet[muokkaa | muokkaa wikitekstiä]

  • Tuottavuus: Pythonista on sanottu, että sitä käyttäen ohjelmoija voi olla 10 kertaa tuottavampi kuin Javaa käyttäen ja 100 kertaa tuottavampi kuin C-kieltä käyttäen[9].
  • Luettavuus: Yleisesti ottaen luonteenomaista Pythonille on pyrkimys selkeään ja luettavaan ohjelmakoodiin. Kauneuden ja yksinkertaisuuden tavoitteleminen ovat keskeinen osa kielen suunnittelufilosofiaa[10].
  • Interaktiivisuus: Python on tulkattava kieli, eli ohjelmat ovat valmiita ajettaviksi välittömästi kääntämättä niitä ensin. Erityisesti tämä lisää kielen interaktiivisuutta eli mahdollistaa ohjelmoimisen ja testaamisen lyhyissä sykleissä.
  • Paradigmaattisuus: Python-kieltä on kehitetty tukemaan useita ohjelmointitapoja; erityisesti sitä voi käyttää oliopohjaisena, proseduraalisena tai funktionaalisena ohjelmointikielenä.
  • Dynaamisuus: Pythonissa esim. muuttujan tyyppiä ei erikseen määritellä, vaan se määräytyy siihen tallennettavan objektin tyypin perusteella ajon aikana. Python-kääntäjät eivät siis tee tyyppitarkistuksia käännösaikaisesti, jolloin virheet aiheuttavat pääsääntöisesti ajonaikaisia poikkeuksia. Tämä voi helpottaa yksinkertaisempien ohjelmien interaktiivista kehitystä, mutta vaikeuttaa monimutkaisempien ohjelmien kehitystä.

Rakenne[muokkaa | muokkaa wikitekstiä]

Pythonissa kaikki rakenteet määritellään objekteina, joilla on identiteetti (id()), tyyppi (type()) ja arvo. Objektin tyyppi kertoo, millaisia operaatioita se sallii ja mitä arvoja se voi saada. Identiteettinä toimii CPython-toteutuksessa objektin osoite muistissa.[11]

Korkeimmalla hierarkian tasolla Python-ohjelmat muodostuvat paketeista ja moduuleista. Paketit ovat erityisiä moduuleja, jotka vastaavat tiedostojärjestelmän kansioita, siinä missä varsinaiset moduulit vastaavat tiedostoja näissä kansioissa. Moduuleihin viitataan tiedostopolun tavoin mallillaimport paketti.alipaketti.moduuli as mdl ja niillä on attribuutteja kuten __name__ ja __file__. Tavallisia paketteja voidaan määritellä lisäämällä kansioon__init__.py-niminen tiedosto, jolloin Python tulkitsee tämän kansion Python-paketiksi ja kansiossa olevat Python-tiedostot moduuleiksi. Python-skriptin ajon aloittava moduuli saa nimen__main__ (eli__name__ == "__main__" on totta).[12]

Python-tulkki ajaa ohjelmat blokkeina yhdessä kehyksessä kerrallaan. Blokkeja muodostavat hierarkisesti skriptit, moduulit, luokat ja funktiot. Nimet näkyvät vain kunkin blokin sisällä, ellei näkyvyyttä olla muutettuglobal- tai nonlocal-avainsanoilla, tai kyseessä ole funktio, jolloin nimet näkyvät kaikille funktion sisältämille blokeille.[13]

Sanastollisesti kukin koodiblokki koostuu nimistä (muuttuja), avainsanoista (for), literaaleista (2.5), operaattoreista (==), erottimista (() ja näiden muodostamista fyysisistä ja loogisista riveistä. Python käyttää lauseiden ryhmittelyyn sisennystä – ei kaarisulkeita kuten monet muut kielet. Kaksoispisteitä käytetään koottuja lauseita aloitettaessa (esim.for i in range(10):), mutta muuten uusi rivi ja oikea sisennys riittää rivin ja lauseen päätteeksi.[14]

Luokkien ja funktioiden lisäksi koottuja lauseita ovat

  • toistamiseenfor x in y tai while ja näissäbreak ja continue
  • ehdolliseen suorittamiseen perinteinenif..elif..elsetai hahmonsovituksenamatch..case..case ja hahmomääritelmissä esim.if(engl. guard),|(tai) ja_(mitä tahansa)
  • poikkeuksienhallintaantry..except..as..else..finally ja
  • kontekstinhallintaanwith..as(yleensä avoin tiedosto).[15]

Yksinkertaisia lauseita Pythonissa ovat muun muassa

  • muuttujaan sijoittaminen kuten x = [1, 2]
  • operaattorisijoittaminen kuten x += 1(sama kuinx = x + 1)
  • tyyppiannotaatiot kuten x: int = 1
  • assert, joka testaa sen jälkeen kirjoitetun ehdon
  • return, joka pysäyttää funktion ja palauttaa objektin (taiNone)
  • import x as y tai from x import y as z, joka tuo moduulin sisällön käyttöön
  • break, joka pysäyttää ympäröivän silmukan
  • continue, joka siirtää ympäröivän silmukan suoraan seuraavaan toistoon
  • del, joka poistaa nimen tai korvaa arvon tyhjällä
  • yield, joka tekee funktiosta generaattorin ja palauttaa objektin (toistuvasti)
  • raise, joka toimeenpanee poikkeuksen
  • pass jota ei tee mitään
  • global, joka tuo nimen käytettäväksi ylimpään nimiavaruuteen, ja
  • nonlocal, joka mahdollistaa pääsyn ulommissa näkyvyyksissä määriteltyihin nimiin.[16]

Lausekkeita Pythonissa ovat muun muassa

  • nimet kuten muuttuja tai __yksityinen_funktio
  • literaalit kuten "string" ja 1.56
  • lausekelistat kuten 1.2, 5.5, 10.2 tai ()
  • näkymät kuten [1,2,3], {"yksi", "kaksi"} ja {"avain": 1.2}(huom. listanäkymä voi sisältää literaalien lisäksi myös ns. comprehension-lauseen mallia[..for..in..if..])
  • nimettömät generaattorit kuten (x^2 for x in range(10))
  • attribuuttireferenssi kuten objekti.muuttuja
  • tilaukset kuten objekti[5](__getitem__())
  • viipaloinnit kuten nimi[0:10:2]
  • kutsut kuten nimi()
  • await-lauseke, joka tauottaa ko-rutiinin ajon
  • potenssioperaattori**
  • unääriset operaattorit kuten +5, -2 ja ~x(__invert__())
  • binääriset aritmeettiset operaattorit+, -, *, @(matriisitulo),/, //(__floordiv__()) ja%(__mod__())
  • binääriset bittioperaattorit|(tai),&(ja) ja^(poissulkeva tai)
  • vertailulausekkeet<, >, ==, >=, <=, !=, in, not in, is ja is not
  • Boolen operaattoritand, or ja not(huom.and ja oreivät palauta totuusarvoja vaan viimeisimmän lausekkeen arvon, ja Boolen operaatioissaNone, 0 ja tyhjät tietorakenteet saavat myös totuusarvonFalse)
  • mursu-operaattori:=, joka antaa nimen lausekkeelle ja palauttaa sen arvon
  • tiivis ehtolausex if y else z ja
  • nimettömät funktiot kuten lambda x, y: x**y.[17]

Sisäänrakennettuja tyyppejä ovat muun muassa

  • numerotyypit kuten numbers.Number, numbers.Integraleliint ja bool, numbers.Realelifloat ja numbers.Complexelicomplex
  • None, joka edustaa puuttuvaa arvoa
  • sekvenssityypit kuten str, tuple, bytes, list, bytearray, array
  • kuvaustyyppidict(sanakirja)
  • kutsuttavat tyypit kuten käyttäjän määrittelemät ja sisäänrakennetut funktiot, metodit, generaattorit, ko-rutiinit, instanssimetodit, luokat ja luokkainstanssit
  • moduulit, jotka edustavat loogista joukkoa objekteja
  • I/O, joka edustaa avoimia tiedostoja
  • NotImplemented, joka edustaa puuttuvaa toteutusta
  • Ellipsis tai ... jota käytetään pääasiassa viipalointilausekkeissa edustamaan jotakin jatkumoa tai väliä
  • sisäiset tyypit kuten koodi-, ajokehys-, traceback- ja viipaleobjektit sekä staattisten metodien ja luokkametodien objektit.[11]

Python on dynaamisesti tyypittävä, joten Pythonissa voidaan käyttää ns. ankkatyypitystä (engl. duck typing) eli objektin attribuutteja ja metodeja käytetään varsinaisesta tyypistä huolimatta ja mahdolliset tyyppivirheet otetaan vastaan ja käsitellään ("helpompi pyytää anteeksi kuin lupaa"). Kun tyyppivirheitä ei ole, objekti on käytännössä haluttua tyyppiä, koska sillä on sama rajapinta ("liikkuu ja vaakkuu kuin ankka, eli kyseessä on ankka"). Ankkatyypityksellä voidaan toteuttaa näin olio-ohjelmoinnin polymorfinen korvaus ilman periytymistä ja eksplisiittistä riippuvuutta valittuun tyyppiobjektiin.[18]

Luokat määritellään syntaksillaclass Luokka(Yläluokka1, Yläluokka2): ja luokan sisältö sisennetään tästä, mikä luo paikalliseen ympäristöön luokka-objektin. Luokassa määriteltyjä muuttujia kutsutaan attribuuteiksi ja funktioita metodeiksi. Metodien ensimmäinen argumentti ottaa vastaan aina objektin ja argumentin nimenä käytetäänself jolloin metodia voidaan kutsua tyylilläobjekti.metodi().[15] Luokille voidaan antaa erityisiä metodeja, jotka määrittelevät, mitä Pythoniin sisäänrakennetut operaattorit ja funktiot tekevät kyseisen tyypin objekteille (engl. operator overloading). Näitä ovat muun muassa__init__()(alustus),__str__()(tekstiesitys),__lt__()(<-operaattori) ja__eq__()(==-operaattori). Uusi luokka voi siten emuloida sisäänrakennettuja tyyppejä, kun sille määritellään tarvittavat erityismetodit.[11]

Funktiot määritellään tyylillädef func(arg=None, *args, **kwargs): ja funktion sisältö sisennetään tästä, mikä luo paikalliseen ympäristöön kyseisen nimisen funktio-objektin.=määrittelee parametrille oletusarvon,*kaappaa ylimääräiset nimeämättömät argumentit yhteen tuple-objektiin ja**kaappaa ylimääräiset nimetyt argumentit yhteen sanakirjaan. Funktion argumentiksi voidaan antaa myös lauseke; tällöin vaaditaan, että*lausekepalauttaa generaattorin ja**lausekepalauttaa kuvauksen (esim. sanakirjan)[17]. Funktioita määritellessä tyyppivihjeet ovat muotoadef func(x: Tyyppi) -> Tyyppi:. Ennen funktion määritelmää voi lisäksi olla useita ns. decorator-lauseita – mallia@deco(arg)– jotka ottavat funktion argumenttina ja palauttavat sen jollakin tavalla muunnettuna.[15]

Ko-rutiinit (esim.async def func(x):) ovat erityisiä funktioita, jotka sallivat ajon tauottamisen ja jatkamisen käyttämällä avainsanojaawait, async for ja async withlauseita.[15]

Generaattorifunktiot palauttavat generaattorin, jolla on__next__(), send, throw() ja close()-metodit. Tyypillisestifor-silmukka käyttää sitä tuottamaan (yield) arvoja silmukkaan – näin koko iteroitavaa objektia ei tarvitse pitää muistissa kerralla. Generaattorikorutiini on tätä vastaava, mutta asynkroninen.

Käyttö[muokkaa | muokkaa wikitekstiä]

Python-tulkkia käytetään pääasiassa komentoriviltä antamalla ensimmäisessä argumentissa Python-skriptin tiedostonimi (esim.python hei-maailma.py). Python-tulkin aloitusympäristössä on alustettuna kolme moduulia –sys, builtins ja __main__– ja kaikki sisäänrakennetut ja standardimoduulit ovat käytettävissäimport-lauseella. Interaktiivisessa tilassa tulkki käsittelee yhden lauseen kerrallaan, muuten koko lähdetiedoston.[19]

Ympäristönhallintaohjelmat (esim. conda, venv) mahdollistavat useiden eri Python- ja kirjastoversioiden käytön samassa käyttöjärjestelmässä ilman konflikteja.

Toteutukset[muokkaa | muokkaa wikitekstiä]

Python-kielestä on tehty useita toteutuksia. Tunnetuimmat ovat C-ohjelmointikielellä tehty alkuperäinen (kielen määrittelevä) toteutus ja Java-ohjelmointikielellä tehty Jython. Muita toteutuksia ovat esimerkiksi IronPython .NET- ja Mono-alustoille sekä Python-kielellä itsellään uudelleentoteutettu PyPy. Mobiilialustoista Python on sovitettu myös Symbian S60 -alustalle [20]. Lisäksi kielestä on kehitetty Maemo-alustaan optimoitu versio [21]. Sulautettujen järjestelmien ohjelmointiin on myös MicroPython.

Python-tulkki ja -kirjastot on kehitetty avoimen lähdekoodin projektina, ja niitä levitetään Pythonin oman lisenssin (Python Software Foundation License) alaisena, joka on yhteensopiva myös GPL-lisenssin kanssa. Pythonin lisenssi sallii lisäksi kaikenlaisen kaupallisen käytön ja jopa kaupallisen uudelleenlevittämisen.

Python-koodin tulkitseminen ja ajoa edeltävä optimointi saattavat joskus olla hitaita prosesseja, ja Pythonia ajetaankin useimmiten tavukoodina hieman Javan tapaan. Tämä vie ohjelman suorituksesta pois yhden hitaammista vaiheista, tulkkaamisen tavukoodiksi; tulkkaamattoman Python-skriptin ajaminen saattaa olla moninkertaisesti tavallisen C-kielisen ohjelman ajamista hitaampaa. Toisaalta suurimmat eroavuudet suorituskyvyssä liittyvät käytettyihin tietorakenteisiin ja algoritmeihin, joten Python-kielinen toteutus ei ole automaattisesti hitaampi. Lisäksi Pythoniin voi tehdä helpohkosti C-kielisiä laajennoksia, jos erityinen nopeus on tarpeen.

Historia[muokkaa | muokkaa wikitekstiä]

Ensimmäinen versio Python-kielestä syntyi 1980-luvun loppupuolella. Alun perin kieli tehtiin jatkoksi ABC-ohjelmointikielelle[22] korjaamalla siinä havaittuja puutteita ja tuomalla sen piirteisiin muun muassa poikkeusten käsittelyn[23]. Kielen luoja Guido van Rossum on pysynyt kielen kehityksessä mukana koko sen historian ajan keskeisessä roolissa.

Python on alun perin nimetty brittiläisen komediaryhmä Monty Pythonin tunnetun Monty Pythonin lentävä sirkus -televisiosarjan mukaan. Python-nimi koettiin lisäksi tarpeeksi lyhyeksi, yksilöiväksi sekä sopivan mysteeriseksi. Kielen dokumentaation koodiesimerkeissäkin pyritään välttämään liiallista vakavuutta satunnaisilla viittauksilla ryhmän tuotantoon.[24].

Alkuperäisestä Python-kielestä jalostettu Python 2.0 julkaistiin 16. lokakuuta 2000. Kielen toinen täysversio sisälsi useita uusia ominaisuuksia, mukaan lukien täydellisen roskienkeruumekanismin ja Unicode-tuen. Suurin muutos tapahtui kuitenkin itse kielen kehitysprosessissa, jossa Python-yhteisölle annettiin vapaammat kädet osallistua mukaan kielen kehitykseen [25].

Joulukuussa 2008 ilmestynyt Pythonin versio 3.0 toi kieleen jonkin verran uudistuksia. Periaatteena sen kehityksessä oli vähentää ominaisuuksien rinnakkaisia toteutustapoja poistamalla vanhoja tapoja tehdä asiat. Tästä seuraa, ettei kielen uusin versio ole taaksepäin yhteensopiva, eivätkä 2-versioiden mukaiset ohjelmat siis välttämättä toimi sellaisenaan. Muutoksia ovat muun muassa:[26]

  • print-avainsanan korvaaminen print()-funktiolla
  • raw_input-funktion korvaaminen yksinkertaisempaan input-funktioon
  • with-lause [27]
  • Jako-operaattorin / toiminnan muuttaminen niin, että int/int palauttaa float-tyyppisen luvun. Vanhaa jakolaskuoperaattoria voidaan vielä käyttää kirjoittamalla //

Version 3 ja sen tuomien muutosten käyttöönottoa on pyritty tukemaan monella tavalla. Versiolla 2.5 voi ottaa jo käyttöön joitain uudistuksia komennolla from __future__ import *. Samoin versiolla 2.6 voidaan ottaa käyttöön kaikki version 3.0 tuomat uudistukset. Lisäksi Python 2.6:lla voidaan aktivoida varoitukset vanhanmallisen koodin käytöstä. Tämä helpottaa vanhanmallisen lähdekoodin muuttamista versiolle 3.0 sopivaksi. Lisäksi saatavilla on 2to3 työkalu, joka muuttaa valtaosan 2-sarjan koodista 3-versioon.

Lähteet[muokkaa | muokkaa wikitekstiä]

  1. (en) Python 3.11 Released With Big Performance Improvements, Task Groups For Async I/O, (viitattu ). Arvo on haettu Wikidatasta.
  2. (en) Python 3.12.0 alpha 2 released, (viitattu ). Arvo on haettu Wikidatasta.
  3. https://web.archive.org/web/20220830131730/https://statisticstimes.com/tech/top-computer-languages.php
  4. https://insights.stackoverflow.com/survey
  5. http://qt-project.org/wiki/PySideDownloads/
  6. https://medium.com/issuehunt/13-python-gui-libraries-a6196dfb694
  7. https://docs.python.org/2/extending/extending.html
  8. https://developer.nvidia.com/how-to-cuda-python
  9. https://www.python.org/about/quotes/
  10. http://www.python.org/dev/peps/pep-0020
  11. a b c https://web.archive.org/web/20220908124010/https://docs.python.org/3/reference/datamodel.html
  12. https://web.archive.org/web/20220827204401/https://docs.python.org/3/reference/import.html
  13. https://web.archive.org/web/20220908064020/https://docs.python.org/3/reference/executionmodel.html
  14. https://web.archive.org/web/20220907093905/https://docs.python.org/3/reference/lexical_analysis.html
  15. a b c d https://web.archive.org/web/20220906134350/http://docs.python.org:80/3/reference/compound_stmts.html
  16. https://docs.python.org/3/reference/simple_stmts.html
  17. a b https://web.archive.org/web/20220907093916/https://docs.python.org/3/reference/expressions.html
  18. http://docs.python.org/glossary.html#term-duck-typing
  19. https://web.archive.org/web/20220610231201/https://docs.python.org/3/reference/toplevel_components.html
  20. http://opensource.nokia.com/projects/pythonfors60/
  21. http://pymaemo.garage.maemo.org/
  22. http://mail.python.org/pipermail/python-dev/2000-August/008881.html
  23. http://www.python.org/doc/faq/general/#why-was-python-created-in-the-first-place
  24. http://www.python.org/doc/faq/general/#why-is-it-called-python
  25. http://www.amk.ca/python/2.0/
  26. https://web.archive.org/web/20220829124947/http://docs.python.org/3.0/whatsnew/3.0.html
  27. http://www.python.org/dev/peps/pep-0343/

Aiheesta muualla[muokkaa | muokkaa wikitekstiä]

Commons
Wikimedia Commonsissa on kuvia tai muita tiedostoja aiheesta Python (ohjelmointikieli).