Syntaksi
Python lyhyesti:
- Python-ohjelma koostuu riveistä, jotka suoritetaan järjestyksessä ylhäältä alas.
- Rivit päättyvän rivinvaihtoon (tarkemmin merkkeihin
LF
taiCR+LF
). Siispä komentoja ei päätetä esimerkiksi;
-merkkiin, kuten monissa muissa kielissä. - Tyhjät rivit ovat sallittuja ja luettavuuden parantamiseksi jopa suositeltavia. Koodin voi jakaa loogisiin kokonaisuuksiin samalla tavalla kuin tavallisessa tekstissä kappaleet.
- Koodia ei erikseen käännetä binääriksi vaan Python-tulkki lukee
.py
-tiedostoa ja tulkkaa sitä tavukoodiksi. Kyseessä on siis tulkattava ohjelmointikieli. - Python on olio-ohjelmointikieli, mutta ei sulje pois muiden paradigmojen kuten proseduraalisen tai funktionaalisen ohjelmoinnin käyttöä.
- Koodin on luonut Guido van Rossum ja sen nimi tulee Monty Python's Flying Circus -tv-sarjasta. Mikäli sarja on sinulle tuttu, tulet huomaamaan dokumentaatiossa useita viitteitä ohjelmaan, kuten egg, ham, spam, spam, spam ...
- Kooditiedostot ovat tavallisesti UTF-8 -enkoodattuja ja tukevat näin valtavaa merkistöä. Myös emojit toimivat.
- Sisennyksellä on erityinen merkitys! Sillä on siis merkitystä, että alkaako rivi ilman välilyöntejä vai 4, 8, 16 tai jollakin muulla määrällä välilyöntejä. Konventio on, että välilyöntejä on aina neljällä jaollinen määrä, ja että sisennykseen käytetään nimenomaan välilyöntiä eikä koskaan tabulaattoria.
Tehtävä
Lue Python Docsin oma Whetting Your Appetite, joka mainostaa Pythonin vahvuuksia
Tietokoneohjelmat tallentavat tietokoneen muistiin (eli "rammiin") muuttujien arvot. Monissa matalamman tason ohjelmointikielissä, kuten C-kielessä, arvot tallennetaan muistiin kohtalaisen raakana. Python on hyvin korkean tason (eng. high level) ohjelmointikieli, joten yksinkertaisimmatkin asiat kuten kokonaisluvut (eng. integer) tallennetaan muistiin objekteina. Pythonissa ei ole C-kielestä tuttu pointtereita.
Esimerkkikoodia
Jotta Python tulisi välittömästi tutuksi, hypätään suoraan altaan syvään päätyyn ja tuijotetaan koodia. Mikäli et ole aiemmin ohjelmoinut millään kielellä, et välttämättä ymmärrä alla olevaa koodia kokonaisuudessaan. Yritetään silti silmäillä, mitä siinä tapahtuu. Koodissa määritellään tyypillinen Python-funktio. Kyseinen funktio ottaa sisäänsä yhden positionaalisen argumentin (words
) sekä kaksi keyword argumenttia (per_row
sekä margin
). Funktio ottaa sisäänsä listan sanoja ja tulostaa ne ruudulle tabulaarisessa muodossa. Esimerkki funktiokutsusta on hieman alempana.
def print_as_tabular( # (1)
words:list[str], # (2)
per_row:int=5,
margin:int=2
): # (3)
# Calculate variables # (4)
column_width = max([len(x) for x in words]) + margin
n_words = len(words) # (5)
# Loop and print
for batch in range(0, n_words, per_row): # (6)
row_words = words[batch:batch + per_row]
for word in row_words:
print(f"{word:<{column_width}}", end="") # (7)
print()
- Funktio määritellään
def
-sanalla. Funktion nimi on tässä tapauksessaprint_as_tabular
. Argumentit määritellään funktion nimen jälkeen sulkujen väliin pilkulla erotettuna. - Funktion ensimmäinen argumentti ei sisällä default-arvoa ja on näin positionaalinen argumentti. Käyttäjän on pakko antaa sille arvo funktiota kutsuttaessa. Rivi sisältää myös Pythonissa suhteellisen tuoreen
type hint
-vihjeen, joka onlist[str]
. Näin käyttäjä sekä IDE kuten VSCode tietävät, että ensimmäisen argumentin kuuluisi olla lista, joka sisältää merkkijonoja. Kaksi muuta argumenttia ovat vailla default-arvoa, mutta myös niillä on tyyppivihje (int
). Positionaaliset argumentit tulee aina määritellä ennen keyword-argumentteja. - Funktion määrittely lopetetaan sulken jälkeen puolipisteeseen. Funktion runko jatkuu seuraavilla riveillä siten, että sitä on sisennetty neljällä välilyönnillä. Pythonissa lähes aina yksittäinen rivi sisältää jonkin kokonaisuuden, kuten funktion määrittelyn. Sulkeet ovat poikkeus. Sulkeiden välissä olevan sisällön saa jakaa haluamalleen määrälle rivejä, kunhan noudattaa sisennyssääntöjä.
- Yhden rivin kommentit aloitetaan risuaidalla.
- Uusia muuttujia ei tarvitse erikseen alustaa mitenkään eikä niille tarvitse määritellä tiettyä tyyppiä kuten
int
taistr
. Tyyppivihje on kuitenkin tuettuna; sitä ei vain käytetä tässä esimerkissä. - Kontrolli- ja silmukkarakenteet kuten
for
muistuttavat funktion määrittelyä rakenteeltaan. Rivin viimeinen merkki on puolipiste. Rakenteen runko on sisennetty 4 välilyönnillä määrittelyyn nähden. - Tavallisesti sisäänrakennetun
print
-funktion kutsuminen luo yhden rivin per kutsu. Tässä sitä rikotaan antamalla funktiolle keyword-argumenttiend
, jossa rivi lopetetaan rivinvaihdon sijasta pelkällä tyhjällä.
Varatut avainsanat
Pythonissa, kuten muissakin ohjelmointikielissä, on tiettyjä sanoja, joita ei saa käyttää koodissa esimerkiksi muuttujien niminä. Kehitysympäristöt kuten Visual Studio Code onneksi useimmiten varoittavat näistä, tai vähintään sanat piirtyy ruutuun eri värillä kuin muut sanat. Pythonin varatut avainsanat löytyvät keyword
-kirjastosta. Kirjasto on sisäänrakennetut, joten sitä ei tarvitse erikseen asentaa tai ladata.
import keyword
# Kutsutaan yllä luomaamme funktiota.
# Funktio tulostaa ruudulle listan tabulaariseen muotoon.
print_as_tabular(keyword.kwlist)
Ruudulle tulostuu:
False None True and as
assert async await break class
continue def del elif else
except finally for from global
if import in is lambda
nonlocal not or pass raise
return try while with yield
Listalla näkyvistä sanoista lähes jokainen tulee tämän kurssin aikana sinulle tutuksi.
Välteltävät avainsanat
Yllä listattujen ehdottomasti kiellettyjen sanojen lisäksi on sisäänrakennettuja funktioita, joiden jyrääminen omille funktioilla on hyvän tavan vastaista. Nämä löytyvät builtins
-kirjastosta. Tulostetaan niistä vain ne, jotka alkavat pienellä kirjaimella. Suurella kirjaimella alkavat ovat pääosin poikkeuksia (eng. exceptions). Näitä ovat muun muassa SyntaxError
, jonka Python nostaa aina kun koodi sisältää jotakin, mitä ei voi suorittaa, tai IndentationError
, jonka Python nostaa mikäli sinulla on epäkelpo määrä välilyöntejä koodissa. Alla on koodi, joka tulostaa vain pienellä kirjaimella alkavat:
import builtins
# Haetaan builtins:sta vain pienellä kirjaimella alkavat
low_case_builtins = [x for x in dir(builtins) if x[0].islower()]
# Hyödynnetään taas yllä luomaamme funktiota
# Onpa funktiot näppäriä, ei tarvi kirjoittaa koodia monesti!
print_as_tabular(low_case_builtins, per_row=4)
Ruudulle tulostuu:
abs aiter all anext any ascii
bin bool breakpoint bytearray bytes callable
chr classmethod compile complex copyright credits
delattr dict dir display divmod enumerate
eval exec execfile filter float format
frozenset get_ipython getattr globals hasattr hash
help hex id input int isinstance
issubclass iter len license list locals
map max memoryview min next object
oct open ord pow print property
range repr reversed round runfile set
setattr slice sorted staticmethod str sum
super tuple type vars zip
Case: Snake case
Monissa ohjelmointikielissä, kuten Javassa, käytetään niin sanottua camel casea, jossa muuttuja voi olla muotoa myVariableName
, luokat ovat yleensä kapitaaleilla alkavaa Pascal casea eli MyClassName
. Pythonissa on käytössä snake case. Noudata seuraavia PEP 8 -suosituksia.
Entiteetti | Esimerkki |
---|---|
Muuttuja (variable) | a , car , cars , my_variable |
Funktio (function) | is_boolean , get_item , calculate |
Luokka (class) | Car , CarList , Calculator , User |
Moduuli (module) | main.py , __init__.py , my_program.py |
Paketti (package) | helpers , utils , models . |
Suosi kuvaavia nimiä silloin kun mahdollista. Tämä auttaa pitämään koodisi luettavana ilman valtavaa määrää avustavaa dokumentaatiota. Mikäli jokin asia on lista, kuten cars
, niin pidä nimi monikossa. Tämä mahdollistaa helppolukuisen for car in cars
-lauseen kuten myös if 'Ferrari' in cars
-lauseen.
Pakettien nimiin voi sisällyttää hätätapauksessa myös alaviivan _
kuten my_package
, mutta ei koskaan väliviivaa. Ethän siis tee Python-moduuleja sisältävää kansiota, jonka nimi on my-package
. Projektikansio voi, kuten gitin parhaat käytännöt sanelevat, sisältää väliviivan. Alla vielä korostava esimerkki:
~/Code/gitname/project-x/ # Projektin pääkansio sisältää
~/Code/gitname/project-x/README.md # .git-kansion, README:n ja muuta
~/Code/gitname/project-x/.git/
~/Code/gitname/project-x/project_x/main.py # <= Pythonille OK
~/Code/gitname/project-x/project-x/main.py # <= EI
Aputiedostot, kuten ./data/my-awesome-image.png
saavat sisältää väliviivoja, mutta pidät väliviivat poissa kaikesta, mikä liittyy suoranaisesti Pythoniin. Väliviiva on matemaattinen miinusoperaatio.
PEP 8 -tyyliohje löytyy kokonaisuudessaan täältä: PEP 8 – Style Guide for Python Code. Osan tyylivirheistä voi korjata automaattisten työkalujen kuten black avulla. Näihin tutustutaan kurssin loppupuolella ajan sallimissa rajoissa.
Lopuksi on hyvä mainita vielä piilotetut tai salaiset muuttujat. Jos näet muuttujan muotoa _variable
tai _Foo__variable
, älä pakota sille mitään arvoa vaan anna sen olla. Lisäksi Pythonissa on tiettyjä erityisiä, "magic object or attributes"-ryhmään kuuluvia itemeitä, jotka tunnistaa kahdella alaviivalla alkavasta ja loppuvasta nimestä. Näitä ovat esimerkiksi __init.py__
-moduulin nimi, __str__
-funktio, __name__
-objekti ja niin edelleen. Älä keksi vastaavia itse lisää vaan käytä niitä kuten dokumentaatio neuvoo.
Muuttujien nimet
Muuttujien nimistä on hyvä käydä vielä pari lisäkäytäntöä sekä sääntöä. Pidättäydy ASCII-merkistössä eli mieluiten kirjaimissa a-z. Jätä suuret kirjaimet luokkien ja pysyvien muuttujien käyttöön. Python sallii tiettyjä erityismerkkejä muuttujan nimeksi. Älä käytä niitä. Alla esimerkki:
Yllä olevan hyvän käytännön lisäksi on myös sääntöjä, joita on pakko noudattaa, tai muuten Python nostaa SyntaxError
:n tai muun. Näitä sääntöjä ovat:
- Muuttujan nimi ei saa alkaa numerolla.
- Muuttuja ei saa sisältää välilyöntejä
- Muuttuja ei saa sisältää valtaosaa erikoismerkeistä
Alla esimerkkejä, jotka eivät kertakaikkiaan käy: