Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python-opassarjan osio 1

Sivun loppuun

Antti Laaksonen [28.10.2009 21:02:21]

#

Kesällä aloittamani Python-opassarjan kirjoitus on edennyt melko mukavasti. Opassarjan ensimmäinen osio, joka käsittelee ohjelmoinnin perusasioita Python-kielellä, on nyt valmis julkisesti arvioitavaksi ennen julkaisua.

Osa 1 - Ensimmäinen ohjelma
Osa 2 - Tiedon käsittely
Osa 3 - Ehtorakenteet
Osa 4 - Toistorakenteet
Osa 5 - Listojen käsittely
Osa 6 - Merkkijonot
Osa 7 - Omat funktiot
Osa 8 - Tiedostot ja virheet
Osa 9 - Standardikirjasto
Osa 10 - Tietorakenteet
Osa 11 - Alkeita edemmäs
Osa 12 - Yhteenveto

Opassarjan kohderyhmä ovat nuoret henkilöt, jotka eivät ole aiemmin ohjelmoineet. Tarkoituksena on ennen kaikkea opettaa ohjelmoinnin yleisiä periaatteita, minkä vuoksi Python-kielen jotkin yksityiskohdat jäävät vähälle.

Toivon kaikilta asiasta kiinnostuneilta kriittistä palautetta, jotta tästä tulisi mahdollisimman hyvä opassarja.

Esimerkiksi:
* Mitä tärkeitä asioita oppaista vielä puuttuu?
* Mitkä asiat on selitetty epäselvästi?
* Missä kohdissa pitäisi olla kuvia?
* Voisiko jonkin esimerkin korvata paremmalla?

Olen kiitollinen kaikesta palautteesta suurista ja pienistä asioista.

trilog [28.10.2009 21:38:50]

#

Erinomainen opassarjan aloitus! Pikaisesti vilkaistuna tuli mieleen, että virheenkäsittelyn voisi tehdä enemmän ns. Pythonmaisesti ja ottaa mukaan myös else- ja finally-lohkot, esim.:

lainaus:

Seuraava ohjelma varautuu virhetilanteeseen:

# -*- coding: latin-1 -*-
try:
    tiedosto = open("uolevi.txt", "r")
    print tiedosto.readline()
    tiedosto.close()
except IOError:
    print "Tiedostovirhe!"

=>

# -*- coding: latin-1 -*-
try:
    tiedosto = open("uolevi.txt", "r")
except IOError:
    print "Tiedostovirhe!"
else:
    # tänne mennään, jos virhettä ei tullut
    print tiedosto.readline()
finally:
    # tämä suoritetaan aina (nk. siivous)
    tiedosto.close()

os [29.10.2009 11:07:55]

#

Hyvältä oppaalta vaikuttaa. Tässä pikaisesti katsottuna pari minusta epäselvästi ilmaistua juttua.

https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=python_02:

Funktion tehtävänä on muuttaa sille annettu tieto uuteen muotoon. Tässä tapauksessa funktio len ottaa vastaan minkä tahansa merkkijonon ja palauttaa sen merkkien määrän.

(kuva)

Vastaavasti funktio raw_input ottaa vastaan merkkijonon, näyttää sen käyttäjälle ja palauttaa sitten käyttäjän kirjoittaman merkkijonon.

Minusta tuo kursivoimani sanallinen kuvaus, joka viittaa lähinnä sivuvaikutuksettomaan funktioon, on hämäävä, koska Pythonin funktiot, kuten tuo välittömästi seuraava raw_input eivät välttämättä sovi tähän muottiin.

https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=python_03:

Totuusarvo on joko tosi (True) tai epätosi (False): jokin asia pitää paikkansa tai ei pidä paikkaansa. Esimerkiksi "pistemäärä on yli 1000" ja "pelaajan nimi ei ole Einari" ovat totuusarvoja, jotka voivat olla ohjelman yhdellä suorituskerralla tosia ja toisella suorituskerralla epätosia.

Kyseisillä lauseilla toki on tietyisä tilanteissa tietty totuusarvo, mutta lauseen kutsuminen totuusarvoksi (ehkä teknisessä hengessä: r-value tyyppiä boolean) ei välttämättä selkeytä selitettävää asiaa.

Antti Laaksonen [29.10.2009 19:34:32]

#

trilog kirjoitti:

Pikaisesti vilkaistuna tuli mieleen, että virheenkäsittelyn voisi tehdä enemmän

Harkitsen vielä, pitäisikö virheenkäsittelystä kertoa enemmän.

os kirjoitti:

Minusta tuo kursivoimani sanallinen kuvaus, joka viittaa lähinnä sivuvaikutuksettomaan funktioon, on hämäävä

os kirjoitti:

lauseen kutsuminen totuusarvoksi - - ei välttämättä selkeytä selitettävää asiaa

Olet oikeassa, muutan nämä kohdat paremmiksi.

Macro [01.11.2009 12:38:06]

#

Minusta tämä on hieno opas. Toivottavasti tästä on hyötyä monelle, valitettavasti tätä ei ollut silloin, kun itse opettelin nämä asiat. =)

Antti Laaksonen [27.12.2009 13:29:06]

#

Oppaiden julkaisu on lähellä, mutta vielä ehtii lähettää palautetta!

Contraband [28.12.2009 15:45:05]

#

Osassa "Alkeita edemmäs" annetaan seuraava esimerkki:

def kaanna2(mjono):
    merkit = list(mjono)
    merkit.reverse()
    return "".join(merkit)

Mielestäni esimerkki on jotenkin ei-pythonmainen - tyylikkäämpää olisi käyttää tässä Pythonin käänteisiteraattoria, jottei tarvitse erikseen muuntaa merkkijonosta listaksi.

def kaanna2(mjono):
    return "".join(reversed(mjono))

Tosin tämäkään ei pärjää nopeudessa tai tiiviydessään viimeiselle esimerkille (kaanna4).

Vastaavasti anagrammi-esimerkissäkin (https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=python_10#sanakirja) voi funktion jarjesta kirjoittaa yksinkertaisesti muotoon:

def jarjesta(sana):
    return "".join(sorted(sana))

Antti Laaksonen [28.12.2009 19:43:14]

#

Harkitsin noita funktioita monta kertaa, mutta päädyin kuitenkin pidempään toteutukseen, koska se on mielestäni selkeämpi. Lisäksi funktiossa kaanna2 on ajatus ongelman palauttamisesta toiseen ongelmaan, johon tunnetaan ratkaisu.

Klvi [06.01.2010 21:09:19]

#

Onko vastauksia oppaassa olleisiin tehtäviin? Olen kiristellyt hampaitani 'Osa 6' - sivun 10. tehtävässä enkä saa millään aikaiseksi ohjelmaa joka toimisi eripituisien sanojen kanssa. :I

Ehkä pienet vihjeet voisivat olla paikallaan noihin tehtäviin, sekä mahdollisuus tarkistaa vastaukset jostakin. Myös sellainen voisi toimia hyvin että harjoitustehtäviä ripoteltaisiin siten että jokaisen uuden asian esittelyn jälkeen olisi muutama herjoitustehtävä. Näin pääsisi heti kokeilemaan ja omaksumaan esitellyn asian ilman että vastaluettu uusi asia jäisi muistinvaraiseksi.

Muutoin opas on ollut mainio, sopivan asiapitoista tekstiä jota on helppo ymmärtää sillä oppaassa on selitetty asioita 'maallikkotermein' ilman hienoja vierassanoja. Kiitokseni oppaan kirjoittajalle, olen innokkaasti niitä lukien ottanut ensiaskeleitani Pythoniin ja ohjelmoinnin maailmaan. :)

e: Lisätty sisältöä.

Metabolix [06.01.2010 22:22:52]

#

Minusta taas monet noista tehtävistä ovat luonteeltaan niin yksinkertaisia, että vastaus on välttämättä keksittävä itse: vaikka valmiin ratkaisun helposti ymmärtäisi, siitä ei kuitenkaan ehkä oppisi, miten tulokseen on päästy. Juuri tuo kuviotehtävä (osa 6, tehtävä 10) on tällainen. (Ratkaisu ei muuten vaadi silmukkaa ihmeempiä ohjelmointitaitoja, vaan kaikki selviää matemaattisesti etäisyyksiä laskemalla. Aloita siitä, että tulostat neliön, ja lisää sitten neliöön keskipiste eri merkillä.)

Klvi [06.01.2010 23:00:53]

#

Oops, tarkoitin siis tehtävää 9 enkä tehtävää 10. Eli tehtävä jossa pitää etsiä kahdesta sanasta pisin yhteinen osa.

Samoin itse myös ajattelin että parhaiten oppii kun etsii ratkaisut/kokeilee itse, mutta jostain syystä en vain löydä ratkaisua tuohon tehtävään, muut olivat ihan kohtuullisen helposti ratkaistavissa.

Metabolix [06.01.2010 23:07:08]

#

Yksinkertainen (mutta hidas!) ratkaisu on etsiä yhden sanan kaikkia erilaisia osia toisesta.

for (mahdolliset alkukohdat):
  for (mahdolliset loppukohdat):
    onko tämä pätkä toisessa sanassa?

Kun tuon saa toimimaan, voi miettiä tehokkaampia ratkaisuja.

Klvi [06.01.2010 23:42:10]

#

Kiitos, tuosta sain kaipaamani vinkin ja lopulta ahaa-elämyksen. :) Yritin aiemmin jokseenkin aivan liian monimutkaista lähestymistapaa tuohon tehtävään.

Antti Laaksonen [07.01.2010 12:41:07]

#

Kieltämättä olisi hyvä, jos saatavilla olisivat tehtävien ratkaisut. Niistä voisi oppia hyödyllisiä asioita, vaikka tehtävän olisi onnistunut ratkaisemaan itsekin. Tehtävien lisääminen pienissä erissä kaikkiin oppaisiin on myös harkinnan arvoinen ehdotus.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta