Python

hello.py

hello_luento.cgi (lähdekoodi)

Uusin Python-luento

Vanha Python-luento

Vielä vanhempi Python-luento

Python on korkean tason ohjelmointikieli, jonka suunnittelussa on panostettu erityisesti kielen luettavuuteen. Monesta muusta kielestä poiketen Python käyttää koodin sisennyksiä koodilohkojen merkintään.

Python

Pythonin syntaksiin kannattaa tutustua esim. seuraavien tutoriaalien ja ohjeiden avulla:

Seuraavassa on käyty läpi tärkeimpiä Pythonin piirteitä. Lähteenä on käytetty pääasiassa Jussi Kasurisen Python ohjelmointiopasta ja Python tutoriaali.

Muuttujat

Merkkijonot

Python 2.7:ssa on hämäävästi kahta eri tyyppiä olevia merkkijonoja: str ja unicode. Käytä aina unicode-tyyppiä. str-tyyppi tarkoittaa oikeasti tavujonoja (bytes) eikä merkkijonoja ja sen käyttäminen aiheuttaa vain ongelmia.

j = "tämä on bytestring" # bytestring
k = u"tämä on unicode-merkkijono" #unicode, käytä aina tätä

Jatkossa kun tässä dokumentissa käytetään sanaa merkkijono niin tarkoitetaan unicode-merkkijonoa

Pythonissa merkkijonoja voidaan esittää seuraavilla tavoilla:

Listat

Listojen palastelu tapahtuu samaan tapaan kuin merkkijonoilla.

Listoja voi muuttaa päinvastoin kuin merkkijonoja

a = [1, 2, 3, 'foo', 'bar']
a[0] = 3 # [3, 2, 3, 'foo', 'bar']
a[1] = a[2] * 3 #[3, 9, 3, 'foo', 'bar']
a[2:1] = [u'kukku',u'luuruu'] #  [3, 9, 3, u'kukku', u'luuruu', u'foo', u'bar']

Yhteisiä funktioita merkkijonoille ja listoille:

Listojen metodeja

Operaattorit

Seuraavassa on listattu Pythonin tärkeimmät operaattorit:

if

a = 3
if a> 0:
  print u"a on suurempi kuin 0"
elif a < 0:
  print u"a on pienempi kuin 0"
else:
  print u"a on 0"

Toistorakenteet

laskuri = 12

while laskuri> 0:
  laskuri = laskuri - 1


a = [1,2,3,u'foo',u'bar']

for x in a:
  print x

for x in a[:]:  #tekee kopion a:sta. tarpeellinen jos aikoo muuttaa listaa
  print x

for i in range(1, 5): #range-funktio luo listan halutulta numeroväliltä
  print i

for käy järjestyksessä läpi rakenteen kaikki alkiot. vrt. Perlin foreach.

Läpikäytävää rakennetta ei pidä muuttaa läpikäynnin aikana. Jos muutoksia pitää tehdä niin on syytä käydä läpi rakenteen kopiota.

Funktiot

def summa(a, b):    # laskee lukujen summan
  summa = a + b
  return summa

Funktioiden parametrit ovat referenssejä joten niiden arvojen muuttaminen vaikuttaa suoraan kutsuvaan ohjelmaan (call-by-reference).

Jos parametrina vie immutable-tyyppisiä muuttujia niin niitä ei tietenkään voi muuttaa funktiossa. Esim. kokonaisluvut, merkkijonot ja tuplet ovat immutable. Kts. Parameter Passing

Moduulit

Pythonissa voi jakaa ohjelmansa moduuleihin tai käyttää valmiita moduuleja

import cgi

Oman moduulin voi luoda kirjoittamalla python-funktioita tiedostoon, jonka nimi päättyy .py

Poikkeukset

Pythonissa lähes kaikki virheet aiheuttavat poikkeuksen. Poikkeukset käsitellään seuraavasti:

#!/usr/bin/python
# -*- coding: utf-8 -*-

try:
    if int(u"a"):
        print "onpas kummaa. a oli kokonaisluku" 
#nappaa kiinni kaikki mahdolliset virheet
except: 
    print u"ei ollunna integer"

# edellä oleva ei ole hyvä debuggaamisen kannalta koska nappaa kiinni 
# myös kirjoitusvirheet funktioiden nimissä ja python-tulkin oma 
# virheilmoitus jää näyttämättä

try:
    if Int(u"a"): # tulee virhe koska Int ei ole olemassa
        print u"onpas kummaa. a oli kokonaisluku" 
#nappaa kiinni kaikki mahdolliset virheet
except: 
    print u"ei ollunna integer"

# parempi napata kiinni vain se olennainen virhe
try:
    if int(u"a"):
        print u"onpas kummaa. a oli kokonaisluku" 
except ValueError:
    print u"ei ollunna integer"

# nyt pitäisi toimia tulkin oma virheilmoitus
try:
    if Int(u"a"):
        print u"onpas kummaa. a oli kokonaisluku" 
except ValueError:
    print u"ei ollunna integer"
 

kts. Idioms and Anti-Idioms in Python

Sanakirja (dict)

Pythonissa on myös erittäin kätevä tietotyyppi dict eli sanakirja jota muissa ohjelmointikielissä kutsutaan mm. assosiatiiviseksi taulukoksi. dict-tietotyyppi on siis järjestämätön taulukko jossa alkioihin viitataan uniikeilla avaimilla.

>>> testi = dict([[1,2], [2,2], [u'kolme',3], [u'neljä',4]])
>>> testi
{u'nelj\xe4': 4, 1: 2, 2: 2, u'kolme': 3}
>>> for x in testi.keys(): print x
...
neljä
1
2
kolme
>>> for x in testi.keys(): print testi[x]
...
4
2
2
3
>>> testi['kolme']
3
>>> testi[2]
2
>>> testi[1]
2

Monikot (tuple)

Monikko eli tuple on listaa vastaava tietorakenne, jonka sisältöä ei voi muuttaa.

a = (1,2,3,u"testi")

print a

a=[0] # ei onnistu

Joukko (set)

Pythonin erikoisempiin tietotyyppeihin kuuluu set eli joukko. Joukko ei voi sisältää duplikaatteja ja siihen voi soveltaa joukko-opin operaatioita kuten yhdiste, leikkaus, erotus jne.

>>> lista = [u'tommi', u'antti', u'ville', u'tommi']
>>> joukko = set(lista)
>>> joukko
set([u'ville', u'antti', u'tommi'])
>>> u'tommi' in joukko
True
>>> u'kalle' in joukko
False
>>> joukko2 = set([u'joonas',u'antti',u'kalle'])
>>> joukko2
set([u'joonas', u'kalle', u'antti'])
>>> joukko - joukko2 #henkilöt joukosta jotka eivät ole joukko2:ssa
set([u'ville', u'tommi'])
>>> joukko & joukko2 #henkilöt jotka ovat molemmissa joukoissa
set([u'antti'])
>>> joukko ^ joukko2 #henkilöt jotka ovat jommassa kummassa joukossa mutta eivät molemmissa
set([u'joonas', u'kalle', u'tommi', u'ville'])
>>> joukko | joukko2 #henkilöt jotka ovat jommassa kummassa joukossa
set([u'ville', u'joonas', u'kalle', u'antti', u'tommi'])

Luokat

Luokat toimivat kuten muissakin kielissä. Muutama erikoisuus on syytä huomioida. Lue Class tutorial

#!/usr/bin/python
# -*- coding: utf-8 -*-

#suoraan luokan alla esitellyt muuttujat ovat luokkakohtaisia muuttujia. Tämän huomaa
#jos käyttää tietotyyppejä, jotka sallivat sisältönsä muuttamisen 
class Ihminen:
    nimi = u"Kalle"
    tiedot = []   
    def __init__(self, sukupuoli=u"Nainen"):
        self.data = [sukupuoli]
    def tulosta(self):
        # on käytettävä self
        print self.nimi
        print self.tiedot
        print self.data
        
   
mies = Ihminen(u"Mies")
nainen = Ihminen()

mies.nimi = u"Tommi"

mies.tiedot.append(u"180 cm")
mies.tiedot.append(u"75 kg")

print mies.nimi

nainen.nimi = u"Hellu"

print nainen.nimi

print mies.nimi

# molemmilla on samat tiedot!
print mies.tiedot
print nainen.tiedot

nainen.tiedot.append(u"170 cm")
nainen.tiedot.append(u"75 kg")

print mies.tiedot
print nainen.tiedot

# data on kummallakin oma, koska se on esitelty konstruktorissa
print mies.data
print nainen.data

mies.data.append(u"30 v")
nainen.data.append(u"35 v")

print mies.data
print nainen.data

# voidaan myös lennosta keksiä uusia ominaisuuksia vrt. Javascript
# nämä ovat instanssikohtaisia
mies.osoite = u"Taitoniekantie 9 B 701"
nainen.osoite = u"Emännäntie 13"

print mies.osoite
print nainen.osoite

# metodia kutsuttaessa ensimmäisenä olevaa self-parametriä ei käytetä. Python hoitaa tämän automaattisesti
mies.tulosta()
nainen.tulosta()

Tietorakenteita

Katso esimerkki tietorakenteista

CGI-ohjelmointi Pythonilla

CGI eli Common Gateway Interface on yksinkertaisin rajapinta WWW-sovelluksien tekemiseen

XHTML-dokumentti Python-kielellä ja CGI-rajapinnan kautta tuotettuna:

#!/usr/bin/python
# -*- coding: utf-8 -*-

print """Content-type: text/html; charset=UTF-8

<!doctype html>
<html>
  <head>
    <title>Malli</title>
  </head>
<body>
  <h1>Tulostetaan Pythonilla:</h1>
  <p>
"""
print "Hello World! Osaatkönä skändejä?"
print """
  </p>
</body>
</html>
"""

Virheilmoitukset ja asetukset

Pythonilla tehtyjen CGI-ohjelmien debuggaamista helpottaa cgitb-moduulin käyttöönotto:

import cgitb
cgitb.enable()

cgitb aiheuttaa virheraporttien näyttämisen www-selaimessa tai niiden tallentamisen tekstitiedostoon.

Lisätietoa: HOWTO Use Python in the web

Python ja merkistöt

Decode In Encode Out

Unicode in Python: Common Pitfalls

Käyttäjien kommentit

Kommentoi Lisää kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/tiea2080/luennot/python/
© Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
2018-01-08 15:41:08
Informaatioteknologia - Jyväskylän yliopiston informaatioteknologian tiedekunta