Osa 4

Visual Studio Code -editori, Python-tulkki ja debuggeri

Olemme tähän mennessä ohjelmoineet kaikki tehtävät kurssisivuille upotettuihin editori-ikkunoihin. Selaineditorissa tapahtuva ohjelmointi sopii hyvin kurssin alkuun, mutta siirrymme nyt käyttämään erillistä ohjelmointiin tarkoitettua editoria.

Erilaisia ohjelmointiin sopivia editoreja on kymmeniä. Käytämme kurssilla viime vuosina suureen suosioon noussutta Visual Studio Code -editoria.

Asenna nyt Visual Studio Code ja kurssin tehtävien testien suorittamiseen käytettävä TMC-plugin tämän ohjeen avulla.

Loading

Huomautus koodin suorittamisesta

Visual Studio Codella koodi siis suoritetaan painamalla vihreää kolmiota. Joskus voi käydä niin, että koodisi suoritus jää kesken, esimerkiksi odottamaan käyttäjän syötettä, tai ikuiseen silmukkaan, ja siirryt jo seuraavaan tehtävään. Kun yrität suorittaa seuraavan tehtävän koodia, tuleekin esille edellisen tehtävän kesken ollut suoritus. Joissain tilanteissa joudut sammuttamaan edellisen suorituksen painamalla yhtä aikaa näppäimiä control ja c, jotta saat suoritetuksi uuden tehtävän koodin.

Interaktiivinen Python-tulkki

Emme ole toistaiseksi puhuneet kurssilla sanallakaan eräästä Python-ohjelmoinnin tärkeimmästä työkalusta, interaktiivisesta komentotulkista.

Komentotulkki käynnistyy antamalla komentoriviltä komento python3 (joissain tapauksissa, esim. Windowsilla komento saattaa olla python). Esim. Macilla komentotulkin avaaminen näyttää seuraavalta:

4 1 1

Komentotulkki on myös mahdollista avata Visual Studio Code -editorin sisälle, ensin suorittamalla jokin ohjelma "vihreällä kolmiolla" ja sen jälkeen kirjoittamalla avautuvaan Terminal-näkymään python3 (tai python)

4 1 2

On olemassa myös selaimessa toimivia interaktiivisia tulkkeja, esim. https://www.python.org/shell/

Komentotulkki tarjoaa interaktiivisen tavan suorittaa Python-koodia rivi riviltä sitä mukaa kuin käyttäjä kirjoittaa koodia. Ideana on siis se, että käyttäjä kirjoittaa yhden koodirivin ja Python suorittaa rivin välittömästi ja näyttää rivin operaation tuloksen:

4 1 3

Komentotulkkiin on mahdollista kirjoittaa mitä tahansa Pythonia, muuttujien ja metodienkin määrittely on mahdollista:

>>> t = [1,2,3,4,5]
>>> for luku in t:
...   print(luku)
...
1
2
3
4
5
>>> def itseisarvo(luku):
...   if luku<0:
...      luku = -luku
...   return luku
...
>>> x = 10
>>> y = -7
>>> itseisarvo(luku)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'luku' is not defined
>>> itseisarvo(x)
10
>>> itseisarvo(y)
7
>>>

Parhaimmillaan komentotulkki on pienten tarkistusten tekemiseen, esim. miten tietty metodi toimii tai onko metodia ylipäätään olemassa:

>>> "TekstIä".toupper()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'toupper'
>>> "TekstIä".upper()
'TEKSTIÄ'
>>>

Jos muistaa melkein jonkin metodin nimen, googlaamisen sijaan voi olla nopeampi käyttää komentotulkkia ja "kysyä" funktion dir avulla, mitä metodeja tietyllä oliolla on:

>>> dir("teksti")
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__',
'__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__',
'__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find',
'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit',
'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join',
'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust','rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase',
'title', 'translate', 'upper', 'zfill']

Kuten näemme, merkkijonoilla on suuri määrä metodeja. Kurssin tässä vaiheessa kannattaa ehkä unohtaa alaviivoja sisältävät metodit, mutta muut voivat olla käyttökelpoisia. Osa metodien toiminnasta voi selvitä jo kokeilemalla, osan toiminta selviää helposti googlaamalla.

Listojen metodeista käy ilmi seuraavaa:

>>> dir([])
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__',
'__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__',
'__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__',
'__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop',
'remove', 'reverse', 'sort']
>>>

Tarjolla näyttää siis olevan mm. metodit reverse ja clear. Kokeillaan niitä:

>>> luvut = [1,2,3,4,5]
>>> luvut.reverse()
>>> luvut
[5, 4, 3, 2, 1]
>>> luvut.clear()
>>> luvut
[]

Metodit siis tekevät aika lailla sen, mitä nimen perusteella voi olettaa.

Huomaa, että komentotulkki ei "tulosta" mitään, kun kutsutaan esim. metodia lista.reverse(). Mistä tämä johtuu? Komentotulkki tekee komentojen suorituksen yhteydessä tulostuksen vain, jos suoritetulla koodirivillä on jokin arvo. Edellisessä esimerkissä saatiin tulostettua listan luvut arvo kirjoittamalla komentotulkkiin pelkkä muuttujan nimi. Komentotulkissa ei siis useinkaan ole tarvetta kirjottaa erikseen print-komentoja.

Tärkeä komento on exit(), joka sulkee komentotulkin. Erityisesti jos käytät komentotulkkia Visual Studio Codessa, se tulee muistaa sulkea, ennen kuin suoritat jonkun ohjelman uudelleen "vihreällä kolmiolla". Jos tämä unohtuu, on seurauksena hieman erikoinen virheilmoitus:

4 1 4

Debuggeri

Muutamassa edellisessä osassa on jo korostettu debuggaustaitojen tärkeyttä ja demonstroitu tulostamalla tapahtuvaa debuggausta. Visual Studio Code -editori tarjoaa ehkä kehittyneimmän menetelmän debuggaukseen: visuaalisen debuggerin.

Debuggaus aloitetaan määrittelemällä koodiin ns. breakpoint eli kohta, johon debuggeri pysäyttää koodin suorituksen. Breakpoint asetetaan klikkaamalla hiirellä halutun koodirivin vasemmalta puolelta.

Seuraavassa esimerkissä breakpoint on asetettu edellisen osan tehtävän Peräkkäisten summa erään hieman rikkinäisen ratkaisun riville 5:

4 1 5

Breakpointin asetuksen jälkeen valitaan valikosta Run kohta Start debugging. Tämä avaa valintanäkymän, josta valitaan Python File:

4 1 6

Debuggeri käynnistyy ja alkaa suorittaa koodia normaaliin tapaan, kunnes se törmää breakpointiin ja pysähtyy:

4 1 7

Vasempaan reunaan on avautunut näkymä Variables, joka kertoo senhetkisten muuttujien arvot. Koodia voidaan suorittaa rivi riviltä painelemalla alaspäin osoittavaa nuolta (Step into).

Seuraavassa tilanne, kun silmukkaa on suoritettu muutamia kertoja:

4 1 8

Debuggerin välilehti Debug console mahdollistaa myös erilaisten lausekkeiden evaluoinnin debuggaushetken muuttujien arvoilla. Voidaan esimerkiksi kokeilla, mikä silmukan lopetusehdon arvo on:

4 1 9

Ohjelmassa voi olla myös useita breakpointeja. Pysähtymisen jälkeen koodi voidaan taas käynnistää sinisellä kolmiolla (Continue) ja suoritus jatkuu kunnes ohjelma törmää seuraavaan breakpointiin.

Visuaalinen debuggeri on oivallinen työkalu. On kuitenkin osittain mieltymyksistä kiinni, mitä debuggaustekniikoita kukin käyttää. Debuggerin käynnistämisessä on pieni vaiva, joten jotkut ohjelmoijat turvautuvat useimmiten debugtulostuksiin.

Seuraava osa: