(toiminnot)

hwechtla-tl: Python

Kierre.png

Mikä on WikiWiki?
nettipäiväkirja
koko wiki (etsi)
viime muutokset


Ohjelmointikieli, joka ei ole käsittämättömän nerokas, mutta jotenkin onnistuu tasapainottamaan erilaiset vaikutteet. Varsin kaunis ja yksinkertainenkin kieli, ja suunniteltu johdonmukaisesti.

http://www.python.org/

Pythonissa on paljon vaikutteita niin oliopohjaisista kuin funktionaalisista kielistä. Joissain asioissa se rikkoo molempien perinteitä, esim. oliot voivat tarjota iteraattorirajapinnan mutta silti sitä on tarkoitus käyttää kielen yleisten iteraatiorakenteiden kautta.

Pythonin kanssa tulee usein sellainen tunne, että yksi sun toinen asia olisi voitu tehdä paremmin, mutta Pythonissa on myös paljon sellaisia piirteitä, joita kehittyneemmissä kielissä jää kaipaamaan (kuten laajat ja hyvin suunnitellut kirjastot). Melkein projektissa kuin projektissa Python on kieli, jonka kanssa ei joudu vaikeuksiin.

Pythonin Unicode-tuki aiheutti minulle paljon turhautumista.

Näyttely: ohjelmointikielten kuvat sisältää yhden piirroksen aiheesta: teos: Python.

kategoria: työkalut


mw: Sääli, että pythonista on katoamassa paljon kivaa uuden 3000 -hömpän myötä. :<

Tarkoitan siis niitä muutoksia, joista puhutaan esim. http://www.artima.com/weblogs/viewpost.jsp?thread=98196 <- tuolla.

atehwa: hmm, Pythonissa on ollut taipumus käyttää usein erityisiä ratkaisuja yleisten sijaan. Lambdat olisivat, nätillä syntaksilla ja hyvin tuettuna, vastaus moneen asiaan, jotka nyt tehdään toisin. Lambdojen tarvetta vähentävät monet asiat... list comprehensions korvaavat filterille ja mapille annettavat lambdat, iteraattoriprotokolla korvaa iteraatiorakenteiden toteuttamisen lambdoja ottavina metodeina (Smalltalkin tapaan), with-protokolla korvaa palveluiden wrappayksen lambdoilla, yield korvaa lambdoilla toteutetut korutiinit.

Idis on kai se, että esimerkiksi jokaisessa läpikäynnissä lukisi "for", jotta se olisi tunnistettavissa läpikäynniksi. Sivutuotteena häiritään sellaisia tapoja kirjoittaa koodia, joita ei ole erikseen otettu huomioon kieltä suunniteltaessa. Antipatia reduce()a vastaan on hyvä esimerkki: reduce()lla pystyy kirjoittamaan minkä tahansa listarekursion, joten se on "liian yleinen".

mw: Juu, Pythonista usein väitetään että se olisi kieli jossa on yksi oikea tapa tehdä asioita. Olen vaan itse löytänyt juuri näiden "liian yleisten" keinojen voimakkuuden, ja ihastunut niihin. En ole käyttänyt esim list comprehensioneja vaihoehtoina map()ille/filter()ille, vaan olen yhdistellyt niitä. (En tiedä onko tämä sitten luettavuudeltaan huono ratkaisu...)

atehwa: Mua ylipäänsä ärsyttää, kun selkeysfasistit huutaa: "Eihän tuollaisesta koodinkirjoittamistavasta saa mitään selvää!" Itse käytän foldia (siis sama kuin reduce) ehkä liikaakin, mutta minusta on liiallista väittää, että se on vaikeampi ymmärtää kuin akkumuloiva silmukka.(*) Ja aina, kun tätä argumentointitapaa käytetään, mietin, kuinka tyhmät tai kokemattomat ohjelmoijat pitää ottaa huomioon, ja miten ihmeessä nämä ihmiset ovat niin varmoja siitä, että selkeä koodinkirjoitustapa on juuri se, mihin he ovat tottuneet.

(*) Nämä kaksihan tarkoittavat aina samaa:

x = init
for el in seq:
        x = ...
ja
x = reduce(lambda x, el: ..., seq, init)

Asiaan lähes liittymättä, kaikenlaisille muillekin rekursiivisille tietorakenteille on "perusiteraattori", korkeamman asteen funktio, jolla voi tehdä jokaisen rakenteellisen rekursion, joka kyseiselle tietorakenteelle on kuviteltavissa. Minusta näiden rekursioiden eristäminen omaan funktioonsa on hyvä ajatus. Ilmeisesti Python-ohjelmoijat eivät yleensä käsittele esimerkiksi puita, jos kerran reducen kaltaiset iteraattorit eivät kiinnosta.

mw: Jänniä ajatuksia. Olen itsekin vasta alkanut oikeasti hahmottaa monia asioita (myös ohjelmia) puurakenteina, niin lingvisti kuin väitän olevani. Mutta, oikeastaan täysin tähän liittymättä, olen koittanut selvittää Pythonistien kantaa sisennyksiin, mutten löytänyt oikein muuta kuin kinastelua ja valitusta puoleen ja toiseen. Osaatko sanoa pidetäänkö Python-yhteisössä esim seuraavanlaista sisennystä rumana?

x=[(lambda a,b: ...)(a,b)
    for a in seq
    for b in seq
    if cond]

atehwa: Hih, sulkeiden sisäisiin implisiittisesti jatkuviin riveihin ei taida olla mitään sääntöjä. Kai ne on selkeintä sisentää saman verran kuin kaikki muukin (eli jos sis.väli on 4 merkkiä, niin suljejatkekin sisennetään 4 merkkiä). Toinen mahdollisuus on sisentää LISP-tyyliin sisennyksen avanneeseen sulkeeseen eli yhtä merkkiä vasemmammalle yllä olevassa esimerkissä.

Infix-operaattorit muuten tekevät kauniin rivittämisen lähes mahdottomaksi. Epäilen vieläkin, että LISPin tärkein avu on se, että sen kaunis rivittäminen ja sisentäminen on poikkeuksetta yksinkertaista.


kommentoi (viimeksi muutettu 11.06.2014 09:42)