Todella Kattava Python-opas Aloittelijalle - Opi Päivässä!

Tekijä: Marko (Khaida) Tarvainen

Sisällysluettelo

1. Tervetuloa koodaamaan Pythonilla!

Hienoa, että olet päättänyt tarttua Pythoniin! Se on super suosittu ja monipuolinen ohjelmointikieli, jolla voi tehdä lähes mitä vain: nettisivuja, pelejä, datan analysointia, automaatiota ja vaikka mitä. Se on myös erityisen hyvä kieli aloittaa, koska sen syntaksi on todella selkeää ja loogista.

Tässä oppaassa käymme läpi Pythonin peruspalikat askel askeleelta. Tarkoitus on, että pääset kunnolla jyvälle siitä, miten koodi toimii ja miten voit alkaa rakentaa omia juttujasi.

**Mitä tarvitset?**

Ei panikoida, jos kaikki ei heti tunnu selvältä. Koodaus on kuin uuden kielen oppimista – harjoitus tekee mestarin. Aloitetaan!

---

2. Pythonin asentaminen – Homma käyntiin!

Ennen kuin pääsemme koodaamaan, Python täytyy asentaa koneellesi. Seuraa oman käyttöjärjestelmäsi ohjeita.

2.1 Windows

  1. Mene Pythonin virallisille sivuille: python.org/downloads/windows/
  2. Lataa uusin vakaa versio (yleensä ylin vaihtoehto, esim. "Python 3.10.x"). Valitse "Windows installer (64-bit)" tai "Windows installer (32-bit)" käyttöjärjestelmäsi mukaan. Useimmat nykyaikaiset koneet ovat 64-bittisiä.
  3. Suorita ladattu asennustiedosto (.exe).
  4. **TÄRKEÄÄ:** Muista **rastittaa ruutu "Add Python X.Y to PATH"** asennuksen alkuvaiheessa. Tämä helpottaa Pythonin käyttöä komentoriviltä. Jos unohdat tämän, voit tehdä sen myöhemmin manuaalisesti, mutta se on monimutkaisempaa.
  5. Valitse "Install Now" ja anna asennuksen edetä.
  6. Kun asennus on valmis, paina "Close".

VINKKI: Jos haluat lisätä Pythonin PATH-ympäristömuuttujaan manuaalisesti jälkikäteen Windowsissa, voit hakea Start-valikosta "Ympäristömuuttujat" (Environment Variables), valita "Järjestelmän ympäristömuuttujat" (System Variables) ja muokata PATH-muuttujaa. Lisää sinne polut Pythonin asennuskansioon ja Scripts-alikansioon (esim. C:\Users\Käyttäjä\AppData\Local\Programs\Python\Python39 ja C:\Users\Käyttäjä\AppData\Local\Programs\Python\Python39\Scripts).

2.2 macOS

macOS:ssä on yleensä esiasennettuna Python 2, mutta se on vanhentunut. Tarvitsemme Python 3:n.

  1. Mene Pythonin virallisille sivuille: python.org/downloads/mac-osx/
  2. Lataa uusin vakaa versio (esim. "macOS 64-bit universal2 installer").
  3. Suorita ladattu asennustiedosto (.pkg) ja seuraa ohjeita. Asennusohjelma hoitaa yleensä PATH-asetukset automaattisesti.

VINKKI: Mac-käyttäjät voivat halutessaan asentaa myös Homebrew-pakettihallinnan (brew.sh) ja asentaa Pythonin sen kautta komennolla brew install python3. Tämä on usein kätevämpi tapa hallita kehitystyökaluja.

2.3 Linux

Useimmissa Linux-jakeluissa Python 3 on jo esiasennettuna. Voit tarkistaa sen, kuten alla olevassa "Tarkista asennus" -osiossa.

Jos se ei ole asennettuna tai haluat uusimman version, voit asentaa sen jakelusi pakettihallinnalla:

2.4 Tarkista asennus

Avaa **komentorivi** (Windowsissa "cmd" tai "PowerShell", macOS:ssä/Linuxissa "Terminal" / "Pääte"). Kirjoita sitten:

python3 --version

Jos näet jotain tyyliin "Python 3.10.x" (missä x on jokin numero), asennus on onnistunut! Jos saat virheilmoituksen, Python ei ole PATH:ssa, ja sinun pitää korjata se (ks. vinkit yllä).

2.5 Koodieditori – Mistä koodia kirjoitetaan?

Voit kirjoittaa Python-koodia vaikka Muistioon, mutta koodieditori tekee elämästäsi paljon helpompaa. Se auttaa syntaksikorostuksella (värit, jotka tekevät koodista luettavampaa), automaattisella täydennyksellä ja virheiden etsimisellä.

Suositeltavat koodieditorit aloittelijalle:

Valitse jompikumpi näistä, asenna se ja olet valmis tositoimiin!

---

3. Ensimmäinen Python-ohjelmasi – "Hei, maailma!"

Perinteisesti ensimmäinen ohjelma, jonka jokainen koodari kirjoittaa, on "Hei, maailma!". Se opettaa sinulle, miten koodi suoritetaan.

  1. Avaa valitsemasi koodieditori (esim. VS Code).
  2. Luo uusi tiedosto (File -> New File).
  3. Kirjoita seuraava koodi tiedostoon:
    print("Hei, maailma!")
  4. Tallenna tiedosto jollain nimellä, joka päättyy `.py`-päätteeseen (esim. `ensimmainen.py`). Tallenna se johonkin helposti löydettävään paikkaan, vaikka Työpöydälle tai "koodaus" -kansioon.
  5. **Suorita ohjelma:**
    • Avaa **komentorivi** (Terminal/Pääte).
    • Siirry kansioon, johon tallensit tiedoston. Jos tallensit sen Työpöydälle, voit käyttää komentoa:
      cd C:\Users\OmaKäyttäjä\Desktop   (Windows)
      cd ~/Desktop                 (macOS/Linux)
    • Kun olet oikeassa kansiossa, suorita ohjelma komennolla:
      python3 ensimmainen.py

Sinun pitäisi nähdä tulostus: **"Hei, maailma!"** komentorivillä. Onneksi olkoon, olet koodari!

Mikä ihmeen `print()`?
print() on Pythonin **funktio**, jolla voit tulostaa tekstiä tai numeroita konsoliin (komentoriville). Kaikki sulkujen sisällä oleva teksti (merkkijono) tulostuu. Teksti pitää laittaa lainausmerkkeihin (`""` tai `''`).

---

4. Muuttujat – Pythonin muistikirjat

Koodaamisessa joudut usein tallentamaan tietoa – nimiä, numeroita, totuusarvoja. Tätä varten käytetään **muuttujia**. Ajattele muuttujaa kuin nimellä varustettua laatikkoa, johon voit laittaa tietoa ja josta voit myöhemmin hakea sen.

nimi = "Marko"
ika = 30
onko_opiskelija = False # True tai False
pii = 3.14159

print(nimi)
print(ika)
print(onko_opiskelija)
print(pii)

Muuttujan nimeämissäännöt:

4.1 Tietotyypit – Mitä muuttujiin voi tallentaa?

Jokaisella muuttujalla on jokin **tietotyyppi**, joka kertoo, minkälaista tietoa se sisältää. Python tunnistaa tietotyypin automaattisesti, joten sinun ei tarvitse sitä erikseen määrittää (kuten joissain muissa kielissä).

Voit tarkistaa muuttujan tyypin type()-funktiolla:

nimi = "Aino"
ika = 40

print(type(nimi))  # Tulostaa: <class 'str'>
print(type(ika))   # Tulostaa: <class 'int'>
---

5. Operaattorit – Matematiikkaa ja vertailua

Operaattoreilla tehdään laskutoimituksia, vertailuja ja loogisia operaatioita.

5.1 Aritmeettiset operaattorit (matematiikkaa)

Operaattori Kuvaus Esimerkki
+ Yhteenlasku 5 + 3 (tulos 8)
- Vähennyslasku 10 - 4 (tulos 6)
* Kertolasku 6 * 2 (tulos 12)
/ Jakolasku (tulos aina liukuluku) 10 / 3 (tulos 3.333...)
// Kokonaislukujako (jäännös pois) 10 // 3 (tulos 3)
% Jakojäännös (modulo) 10 % 3 (tulos 1, koska 10 = 3*3 + 1)
** Potenssi 2 ** 3 (tulos 8, eli 2*2*2)
luku1 = 15
luku2 = 4

print(luku1 + luku2) # 19
print(luku1 - luku2) # 11
print(luku1 * luku2) # 60
print(luku1 / luku2) # 3.75
print(luku1 // luku2) # 3
print(luku1 % luku2) # 3 (koska 15 = 3*4 + 3)
print(2 ** 4) # 16

Merkkijonojen yhdistäminen: +-operaattoria voi käyttää myös merkkijonojen yhdistämiseen (konkatenaatio):

etunimi = "Matti"
sukunimi = "Meikäläinen"
koko_nimi = etunimi + " " + sukunimi
print(koko_nimi) # Tulostaa: Matti Meikäläinen

5.2 Vertailuoperaattorit (tulos on True tai False)

Operaattori Kuvaus Esimerkki
== Yhtä suuri kuin (huom. kaksi yhtäsuuruusmerkkiä!) 5 == 5 (True)
!= Ei yhtä suuri kuin 5 != 6 (True)
> Suurempi kuin 10 > 5 (True)
< Pienempi kuin 10 < 5 (False)
>= Suurempi tai yhtä suuri kuin 5 >= 5 (True)
<= Pienempi tai yhtä suuri kuin 5 <= 6 (True)
a = 7
b = 7
c = 9

print(a == b)  # True
print(a != c)  # True
print(c > a)   # True
print(a <= b)  # True

5.3 Loogiset operaattorit (yhdistää totuusarvoja)

Operaattori Kuvaus Esimerkki
and Molempien ehtojen oltava totta (True and False) (False)
or Toisen tai molempien ehtojen oltava totta (True or False) (True)
not Kääntää totuusarvon (True -> False, False -> True) not True (False)
ika = 18
onko_ajokortti = True

if ika >= 18 and onko_ajokortti:
    print("Voit ajaa autoa!")

saldo = 50
halutaan_ostaa = 100

if saldo >= halutaan_ostaa or onko_ajokortti: # Vaikka saldo ei riitä, jos on ajokortti (eli toinen True), ehto on True
    print("Joko rahat riittää tai kortti löytyy!")
---

6. Syöte ja tuloste – Keskustelua käyttäjän kanssa

Olemme jo nähneet print()-funktion, jolla ohjelma "puhuu" käyttäjälle. Mutta miten käyttäjä "puhuu" ohjelmalle?

Siihen käytetään **input()**-funktiota. Se pyytää käyttäjältä syötettä ja tallentaa sen merkkijonona.

nimi = input("Mikä on nimesi? ")
print("Hei, " + nimi + "!")

ika_tekstina = input("Kuinka vanha olet? ")
# Muista muuttaa syöte numeroksi, jos aiot tehdä laskutoimituksia!
ika = int(ika_tekstina)

print("Olet " + str(ika) + " vuotta vanha.")
print("Syntymävuotesi on noin", 2025 - ika) # print voi yhdistää eri tyyppejä pilkulla

Tärkeää `input()`-funktiosta:
input() palauttaa **aina merkkijonon**. Jos odotat käyttäjältä numeroa ja aiot käyttää sitä laskutoimituksissa, sinun on muunnettava se kokonaisluvuksi (`int()`) tai liukuluvuksi (`float()`).

# Esimerkki: Kaksi lukua yhteenlasku
luku1_str = input("Anna ensimmäinen luku: ")
luku2_str = input("Anna toinen luku: ")

luku1 = int(luku1_str) # Muunna merkkijonosta kokonaisluvuksi
luku2 = int(luku2_str)

summa = luku1 + luku2
print("Lukujen summa on:", summa)
---

7. Ehtolauseet (if, elif, else) – Päätöksiä koodissa

Ohjelman on usein tehtävä päätöksiä tiettyjen ehtojen perusteella. Ehtolauseilla kerrotaan Pythonille, mitä tehdä, jos jokin ehto on totta tai epätotta.

Perusrakenne on:

if ehto:
    # Tee jotain, jos ehto on True
elif toinen_ehto:
    # Tee jotain, jos ensimmäinen ehto oli False JA tämä ehto on True
else:
    # Tee jotain, jos kaikki yläpuoliset ehdot olivat False

**TÄRKEÄÄ:** Pythonissa koodilohkot merkitään **sisennyksillä (indentation)**! Käytä yleensä 4 välilyöntiä tai yhtä tabulaattoria sisentämiseen. Sisennyksen puuttuminen tai virheellinen sisennys aiheuttaa virheen!

ika = 20

if ika >= 18:
    print("Olet täysi-ikäinen.")
else:
    print("Et ole vielä täysi-ikäinen.")

# --- Toinen esimerkki ---
lampotila = 15

if lampotila > 25:
    print("On kuuma!")
elif lampotila > 15: # Eli jos ei yli 25, mutta yli 15
    print("On mukavan lämmintä.")
else:
    print("On viileää.")

# --- Voit myös ketjuttaa ehtoja ---
ika = 15
rahaa = 20

if ika >= 18 and rahaa >= 10:
    print("Voit mennä elokuviin ja ostaa popcornia!")
elif ika >= 18:
    print("Voit mennä elokuviin, mutta rahat ei ehkä riitä popcorneihin.")
else:
    print("Et ole tarpeeksi vanha elokuviin.")
---

8. Silmukat (for, while) – Toistoa ilman tylsyyttä

Jos haluat toistaa jonkin koodilohkon useita kertoja, käytä **silmukoita**. Ne ovat koodarin parhaita ystäviä tylsän toiston välttämiseksi.

8.1 for-silmukka – Kun tiedät toistojen määrän

for-silmukkaa käytetään usein, kun haluat käydä läpi kokoelman (esim. listan) kaikki alkiot tai toistaa jotain tietyn määrän kertoja.

# Esimerkki 1: Toista lukuja 0-4
for i in range(5): # range(5) luo lukuja 0, 1, 2, 3, 4
    print(i)

# Esimerkki 2: Käy läpi lista
hedelmat = ["omena", "banaani", "appelsiini"]
for hedelma in hedelmat:
    print("Pidän", hedelma + "sta.")

# Esimerkki 3: Käy läpi merkkijonon kirjaimet
sana = "Python"
for kirjain in sana:
    print(kirjain)

`range()`-funktio:
* `range(5)`: luvut 0, 1, 2, 3, 4 (pysähtyy ennen 5:ttä) * `range(1, 5)`: luvut 1, 2, 3, 4 (alkaa 1:stä, pysähtyy ennen 5:ttä) * `range(0, 10, 2)`: luvut 0, 2, 4, 6, 8 (alkaa 0:sta, hyppää kahden välein, pysähtyy ennen 10:tä)

8.2 while-silmukka – Kun toistojen määrä on tuntematon

while-silmukka toistaa koodilohkoa niin kauan kuin jokin ehto on totta. Ole varovainen, ettei silmukka jää ikuisesti pyörimään!

laskuri = 0
while laskuri < 5:
    print("Laskuri on:", laskuri)
    laskuri += 1 # Lyhennys: laskuri = laskuri + 1
print("Silmukka päättyi.")

# --- Varo ikuista silmukkaa! ---
# luku = 1
# while True: # Tämä ehto on aina True
#    print(luku)
#    luku += 1
# Paina Ctrl+C komentorivillä lopettaaksesi tällaisen.

break ja continue:
* **break:** Katkaisee silmukan kokonaan ja siirtyy silmukan jälkeiseen koodiin. * **continue:** Hyppää silmukan nykyisen kierroksen yli ja jatkaa seuraavasta kierroksesta.

# Esimerkki break
for i in range(10):
    if i == 5:
        break # Katkaisee silmukan kun i on 5
    print(i) # Tulostaa 0, 1, 2, 3, 4

# Esimerkki continue
for i in range(5):
    if i == 2:
        continue # Hyppää yli kun i on 2
    print(i) # Tulostaa 0, 1, 3, 4

---

9. Listat – Järjestetty kokoelma asioita

Listat ovat yksi Pythonin tärkeimmistä tietorakenteista. Ne ovat kokoelmia, joihin voit tallentaa useita arvoja. Listat ovat **järjestettyjä** (alkioilla on järjestys) ja **muutettavissa** (voit lisätä, poistaa ja muuttaa alkioita).

Listat luodaan hakasulkeilla `[]`.

hedelmat = ["omena", "banaani", "appelsiini", "mansikka"]
luvut = [1, 5, 2, 8, 3]
sekalainen_lista = ["Hei", 123, True, 3.14]

# Käsiksi listan alkioihin indeksin avulla (indeksointi alkaa nollasta!)
print(hedelmat[0]) # Tulostaa: omena (ensimmäinen alkio)
print(hedelmat[2]) # Tulostaa: appelsiini (kolmas alkio)
print(hedelmat[-1]) # Tulostaa: mansikka (viimeinen alkio)

# Muuta listan arvoa
hedelmat[1] = "kiivi"
print(hedelmat) # Tulostaa: ['omena', 'kiivi', 'appelsiini', 'mansikka']

# Listan pituus (montako alkiota siinä on)
print(len(hedelmat)) # Tulostaa: 4

9.1 Listojen yleisiä toimintoja (metodit)

Metodi Kuvaus Esimerkki
.append(alkio) Lisää alkion listan loppuun. lista.append("uusi")
.insert(indeksi, alkio) Lisää alkion tiettyyn indeksiin. lista.insert(1, "keskelle")
.remove(alkio) Poistaa ensimmäisen löydetyn alkion. lista.remove("omena")
.pop(indeksi) Poistaa ja palauttaa alkion tietystä indeksistä (oletus viimeinen). poistettu = lista.pop(0)
.sort() Järjestää listan alkiot. luvut.sort()
.reverse() Kääntää listan järjestyksen. lista.reverse()
.count(alkio) Laskee tietyn alkion esiintymien määrän. maara = lista.count("omena")
.index(alkio) Palauttaa alkion indeksin. indeksi = lista.index("banaani")
ostoslista = ["maito", "leipä", "kahvi"]

ostoslista.append("juusto") # Lisää loppuun
print(ostoslista) # ['maito', 'leipä', 'kahvi', 'juusto']

ostoslista.insert(1, "voi") # Lisää toiseksi alkioksi (indeksi 1)
print(ostoslista) # ['maito', 'voi', 'leipä', 'kahvi', 'juusto']

ostoslista.remove("kahvi") # Poistaa "kahvi"
print(ostoslista) # ['maito', 'voi', 'leipä', 'juusto']

viimeinen = ostoslista.pop() # Poistaa ja ottaa talteen viimeisen
print(viimeinen) # juusto
print(ostoslista) # ['maito', 'voi', 'leipä']

luvut = [3, 1, 4, 1, 5, 9, 2]
luvut.sort() # Järjestää luvut nousevaan järjestykseen
print(luvut) # [1, 1, 2, 3, 4, 5, 9]
---

10. Tuplit – Muuttumattomat listat

Tuplit ovat hyvin samanlaisia kuin listat, mutta niitä ei voi muuttaa sen jälkeen, kun ne on luotu. Eli et voi lisätä, poistaa tai muuttaa alkioita. Tuplit luodaan suluilla `()`.

Miksi tupleja sitten käytettäisiin? Ne ovat usein hieman nopeampia, turvallisempia (koska arvoja ei voi vahingossa muuttaa) ja käytetään, kun halutaan varmistaa, että tiedot pysyvät samoina (esim. koordinaatit, päivämäärät).

koordinaatit = (10, 20)
varkauden_paikka = ("Helsinki", "Kampintori", 60.1695, 24.9354)

# Käsiksi alkioihin indeksin avulla (kuten listat)
print(koordinaatit[0]) # Tulostaa: 10

# Yritä muuttaa (tämä aiheuttaa virheen!)
# koordinaatit[0] = 30 # TypeError: 'tuple' object does not support item assignment
---

11. Sanakirjat (Dictionaries) – Avain-arvo-parit

Sanakirjat ovat kokoelmia, jotka tallentavat tietoa **avain-arvo-pareina**. Ajattele niitä kuin oikeaa sanakirjaa, jossa on sana (avain) ja sen selitys (arvo).

Sanakirjat luodaan aaltosulkeilla `{}`.

henkilo = {
    "nimi": "Maija",
    "ika": 30,
    "kaupunki": "Tampere",
    "ammatti": "Ohjelmoija"
}

# Käsiksi arvoihin avaimen avulla
print(henkilo["nimi"])     # Tulostaa: Maija
print(henkilo["kaupunki"]) # Tulostaa: Tampere

# Muuta arvoa
henkilo["ika"] = 31
print(henkilo["ika"]) # Tulostaa: 31

# Lisää uusi avain-arvo-pari
henkilo["harrastus"] = "lukeminen"
print(henkilo) # Tulostaa koko sanakirjan uusitulla sisällöllä

# Poista avain-arvo-pari
del henkilo["ammatti"]
print(henkilo)

# Tarkista, onko avain olemassa
if "nimi" in henkilo:
    print("Nimi löytyi!")

# Käy läpi avaimet
for avain in henkilo:
    print(avain)

# Käy läpi arvot
for arvo in henkilo.values():
    print(arvo)

# Käy läpi avain-arvo-parit
for avain, arvo in henkilo.items():
    print(avain + ": " + str(arvo))
---

12. Funktiot – Koodin palapeli

Funktio on koodilohko, joka suorittaa tietyn tehtävän. Voit "kutsua" funktiota suorittamaan sen tehtävän uudelleen ja uudelleen, ilman että sinun tarvitsee kirjoittaa samaa koodia moneen paikkaan. Funktiot tekevät koodista järjestäytyneempää, helpommin luettavaa ja ylläpidettävää.

Funktio määritellään `def`-avaisanalla, jonka jälkeen tulee funktion nimi ja sulut `()`. Sisennys kertoo, mikä koodi kuuluu funktioon.

# Yksinkertainen funktio
def tervehdi():
    print("Hei, maailma!")
    print("Mukavaa päivää!")

# Kutsutaan funktiota suorittamaan sen tehtävä
tervehdi()
tervehdi() # Voit kutsua sitä useasti!

12.1 Parametrit ja paluuarvot

Globaalit ja lokaalit muuttujat: * Funktion sisällä määritellyt muuttujat ovat **lokaaleja** – ne ovat olemassa vain funktion suorituksen ajan. * Funktion ulkopuolella määritellyt muuttujat ovat **globaaleja** – ne ovat olemassa koko ohjelman ajan. Älä muokkaa globaaleja muuttujia funktioiden sisältä, ellei ole pakko ja tiedät mitä teet!

---

13. Moduulit – Valmiita palikoita

Pythonissa on valtava määrä **moduuleja** (kirjastoja), jotka sisältävät valmiita funktioita ja työkaluja eri tarkoituksiin. Ne säästävät sinulta valtavasti työtä, koska sinun ei tarvitse keksiä pyörää uudelleen.

Käytät moduuleja `import`-avainsanalla.

# Tuodaan 'math'-moduuli matematiikkatoimintoja varten
import math

sade = 5
ala = math.pi * sade ** 2 # Käytetään pi-arvoa math-moduulista
print("Ympyrän ala on:", ala)

neliöjuuri = math.sqrt(25) # Käytetään neliöjuuri-funktiota
print("Neliöjuuri 25:stä on:", neliöjuuri)

# Tuodaan 'random'-moduuli satunnaislukujen luomiseen
import random

satunnainen_luku = random.randint(1, 10) # Satunnainen kokonaisluku 1-10
print("Satunnainen luku:", satunnainen_luku)

valinta = random.choice(["kivi", "paperi", "sakset"]) # Satunnainen valinta listasta
print("Pelin valinta:", valinta)

Moduulien asentaminen (pip): Monet moduulit ovat valmiina Pythonin mukana, mutta voit asentaa lisää `pip`-työkalulla (Pythonin pakettienhallinta). Esimerkiksi:

pip install requests # Asentaa requests-kirjaston verkkopyyntöihin
pip install numpy # Asentaa NumPy-kirjaston numeerisiin laskuihin

---

14. Kommentit – Selityksiä koodiin

Kommentit ovat selityksiä, jotka kirjoitat koodiin itsellesi ja muille koodareille. Python ei suorita kommentteja, vaan ne ovat vain muistiinpanoja. Kommentit ovat todella tärkeitä, jotta koodisi on ymmärrettävää myöhemmin!

Yhden rivin kommentti alkaa `#`-merkillä.

# Tämä on yksinkertainen kommentti
print("Hei!") # Tämäkin on kommentti

# Tämä on toinen kommentti
# ja tämä on sen toinen rivi

'''
Tämä on monirivinen kommentti.
Voit kirjoittaa tähän useammalle riville selityksiä.
Se on teknisesti merkkijono, mutta jos sitä ei tallenneta muuttujaan,
Python kohtelee sitä kommenttina.
'''
print("Koodi jatkuu tästä.")
---

15. Virheiden käsittely (try-except) – Kun homma menee pieleen

Ohjelmat kaatuvat joskus, jos esimerkiksi käyttäjä antaa vääränlaisen syötteen tai tiedostoa ei löydy. Pythonissa voit "käsitellä" virheitä niin, ettei ohjelma kaadu kokonaan. Tähän käytetään `try`- ja `except`-lohkoja.

try:
    # Koodi, josta voi tulla virhe
    luku = int(input("Anna kokonaisluku: "))
    tulos = 10 / luku
    print("Tulos on:", tulos)
except ValueError:
    # Tämä koodi suoritetaan, jos tapahtuu ValueError (esim. syötteenä teksti)
    print("Virhe: Et antanut kokonaislukua!")
except ZeroDivisionError:
    # Tämä koodi suoritetaan, jos tapahtuu ZeroDivisionError (eli jaetaan nollalla)
    print("Virhe: Et voi jakaa nollalla!")
except Exception as e: # Yleisempi virheen käsittely
    print(f"Tapahtui tuntematon virhe: {e}")
finally:
    # Tämä koodi suoritetaan aina, tapahtuipa virhe tai ei
    print("Virheiden käsittely kokeiltu.")
---

16. Tiedoston käsittely – Koodi ja tiedostot puhuvat

Ohjelmat usein lukevat tietoa tiedostoista tai kirjoittavat tuloksia tiedostoihin. Tähän käytetään `open()`-funktiota.

**Tiedostotilat:** * `"r"`: lukutila (oletus) * `"w"`: kirjoitustila (luo uuden tiedoston tai ylikirjoittaa olemassa olevan) * `"a"`: lisäystila (lisää tiedoston loppuun, luo uuden jos tiedostoa ei ole)

# --- Tiedoston kirjoittaminen ---
# Käytä 'with'-lausetta, se sulkee tiedoston automaattisesti!
with open("tervehdys.txt", "w") as tiedosto:
    tiedosto.write("Hei, tämä on ensimmäinen rivi.\n")
    tiedosto.write("Ja tässä toinen rivi!\n")
print("Tiedosto kirjoitettu!")

# --- Tiedoston lukeminen ---
try:
    with open("tervehdys.txt", "r") as tiedosto:
        sisalto = tiedosto.read() # Lukee koko tiedoston
        print("Tiedoston sisältö:")
        print(sisalto)

    with open("tervehdys.txt", "r") as tiedosto:
        print("\nTiedoston sisältö rivi kerrallaan:")
        for rivi in tiedosto: # Käy läpi rivi kerrallaan
            print(rivi.strip()) # .strip() poistaa rivinvaihdot ja tyhjät merkit

except FileNotFoundError:
    print("Virhe: Tiedostoa ei löytynyt!")
---

17. Johdanto olio-ohjelmointiin (Classes & Objects) – Järjestystä koodiin

Olio-ohjelmointi (Object-Oriented Programming, OOP) on ohjelmointiparadigma, joka auttaa rakentamaan monimutkaisia ohjelmia järkevämmällä ja modulaarisemmalla tavalla. Se perustuu **luokkien (classes)** ja **olioiden (objects)** käsitteisiin.

# Määritellään 'Auto'-luokka
class Auto:
    # Konstruktori: luo olion ja asettaa sen alkuarvot
    def __init__(self, merkki, malli, vuosi):
        self.merkki = merkki # 'self' viittaa tähän kyseiseen olioon
        self.malli = malli
        self.vuosi = vuosi
        self.nopeus = 0

    # Metodi: olion toiminto
    def kiihdyta(self, maara):
        self.nopeus += maara
        print(f"Auto kiihtyy. Nopeus nyt: {self.nopeus} km/h")

    # Metodi: olion toiminto
    def nayta_tiedot(self):
        print(f"Merkki: {self.merkki}, Malli: {self.malli}, Vuosi: {self.vuosi}, Nopeus: {self.nopeus} km/h")

# Luodaan Auto-olioita (eli "autoja")
auto1 = Auto("Toyota", "Corolla", 2018)
auto2 = Auto("Volvo", "XC60", 2022)

# Kutsutaan olioiden metodeja
auto1.nayta_tiedot()
auto2.nayta_tiedot()

auto1.kiihdyta(50)
auto1.nayta_tiedot()

auto2.kiihdyta(20)
auto2.kiihdyta(30)
auto2.nayta_tiedot()

`self` -avainsana: Kun määrität luokan sisällä metodeja, ensimmäinen parametri on aina `self`. Se viittaa siihen olioon, jota parhaillaan käsitellään. Sinun ei tarvitse antaa `self`-arvoa kutsuessasi metodia (Python hoitaa sen automaattisesti).

---

18. Virtuaaliympäristöt – Siisti tapa hallita projekteja

Kun työskentelet useamman Python-projektin kanssa, saatat huomata, että eri projektit tarvitsevat eri versioita samoista moduuleista. Tämän ongelman ratkaisee **virtuaaliympäristö**.

Virtuaaliympäristö luo jokaiselle projektille oman eristetyn Python-asennuksen ja omat moduulikokoelmat. Näin projektiesi riippuvuudet eivät mene sekaisin toistensa kanssa.

**Näin luot ja aktivoit virtuaaliympäristön (komentorivillä):**

  1. Siirry projektisi kansioon:
    cd C:\Users\OmaKäyttäjä\Projektit\PythonAppi   (Windows)
    cd ~/Projektit/PythonAppi                 (macOS/Linux)
  2. Luo virtuaaliympäristö (esim. `venv` nimellä):
    python3 -m venv venv
    Tämä luo `venv`-nimisen kansion projektikansioosi.
  3. Aktivoi virtuaaliympäristö:
    • **Windows (PowerShell):**
      .\venv\Scripts\Activate.ps1
      (Jos PowerShell antaa virheen, sinun on ehkä ensin suoritettava `Set-ExecutionPolicy RemoteSigned -Scope CurrentUser` kerran PowerShellissä järjestelmänvalvojana.)
    • **Windows (Command Prompt / cmd):**
      venv\Scripts\activate
    • **macOS/Linux:**
      source venv/bin/activate
  4. Kun ympäristö on aktiivinen, näet yleensä suluissa ympäristön nimen komentorivin alussa (esim. `(venv) C:\Users\OmaKäyttäjä\Projektit\PythonAppi>`).
  5. Nyt voit asentaa moduuleja tähän ympäristöön, eikä se vaikuta muihin Python-asennuksiin:
    pip install requests
  6. Kun olet valmis, voit deaktivoida ympäristön:
    deactivate

Virtuaaliympäristöt ovat hyvä käytäntö ja niitä kannattaa käyttää jokaisen uuden Python-projektin kanssa!

---

19. Mitä seuraavaksi? – Jatka oppimista!

Olet nyt käynyt läpi Pythonin perusasiat! Tämä on loistava pohja, mutta opittavaa on vielä valtavasti. Tässä muutamia vinkkejä jatkoon:

---

20. Yhteenveto

Mahtavaa työtä! Olet nyt käynyt läpi Pythonin ytimen. Muistutetaan vielä, mitä olet oppinut:

Tämä on valtava määrä tietoa, mutta toivottavasti se on esitetty niin, että pystyt ottamaan sen haltuun. Muista: **tee, erehdy, opi ja toista!** Se on paras tapa kehittyä koodaajana.

Onnea koodausmatkalle! Jos tulee kysyttävää, älä epäröi kysyä.

Kiitos, että luit! Marko (Khaida) Tarvainen