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:
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:
Muut debuggerikonsolin komennot selviävät täältä tai antamalla debuggerkonsolissa komento help:
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))
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.
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:
['__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']
Log in to view the quiz