Tapaaminen 12.11.2009

Aiheina:

  • modulo-operaatio
  • Boolen logiikkaa ja vertailuja
  • ehtolause
  • palautuslause
  • tyyppimuunnokset

Linkkejä:

Tehtävien tarkistus

Edellisen kerran tehtävät käytiin pikaisesti läpi.

Modulo-operaatiot

Pythonissa on käytettävissä modulo-, eli jakojäännösoperaatio, jonka merkkinä on prosenttimerkki %, kuten monessa muussakin kielessä.

>>> 7 % 3
1
>>> 7 % 2
1

Operaatio laskee lausekkeesta x % y jakolaskun x/y ja palauttaa jäävän jakojäännöksen. Esimerkiksi kokonaisluku 3 menee kokonaislukuun 7 kaksi kertaa ja yli jää jakojäännökseksi yksi.

Boolen logiikkaa ja vertailuja

Boolen logiikassa tutkitaan kahta totuusarvoa, tosi ja epätosi, eli True ja False. Ohjelmointikielissä boolen-arvoille on oma luokkansa (tai tyyppinsä). Pythonissa sen luokan nimi on bool. Pythonissa näille totuusarvoille käytetään juuri nimiä True ja False (isoilla alkukirjaimilla). Toisinaan niiden sijalla käytetään myös kokonaislukuja 1 ja 0.

Totuusarvoja saadaan ohjelmassa esittämällä erilaisia väittämiä. Esimerkiksi lukujen vertailuilla:

>>> 3 == 2+1
True
>>> 3 == 2+2
False
>>> 3 < 2+2
True
>>> 3 > 2+2
False
>>> 3 <= 2+1
True
>>> 3 >= 2+1
True
>>> 3 >= 2+4
False
>>> 3 != 2+4
True
>>> 3 != 1+2
False

Vertailuoperaattorien muistamisessa voidaan käyttää esimerkiksi muistisääntöä, että ne kirjoitetaan aivan kuin lausutaankin. Esimerkiksi “pienempi tai yhtäsuuri kuin” on “<=”. Samoin “erisuuri kuin” on “!=”.

Boolen-arvoisia väitteitä voidaan yhdistellä loogisilla operaattoreilla not, and ja or. Näistä not vaihtaa totuusarvon päinvastaiseksi.

>>> not True
False
>>> not False
True
>>> not (3 < 7)
False

Operaattori or palauttaa toden, jos jompikumpi ehdoista on tosi ja epätoden, jos molemmat ovat epätosia.

>>> True or False
True
>>> True or True
True
>>> False or True
True
>>> False or False
False

Operaattori and palauttaa toden vain, jos molemmat ehdot ovat tosia ja muulloin se palauttaa epätoden.

>>> (2 == 3) and (2 < 3)
False
>>> (2 < 3) and (4 > 3)
True

Ehtolause

Python suorittaa saamiaan käskyjä peräkkäin yksi toisensa jälkeen. Joskus kuitenkin esiintyy tarve suorittaa joitain toimintoja ehdollisesti, eli vain kun jokin ehto on voimassa. Tähän ohjelmointikielissä käytetään if-rakennetta. Pythonissa if-rakenne on muotoa:

if <ehto>:
    <suoritettava lohko>

Ehto on jokin lauseke, joka saa arvokseen boolen-arvon True tai False. Jos ehdon arvo on True, suoritetaan sen jälkeen tulevassa sisennetyssä osassa olevat rivit. Jos taas ehdon arvo on False, hypätään sisennetyn lohkon yli ja jatketaan suoritusta sen jälkeen. Suoritettava lohko ei voi olla tyhjä. Jos lohkossa ei kuitenkaan haluta tehdä mitään, voidaan käyttää pass-komentoa, joka ei tee mitään.

If-rakenteeseen voidaan lisätä myös vaihtoehtoinen else-haara, joka suoritetan, kun ehdon arvo on False. Tämä rakenne on Pythonissa muotoa:

if <ehto>:
    <suoritettava lohko>
else:
    <vaihtoehtoinen lohko>

Joskus halutaan haarauttaa ohjelman suoritusta useampaan kuin kahteen haaraan. Yksi vaihtoehto olisi toteuttaa tämä sisäkkäisillä if-rakenteilla:

if <ehto1>:
    <lohko1>
else:
    if <ehto2>:
        <lohko2>
    else:
        <lohko3>

Tällä tavalla voidaan kuitenkin saada aikaiseksi epäselviä ja syviä if-rakenteita. Pythonissa tälle löytyy parempi vaihtoehto käyttämällä elif-haaraa.

if <ehto1>:
    <lohko1>
elif <ehto2>:
    <lohko2>
else:
    <lohko3>

Palautuslause

Usein funktion halutaan palauttavan jonkin tuloksen. Palauttaminen tapahtuu return-lauseella. Funktion sisällä lasketaan haluttu arvo ja kun funktiossa kohdataan return-lause, lopetetaan funktion suorittaminen ja palautetaan return:ille annettu arvo. Esimerkiksi:

def summa(a,b):
    return a+b

Tätä funktiota voidaan kutsua jossain muualla esimerkiksi näin:

muuttuja = summa(eka, toka)

Jos return-lauseelle ei anneta mitään palautettavaa arvoa, lopetetaan funktion suorittaminen eikä palauteta mitään varsinaista arvoa.

Tyyppimuunnokset

Yritetään suorittaa komento:

>>> print "luku " + 42

Tuloksena on virheilmoitus:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

Tämä siksi, että Python ei tiedä, miten pitäisi yhdistää merkkijono ja kokonaisluku. Merkkijonon voi kyllä tarvittaessa muuttaa kokonaisluvuksi kirjoittamalla:

>>> int("42")
42

Nyt Pythonia pyydettiin erikseen tekemään tyyppimuunnos, joka muuttaa merkkijonon kokonaisluvuksi, jos mahdollista.

Tyyppimuunnoksia voidaan tehdä myös muiden tyyppien välillä:

>>> int(-2.3)
-2
>>> int(3.99999)
3
>>> int("42")
42
>>> int(1.0)
1

Huomaa, että liukuluku katkaistiin kokonaisluvuksi, ei pyöristetty.

>>> float(32)
32.0
>>> float("3.14159")
3.14159
>>> float(1)
1.0

Usein käytetty muunnos on muunnos merkkijonoksi:

>>> str(32)
'32'
>>> str(3.14149)
'3.14149'
>>> str(True)
'True'
>>> str(true)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'true' is not defined

Tyyppimuunnokset totuusarvoiksi ovat mielenkiintoisia.

>>> bool(1)
True
>>> bool(0)
False
>>> bool("Ni!")
True
>>> bool("")
False
>>> bool(3.14159)
True
>>> bool(0.0)
False

Pythonissa Falseksi muunnetaan:

  • None,
  • False,
  • minkä tahansa numeerisen tyypin nolla,
  • mikä tahansa tyhjä jono: ‘’, [], (),
  • mikä tahansa tyhjä kuvaus, esimerkiksi {},
  • mikä tahansa käyttäjän määrittelemä luokka, jos se määrittelee metodin __nonzero__() tai __len__(), kun se palauttaa nollan tai totuusarvon False.

gasp

gasp-paketilla voidaan piirtää kuvia.

Kotitehtävät

Luvun 4 tehtävät. Tehtävä 5 tehtiin jo tapaamisessa. Tehtävästä 9 Tero haluaa palautettavaksi kohtien 3 ja 4 jälkeiset muutokset.