- CS-EJ4404
- 1. Johdanto
- 1.3 Python tutoriaali
Python tutoriaali¶
Tällä sivulla on ohjeita, joiden avulla Pythonin kanssa pääsee alkuun. Tätä sivua ei tarvitse lukea alusta loppuun, mutta voit palata tänne hakemaan apua jos tehtävissä oleva Python-koodi tuntuu vaikealta ymmärtää. Sivu kannattaa siksi avata uuteen välilehteen tai selaimen ikkunaan.
Aina kun ajat koodia kurssin sivuilla, sinun on aktivoitava koodiympäristö.
Paina koodisolun yläreunassa olevaa ”Activate
”-painiketta ja odota,
että siinä lukee ”READY
”.
Alla on Python-koodisolu. Voit ajaa sen painamalla ”RUN
”-painiketta.
Kun olet ajanut koodin ensimmäisen kerran,
kirjota oma nimesi Noname
-tekstin paikalle ja aja koodi uudestaan.
# Rivin alussa hashtag eli #-merkki tekee siitä kommenttirivin.
# Kommenttirivi ei sisällä ajettavaa koodia.
# Kommenteissa on yleisiä ohjeita kurssilaisille.
# Jos kommentti alkaa koodin jälkeen samalla rivillä, siinä on ohje, miten muuttaa koodia.
nimesi = "Noname" # <- B- tehtävä: kirjoita tekstin 'Noname' tilalle 'Sauli' ja suorita koodi.
print("Olen", nimesi, "ja osaan jo ajaa koodisoluja")
Python-muuttujat¶
Ohjelmoitaessa ajonaikainen tieto voidaan tallennetaan muuttujiin. Tarkemmin sanottuna muuttujalla on symbolinen nimi ja muuttuja osoittaa johonkin tietorakenteeseen.
Muuttujan nimi on symbolinen. Tätä symbolista nimeä käytetään, kun informaatiota käsitellään. Ohjelmointikieli asettaa muuttujan nimelle rajoitteita, mutta nimiä voi antaa suhteellisen vapaasti. Muuttujat kannattaa nimetä niin, että nimi auttaa päättelemään millaiseen informaatioon muuttuja osoittaa tai mitä funktio palauttaa.
Muuttuja osoittaa tietotyyppiin. Tietotyypit sisältävät erilaisia ominaisuuksia sekä funktioita.
Meille tärkeimpiä datatyyppejä ovat:
Merkit : ’A’
Merkkijonot : ’ABC Kissa kävelee’
Kokonaisluvut : 123
Desimaaliluvut : 1.23
Kompleksiluvut : 3+4j
Boolean (totuusarvo eli arvo on joko tosi tai epätosi):
True
jaFalse
.
Muuttujat voivat osoittaa tietorakenteisiin kuten listoihin, ryhmiin, tietovirtoihin yms. Näitä opimme kurssin aikana ja hieman alempana tällä sivulla.
Totuusarvo¶
Esimerkki yksinkertaisesta muuttujan tyypistä on totuusarvo.
Tämä on Python-kielessä joko True
tai False
.
Niillä määritellään, onko jokin asia tosi vai epätosi.
Yleensä totuusarvoa käytetään,
kun koodin halutaan haarautuvan eli valitsevan reitin
joko ”vasemmalle” tai ”oikealle”.
Seuraavassa esimerkissä määritellään kaksi muuttujaa. Muuttujien nimet saa määrittää itse. Esimerkissä ensimmäisen muuttujan nimi on on_totta ja toisen nimi on ei_ole_totta. Ensimmäisen muuttujan arvoksi määritellään True eli ”totta/kyllä” ja toisen arvoksi False eli ”ei totta/ei”.
# Luodaan kaksi muuttujaa nimeltään on_totta ja ei_ole_totta.
# Kumpikin muuttuja viittaa boolean-tietorakenteeseen.
on_totta = True
ei_ole_totta = False
Totuusarvoja käytetään yleensä ohjelmassa silloin, kun valitaan mikä osa koodista suoritetaan tai milloin suoritus loppuu.
If - ehdollinen koodin toteuttaminen¶
Totuusarvoja käytetään usein if-else
-koodirakenteessa,
jossa if
-haaraan koodi ajetaan jos if-lauseessa oleva totuusarvo on True
.
If-lauseen vaihtoehtoisena haarana on else
-haara.
Else-haara voidaan myös jättää pois,
jolloin If-lausekkeen koodi suoritetaan vain siinä tapauksessa,
että If-haaran ehto toteutuu.
Yhtenä esimerkkinä koodin haarautumisesta toimii merkkijonon tietotyyppiä ilmaiseva funktio isprintable()
.
Se palauttaa arvon True
jos merkkijonon kaikki merkit voi tulostaa.
Muutoin funktio palauttaa arvon False
.
Tällöin vähintään yksi merkkijonon merkki ei tulostu print
-funktiolla.
Tämä toiminto esitellään lyhyesti seuraavassa koodiesimerkissä.
# Luodaan muuttuja nimeltään näyte_1, joka osoittaa tekstiin "Ja osaan pian koodata kuin vanha tekijä.".
näyte_1 = "Ja osaan pian koodata kuin vanha tekijä."
# Luodaan toinen muuttuja näyte_2, jonka lopussa on kaksi merkkiä joita ei voi tulostaa.
näyte_2 = "Ei voi tulostaa \x02 \x03"
# Seuraavaksi testaamme ensimmäisen merkkijonon merkkijonon omalla .isprintable() funktiolla.
# Testaamiseen käytetään if-else rakennetta.
# Jos .isprintable() testi palauttaa True, haarautuu ohjelman suoritus if-haaraan.
# Jos .isprintable() testi palauttaa False, ohjelman suoritus haarautuu else-haaraan.
if näyte_1.isprintable():
# Tähän if-haaraan tullaan jos .isprintable() on palauttanut arvon True eli tosi.
print("Ensimmäinen teksti on tulostettavissa, ja teksti on:")
else:
# Tähän else haaraan tullaan, jos edellinen if-ehto on False eli epätosi.
print("Muuttujan näyte_1 merkkijono sisältää kirjaimia, jotka eivät tulostu. Teksti on:")
# Riippumatta edellisestä testistä, tulostamme aina näyte_1 muuttujan sisällön.
print(näyte_1)
# Seuraavaksi testaamme samalla tavalla näyte_2:n sisältämän merkkijonon.
if näyte_2.isprintable():
print("Toinen teksti on tulostettavissa, ja teksti on:")
print(näyte_2)
else:
print("Muuttujan näyte_2 merkkijono sisältää kirjaimia, jotka eivät tulostu. Teksti on:")
print(näyte_2)
Edellinen esimerkki opettaa kolme asiaa:
Opimme, että Python sisältää paljon funktioita. Käyttämämme
isprintable()
-funktio on merkkijonon elistring
-olion funktio ja palauttaa arvonaan joko arvonTrue
taiFalse
. Käytämme kurssin aikana paljon erilaisia funktioita. Osa funktioista palauttaa arvoja, osa suorittaa monimutkaisia operaatioita ja palauttaa tietorakenteita. Joskus funktiot eivät palauta mitään näkyvää paluuarvoa.Opimme ensimmäisen tavan suorittaa ehdollisesti koodia if-else rakenteella.
Opimme, että Pythonissa kirjoitetun koodin sisennys määrittää niin sanotun koodilohkon. Edellisen esimerkin jälkimmäisessä if-else rakenteessa suoritettava koodilohko sisältää kaksi print-komentoa. Ensimmäisessä näyte_1 -testirakenteessa on vain yksi rivi koodiblokissa.
Automaattinen muuttujatyypin määritys¶
Python ei vaadi muuttujien tyypin määrittämistä. Tämä automatiikka tekee aloittelijan koodaamisesta sujuvampaa, mutta myöhemmin voimme haluta määrittää muuttujien tietotyypit ja jopa tietotyyppien hyväksytyt arvot.
Automaattinen tyyppitunnistus mahdollistaa esimerkiksi seuraavan: a = "KISSA"
, b = 3
.
Näistä muuttujan määrittelyistä Python arvaa käytetyn muuttujan tyypin itse.
Tällöin muuttuja nimeltään a
viittaa merkkijonoon, jonka sisältö pitää sisällään merkit ’K’,’I’,’S’,’S’,’A’.
Vastaavasti muuttuja nimeltään b
viittaa kokonaislukuun, jonka arvo on 3.
Monesti voi olla hyödyllistä nimetä muuttuja siten,
että muuttujan nimi viittaa muuttujan tyyppiin.
Jos muuttuja on nimeltään a tai b kuten esimerkissämme,
on mahdollista että koodia työstäessään myöhemmin enää muista mihin muuttuja osoittaa.
Tällöin voisi syntyä tilanne, jossa yritämme testata onko muuttuja b
:n sisältö tulostettavissa .isprintable()
-funktiolla.
Saisimme virheilmoituksen AttributeError: 'int' object has no attribute 'isprintable'
.
Tämä johtuu siitä, että muuttuja b
osoittaa kokonaislukuun eli integer
tietotyyppiin, jolla ei ole olemassa .isprintable()
-funktiota.
a = "KISSA"
b = 3
if b.isprintable():
print("Yllä oleva ehto aiheuttaa virheen: AttributeError: 'int' object has no attribute 'isprintable'.)
Tietotyyppi on hyödyllistä pitää mielessä myös siksi, että eri matemaattiset operaattorit käyttäytyvät eri tavalla tietotyypin mukaan. Python käsittelee eri muuttujia eri tavalla samoilla operaatioilla. Kokeillaan miten + - merkki käyttäytyy merkkien ja lukujen kanssa.
# Kokeillaan ensin mitä tapahtuu, kun lasketaan plusmerkillä kaksi kirjainta yhteen.
a_merkki = 'A'
b_merkki = 'B'
print("A-merkki on", a_merkki, "ja B-merkki on", b_merkki, "ja näiden summa on", a_merkki+b_merkki)
# Kokeillaan mitä tapahtuu, kun lasketaan plusmerkillä kaksi numeroa yhteen.
kasi = 8
ysi = 9
print("Kasi on", kasi, "ja ysi on", ysi, ". Näiden summa on", kasi+ysi)
# Kokeillaan mitä tapahtuu, kun lasketaan kirjain ja numero yhteen.
kirjain = 'A'
numero = 13
try:
print("Kirjain on", kirjain, 'ja numero on', numero, 'ja näiden summa on', kirjain+numero)
except TypeError:
print("Pipari")
TypeError¶
Edellinen tehtävä oli laadittu siten, että koodi tuottaa virheen.
Virhe TypeError
on napattu try-catch rakenteella,
jotta virhe ei pysäytä koodisolun suoritusta.
Tällaisia virheitä näkee usein koodatessa, joten niitä kannattaa opetella lukemaan.
Jos ajat koodin omalla tietokoneellasi Python-konsolilla,
näet virheilmoituksen TypeError: can only concatenate str (not "int") to str
.
Vapaasti käännettynä virheilmoitus sanoo: ”voin yhdistää merkkijonon (en kokonaislukua) vain toiseen merkkijonoon”.
OK, korjataan siis virhe muuntamalla numero merkkijonoksi str
-funktiolla ja tulostetaan tulos.
# Kokeillaan mitä tapahtuu, kun lasketaan kirjain ja numero yhteen.
kirjain = 'A'
numero = 13
print("Kirjain on", kirjain, 'ja numero on', numero, 'ja näiden summa on', kirjain+str(numero))
Matemaattiset operaatiot¶
Numeroille on olemassa seuraavat matemaattiset operaattorit. Alla olevissa esimerkeissä a, b ja c edustavat lukuja:
yhteenlasku (+)
a = b + c
vähennyslasku (-)
a = b - c
kertolasku (*)
a = b * c
jakolasku (/)
a = b / c
, \(a=\frac{b}{c}\)potenssiin korotus (**)
a = b ** c
, \(a = b^c\)jakolasku, pyöristys alaspäin kokonaislukuun (//)
a = b // c
, \(a = \lfloor \frac{b}{c} \rfloor\)modulo eli jakojäännös (%)
a = b % c
# Esitellään käytännössä yllä kuvatut operaatiot
b = 7
c = 3
print("Lasketaan ja tulostetaan a, edellä kuvatuilla operaatiolla:")
print("Kun b =",b,"ja c =",c,"\n")
print("Yhteenlasku : b + c =",b+c)
print("Vähennyslasku: b - c =",b-c)
print("Kertolasku : b * c =",b*c)
print("Jakolasku : b / c =",b/c)
print("Potenssi : b ^ c =",b**c)
print("Jakolasku : b // c=",b//c)
print("Modulo : b % c =",b%c)
Moduloa eli jakojäännöstä käytetään paljon kryptografian laskuissa. Seuraavassa tehtävässä lasketan jakojäännös. Tehtävän tekeminen on helppoa jos muokkaa koodia. Vaihtoehtoisesti tuloksen voi laskea perinteisesti kynällä ja paperilla tai laskimella.
# Modulon laskentaa
b = 100
c = 23 #<- Muuta tähän eri arvoja ja aja koodi. Etsimme sitä c:n arvoa joka tuottaa modulon 0, kun b=100.
print("Kun b={} ja c={}, niin modulo, eli jakojäännös on {} % {} = {}".format(b,c,b,c,b%c))
Edistyneemmät tietorakenteet¶
Kurssilla käytetään esimerkeissä joitain hieman edistyneempiä tietorakenteta.
Käytämme harjoituksissamme listoja (list), sanakirjoja (dict) ja joukkoja (set).
Pythonin listaan voidaan kerätä useita alkioita. Listan alkioiden ei tarvitse olla samaa tietotyyppiä, jolloin laittaa listan alkioiksi numeroita, kirjaimia tai olioita.
lista_aakkosia = ['A','B','C']
Python sanakirja sisältää avain-arvo-pareja.
Voimme luoda sanakirjan { }
-merkeillä.
Sanakirjassa avaimet ovat ainutlaatuisia (unique), eli niitä voi olla vain yksi samanlainen.
muunnos_sanakirja = { }
Kokeillaan miten näitä käytetään.
merkkijono = "ABCDE"
lista_aakkosia = list(merkkijono)
print("Merkkijono on ", merkkijono)
print("Lista on ", lista_aakkosia)
print("Listan pituus on ", len(lista_aakkosia))
# indeksointi alkaa nollasta, ensimmäinen A-kirjaimen indeksi on 0
print("Poimitaan ensimmäinen listan alkio", lista_aakkosia[0])
# Listaa voi indeksoida negatiiviseen suuntaan, jolloin osoitamme lopusta päin merkkeihin
print("Poimitaan listan viimeinen alkio ", lista_aakkosia[-1])
# Huomaa indeksoinnin erikoisuus:
# Indeksointi [:3] tarkoitta, että otamme listan alusta kaikki alkiot,
# kunnes indeksi on 3 (eli neljäs elementti) joka jätetään **pois**
print("Poimitaan kolme ensimmäistä ", lista_aakkosia[:3])
# Lopusta indeksointi alkaa -1:stä joten kolmas elementti on -3.
print("Poimitaan kolme viimeistä ", lista_aakkosia[-3:])
# Toisen indeksi on 1, ja ensimmäisen jota ei oteta mukaan on 4.
print("Poimitaan kolme keskimmäistä ", lista_aakkosia[1:4])
# Tarkistetaan merkin C indeksi.
print("Ensimmäinen C-merkin indeksi on ", lista_aakkosia.index('C'))
# luodaan käsin sanakirja eli dictionary
muunnos_sanakirja = {}
muunnos_sanakirja['A'] = 'E'
muunnos_sanakirja['B'] = 'F'
muunnos_sanakirja['C'] = 'G'
print("Sanakirjan sisältö", muunnos_sanakirja)
print("A-merkki korvataan", muunnos_sanakirja['A'], "kirjaimella")
print("B-merkki korvataan", muunnos_sanakirja['B'], "kirjaimella")
# Listasta saadaan joukko set, joka kertoo mitä alkioita jossain datassa on
# Alla merkkijonon muuntaminen listaksi ja joukoksi
merkkijono = "KISSASSA"
print("Viesti merkkijonona", merkkijono)
print("Viesti listana ", list(merkkijono))
print("Viesti joukkona ", set(merkkijono))
Valmiiden kirjastojen käyttö¶
Pythoniin on saatavilla tuhansittain kirjastoja.
Koko kirjasto otetaan käyttöön lisäämällä koodilohkon alkuun komento import
jota seuraan kirjaston nimi, esimerkiksi import kirjasto
.
Jos tiedät että tarvitset vain jonkun tietyn funktion tai olion kirjastosta, niin voit tuoda vain tarvitsemasi osan komennolla from kirjasto import funktio
.
Käytämme kurssin esimerkeissä lähes poikkeuksetta muuttujien alustuksiin kurssille tehdyn kirjaston funktioita.
Seuraavia kirjastoja käytetään kurssin funktioiden taustalla.
string: merkkijonojen käsittely
math: matemaattiset funktiot
scipy: tieteelliset edistyneemmät funktiot
numpy: numeerisen laskennan toiminnot
matplotlib: kuvien tuottaminen datasta
sys: käyttöjärjestelmän palveluiden käyttö
os: käyttöjärjestelmän palveluiden käyttö
Silmukat ja laskurit¶
Pythonissa on monta näppärää tapaa tuottaa ohjelmasilmukoita. Silmukoissa ajetaan jokin koodipätkä useita kertoja.
Kurssilla käytetään monissa tehtävissä ja esimerkeissä for silmukkaa. Alla on muutama esimerkki for-silmukan käyttötavoista. Muitakin silmukkarakenteita on olemassa, mutta tässä vaiheessa riittää vain tämän yhden opettelu.
Seuraavassa esimerkissä luodaan for-silmukka käyttäen range-funktioita. Range-funktio palauttaa arvoja nollasta annettuun arvoon. Voit kokeilla vaihtaa oletusarvoa 7 johonkin muuhun lukuun.
for laskuri in range(7):
print("Laskuri on", laskuri)
Huomasitko, että laskuri antaa arvot nollasta kuuteen, eli yhteensä seitsemän arvoa? Viimeinen laskurin arvo ei siis ole seitsemän.
Toinen tapa on käydä jokin iteroitava tietorakenne läpi elementti kerrallaan.
Alla olevassa esimerkissä tietorakenne on lista,
johon on laitettu yksittäiset kirjainmerkit A:sta E:hen.
For-silmukka käy jokaisen listan elementin läpi ja asettaa muuttujaan merkki
arvoksi kyseisellä kierroksella käsiteltävän kirjainmerkin.
Tämän jälkeen print
-funktiolla tulostetaan teksti ”Merkki on
” sekä muuttujan merkki
arvo.
lista_merkkejä = ['A', 'B', 'C', 'D', 'E']
for merkki in lista_merkkejä:
print("Merkki on", merkki)
Joskus haluamme käydä tietorakenteen läpi, sekä pitää kirjaa kuinka mones silmukan kierros on menossa.
Tähän käytämme enumerate()
-funktiota. Se palauttaa joka kierroksella tietorakenteen elementin ja sen järjestysnumeron.
merkkijono = "ABCDEFG"
for järjestysnumero, merkki in enumerate(merkkijono):
print("Järjestysnumero on", järjestysnumero, "ja merkki on", merkki)
Viimeisenä esimerkkinä käytämme rangea, jolle annetaan tietorakenteen pituus argumentiksi kiinteän arvon sijaan.
merkkijono = "ABCDEFG"
for indeksi in range(len(merkkijono)):
print("Indeksi on", indeksi, "ja merkki indeksissä on", merkkijono[indeksi])
Funktiot¶
Silmukat vähentävät koodirivien määrää. Jos jokin laskentaoperaatio suoritetaan usein, siitä on todennäköisesti kannattavaa kirjoittaa funktio.
Seuraava funktio ottaa yhden argumentin ja näyttää viestin. Tämä funktio ei palauta mitään.
def mun_funktio(viesti):
print("Mun funktio sai viestin", viesti)
Seuraava funktio ottaa kaksi argumenttia ja tulostaa enemmän. Tämäkään funktio ei palauta mitään.
def mun_funkkis(viesti, laskuri):
print("Mun funktio sai viestin", viesti, "ja napsuttelee sormiaan")
for i in range(laskuri):
print(i)
print("Poistutaan funktiosta")
Seuraava funktio ottaa kaksi lukua ja palauttaa niiden summan. Funktio ei tarkista argumenttien tyyppejä, mutta tämän osion alussa esitellyt plus-operaattorin käytön rajoitukset koskevat myös tätä funktiota.
def mun_plussaus(luku1, luku2):
print("Mun funktio sai luvun", luku1, "ja luvun", luku2)
print("Palautan näiden lukujen summan")
return luku1 + luku2
Kokeillaan käytännössä. Luodaan ensin kolme funktiota.
# luodaan funktio
def mun_funktio(viesti):
print("Mun funktio sai viestin", viesti)
# Luodaan toinen funktio
def mun_funkkis(viesti, laskuri):
print("Mun funktio sai viestin", viesti, "ja napsuttelee sormiaan")
for i in range(laskuri):
print(i)
print("Poistutaan funktiosta")
# Luodaan kolmas funktio
def mun_plussaus(luku1, luku2):
print("Mun funktio sai luvun", luku1, "ja luvun", luku2)
print("Palautan näiden lukujen summan")
return luku1 + luku2
print("Funktiot luotu")
Yksi käyttämämme ympäristön rajoite on, että kaikki sivun koodi-solut on ajettava järjestyksessä. Jos seuraavan koodisolun ajaminen aiheuttaa virheen, joka on kuvattu alla, niin se tarkoittaa ettet ole ajanut aiempia koodisoluja.
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_42/3449423419.py in <module>
1 # Kokeillaan ensimmäistä funktiota.
2 print("Kokeilen ensimmäistä funktiota")
----> 3 mun_funktio("Heipparallaa")
4
5 print("Kokeilen toista funktiota")
NameError: name 'mun_funktio' is not defined
Tästä syystä kurssin koodisoluissa usein alustetaan muuttujat, niin ettei koodisoluja tarvitse suorittaa järjestyksessä. Seuraavassa koodisolussa käytämme edellisessä koodisolussa luotuja funktioita:
# Kokeillaan ensimmäistä funktiota.
print("Kokeilen ensimmäistä funktiota")
mun_funktio("Heipparallaa")
print("Kokeilen toista funktiota")
mun_funkkis("Heipparallaa",4)
print("Kokeillaan laskentafunktiota")
lukuA=50
lukuB=49
print("Lukujen", lukuA, "ja", lukuB, "summa on", mun_plussaus(lukuA, lukuB))
NumPy ja plottaus¶
Kurssin esimerkeissä käytämme välillä kirjastoa numpy
.
Kirjasto tuo mukanaan nopeaksi optimoidut numeerisen laskennan funktiot.
Kirjasto otetaan käyttöön seuraavalla komennolla:
import numpy as np
NumPy-kirjaston array
on kuin Pythonin lista, mutta poikkeaa siitä:
NumPy
array
hyväksyy alkioikseen vain samaa datatyppiä. Yhdenarrayn
kaikkien elementtien on siis esimerkiksi oltava integer tai float -tyyppejä.NumPyllä suoritettu laskenta on tuhansia kertoja nopeampaa kuin listoilla
NumPy suorittaa operaation elementeittäin. Python listoja käytettässä esimerkiksi listaA+listB yhdistää listat, kun taas NumPy laskee alkioiden summat.
Toinen kurssin koodiesimerkeissä usein käyttämämme kirjasto tuottaa ja näyttää kuvia.
Tämä kirjasto on suuren matplotlib
-kirjaston näppärä alikirjasto pyplot
.
import matplotlib.pyplot as plt
NumPy-kirjastoa käytetään esimerkiksi seuraavalla tavalla:
import numpy as np
# Vektori A
A = np.array([2, 4, 6])
# Vektori B
B = np.array([1, 3, 5])
print("A :", A)
print("B :", B)
# Vektorisumma ja -erotus
print("A+B :", A+B)
print("A-B :", A-B )
# Elementeittäin tulo
print("A*B :", A*B)
# Vektorisisätulo eli pistetulo <A,B>
print("A@B :", A@B)
# Vektoriristitulo
print("AxB :", np.cross(A,B))
# Vektoriulkotulo tuottaa matriisin
print("AxB :", np.outer(A,B))
Matplotlib-kirjastoa käytetään esimerkiksi seuraavalla tavalla:
import matplotlib.pyplot as plt
import numpy as np
# Matplotlib testus muokattu sivulta https://matplotlib.org/stable/gallery/lines_bars_and_markers/simple_plot.html
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
fig, ax = plt.subplots()
ax.plot(t, s)
ax.set(xlabel='Aika (s)', ylabel='Jännite (mV)',
title='Hieno siniaalto')
ax.grid()
plt.show()
Lopuksi¶
Jos tässä vaiheessa näytetyt Python-koodin esimerkit tuntuvat irrallisilta, ei syytä huoleen. Tarkoitus on, että voit palata tälle sivulle milloin tahansa katsomaan mallia, kun muokkaat opetusmoduuleissa esitettävää esimerkkikoodia. Pythonin opiskeluun on olemassa oma MOOC-kurssinsa, joten emme käytä aikaa varsinaiseen ohjelmoinnin opetteluun. Tavoitteenamme on näyttää Python-kielellä ja koodiesimerkeillä, miten tiettyjä kryptografian toimenpiteitä voidaan toteuttaa.