Osa 7

Moduulit

Debugging revisited

Kurssilla on jo moneen otteeseen puhuttu erilaisista debuggausmenetelmistä. Visualisaattori on jo monille tuttu ja vanha kunnon debuggaustulostus toimii aina. Visual Studio Coden debuggeriakin monet ovat jo kokeilleet. Debuggerilla voi olla vaikeuksia selvitä tiedostoja käsittelevästä koodista, mutta siihenkin on olemassa lääke.

Pythonin versio 3.7 tarjoaa vielä yhden erittäin helppokäyttöisen tavan debuggaukseen, komennon breakpoint().

Voit lisätä komennon mihin kohtaan tahansa ohjelmaasi, ja kun suoritat ohjelman, pysähtyy suoritus komennon kohdalle. Seuraavassa esimerkki viime viikon tehtävän debuggaamisesta:

7 1 1

Kun koodi pysähtyy breakpoint()-komentoon, avautuu samalla konsolinäkymä, johon on mahdollista kirjoittaa mitä tahansa koodia ja kokeilla miten se toimisi ohjelman kyseisessä kohdassa.

Komento on erityisen kätevä jos ohjelmasi jokin rivi aiheuttaa virheen, etkä ole ihan varma mistä virhe johtuu. Näissä tilanteissa kannattaa laittaa breakpoint-kutsu juuri ennen virheellistä riviä. Sen jälkeen on debuggerin konsolissa helppo kokeilla, mikä olisi oikea komento juuri siinä kohtaa suoritettavaksi.

Koodin suoritusta on myös mahdollista jatkaa pysähtymisen jälkeen. Esimerkiksi konsoliin annettu komento continue tai sen lyhennetty versio c jatkaa suoritusta seuraavaan breakpointiin asti. Seuraavassa esimerkki siitä, kun silmukkaa käydään läpi muutamaan kertaan:

7 1 2

Muut debuggerikonsolin komennot selviävät täältä tai antamalla debuggerkonsolissa komento help:

7 1 3

Komento exit siis lopettaa ohjelman suorituksen.

Kun lopetat debuggaamisen, muista poistaa koodista komento breakpoint()!

Moduulin käyttäminen

Python-kieli sisältää itsessään joukon valmiita funktioita, esimerkiksi merkkijonojen ja listojen pituuden kertovan funktion len sekä alkioiden summan laskevan funktion sum. Python-kielen standardikirjasto on kokoelma monenlaisia hyödyllisiä funktioita ja olioita joiden avulla kielen "ilmaisuvoimaa" on helppo laajentaa. Olemme jo käyttäneet muutamassa tehtävässä standardikirjastosta eräitä matemaattisia operaatioita tarjoavia funktioita esim. neliöjuurten laskemisessa.

Standardikirjasto muodostuu moduuleista, joihin on ryhmitelty eri aiheisiin liittyviä funktioita ja luokkia. Tutustumme tässä osassa joihinkin hyödyllisiin moduuleihin ja opimme myös tekemään moduulin itse.

Komento import ottaa käyttöön halutun moduulin. Tarkastellaan esimerkkinä moduulia math, jossa on matemaattisia funktioita. Seuraava koodi laskee luvun neliöjuuren funktiolla sqrt ja logaritmin funktiolla log

import math

# luvun 5 neliöjuuri
print(math.sqrt(5))
# luvun 8 logaritmi (2-kantainen)
print(math.log(8, 2))
Esimerkkitulostus

2.23606797749979 3.0

Koska funktiot ovat moduulissa math, niihin viitataan koodissa nimillä math.sqrt ja math.log.

Moduulin osien valinta

Toinen tapa käyttää moduulia on valita sieltä mukaan from-komennolla tiettyjä osia, joita haluamme käyttää. Esimerkiksi seuraava koodi ottaa käyttöön funktiot sqrt ja log moduulista math:

from math import sqrt, log

print(sqrt(5))
print(log(5,2))

Tämän tavan etuna on, että voimme käyttää funktioita suoraan ilman math-etuliitettä.

Voimme myös ottaa suoraan käytettäväksi kaiken moduulin sisällön tähden avulla:

from math import *

print(sqrt(5))
print(log(5,2))

Tämä tapa voi olla kätevä testailussa ja pienissä ohjelmissa, mutta siinä on omat ongelmansa, kuten näemme myöhemmin.

Loading

Moduulin sisältö

Pythonin dokumentaatio kertoo jokaisesta standardikirjaston moduulista, mitä moduuli sisältää ja kuinka sitä käytetään. Esimerkiksi moduulin math dokumentaatio on tässä:

Voimme myös tutkia funktion dir avulla moduulin sisältöä:

import math

print(dir(math))

Funktio antaa listan nimistä, jotka moduuli määrittelee:

Esimerkkitulostus

['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

Loading
Loading
:
Loading...
:
Loading...

Log in to view the quiz

Seuraava osa: