Python?

Tkinter opettelun alla. Miten saan entry:stä tietueen integeriksi? Nyt antaa vain erroria kun koitan. Muuten koodi kyllä toimii, koska input:lla toimii kyllä jos syöttää arvon ohjelman käynnistyessä. Haluaisin kuitenkin syöttää arvon kenttään.

Onko entry tuohon tarkoitukseen edes paras vaihtoehto?
 
Tkinter opettelun alla. Miten saan entry:stä tietueen integeriksi? Nyt antaa vain erroria kun koitan. Muuten koodi kyllä toimii, koska input:lla toimii kyllä jos syöttää arvon ohjelman käynnistyessä. Haluaisin kuitenkin syöttää arvon kenttään.

Onko entry tuohon tarkoitukseen edes paras vaihtoehto?
Saat siitä getillä tekstiä (string) joka pitää muuttaa intiksi
 
Itse innostuin pythonista vähän aikaa sitten. Itsellä ei ole aikasempaa kokemusta koodamisesta ja suositusten mitä sain tämä oli helpoin kieli lähteä tähän ihmeelliseen mailmaan.

Oli hienoa nähdä se vaikka alkuun se vaikutti heprealta nyt tajuaa sentään jotain

Varmasti mielipidejuttuja, mutta omasta mielestä Python on ihan parhaimmillaan esim. Raspberry PI:lla muutaman lisäpalikan / anturin kanssa. En ole koskaan Pythonista itse niin paljoa perustanut, mutta tuossa kontekstissa sen käyttö oli mielestäni varsin soveltuvaa. Tietysti pätee jos on mikä tahansa projekti tms johon on omaa kiinnostusta tarpeeksi. :)
 
GUI-puoli vahvistuu vahvasti, vastikään julkaistiin uudistunut wxPython 4 ja kohta on tulossa virallista Qt:ta Pythonille.

Welcome to wxPython!
Hello Qt for Python - Qt Blog

Aika helpostihan nykyään saa asiallisen GUIn pystyyn.

Aloittelijoille sellainen vinkki että opetelkaa käyttämään virtualenvejä vaikka se tuntuisi aluksi vähän turhalta. Hyödyt on ne että voitte käyttää projekteissa helposti mitä tahansa Python-versiota (riippumatta esim. distron omasta Pythonista jos käytätte Linuxia), ja kaikki pip:llä asennetut paketit pysyy virtualenvin sisällä eikä "kasaudu" käyttöjärjestelmän asennukseen. Koska virtualenv on vain hakemisto voi sen poistaa helposti.
 
...
Aloittelijoille sellainen vinkki että opetelkaa käyttämään virtualenvejä vaikka se tuntuisi aluksi vähän turhalta. Hyödyt on ne että voitte käyttää projekteissa helposti mitä tahansa Python-versiota (riippumatta esim. distron omasta Pythonista jos käytätte Linuxia), ja kaikki pip:llä asennetut paketit pysyy virtualenvin sisällä eikä "kasaudu" käyttöjärjestelmän asennukseen. Koska virtualenv on vain hakemisto voi sen poistaa helposti.

Tämä aivan ehdottomasti. Se vaiva kannattaa nähdä että opettelee virtualenvin käyttämisen. Välttyy paljolta sähläämiseltä ja versioiden epäyhteensopivuuksilta eri projektien välillä.
 
Nykyään virallinen suositeltu tapa taitaa olla käyttää Pipenviä jolla sekä luodaan virtualenvit ja asennetaan paketit. Ainut mikä tuossa meikäläistä rassaa on se että virtualenvit luodaan jonnekin "piiloon", muuten hyvä.
 
Itse innostuin pythonista vähän aikaa sitten. Itsellä ei ole aikasempaa kokemusta koodamisesta ja suositusten mitä sain tämä oli helpoin kieli lähteä tähän ihmeelliseen mailmaan.

Oli hienoa nähdä se vaikka alkuun se vaikutti heprealta nyt tajuaa sentään jotain
Minäkin olen nyt pari kuukautta vääntänyt Pythonia ilman aiempaa taustaa. Valitsin tämän kieleksi, koska netissä luki, että syntaksi on todella selkeää ja olen kyllä samaa mieltä.

Tähän mennessä on tullut vaan seurattua hissukseen Udemystä yhtä kurssia ja Codewarsissa olen tehnyt 8 kyu ja 7 kuy katoja. Yhden 6 kyunkin olen tehnyt, mutta yleensä ne tuntuu vielä liian vaikeilta.

Kipinä ohjelmointiin syntyi, kun töissä pari askaretta alkoi vituttamaan ja mietin olisiko niitä helppo automatisoida. Nyt on työn alla sellainen softa, joka hakee työntekijöiden työaikaleimaustiedot ihmisille aivan jäätävän vaikeaselkoisesta tekstitiedostosta ja järjestelee sen uudestaan. Nyt lukuominaisuus on valmis ja saan ohjelmasta ulos selkeän csv:n. Mutta ohjelma ei tietenkään ole vielä valmis. Tarkoitus on syöttää tiedot sqlite-tietokantaan ja tehdä sille joku graafinen käyttöliittymä. :)
 
Minäkin olen nyt pari kuukautta vääntänyt Pythonia ilman aiempaa taustaa. Valitsin tämän kieleksi, koska netissä luki, että syntaksi on todella selkeää ja olen kyllä samaa mieltä.

Tähän mennessä on tullut vaan seurattua hissukseen Udemystä yhtä kurssia ja Codewarsissa olen tehnyt 8 kyu ja 7 kuy katoja. Yhden 6 kyunkin olen tehnyt, mutta yleensä ne tuntuu vielä liian vaikeilta.

Kipinä ohjelmointiin syntyi, kun töissä pari askaretta alkoi vituttamaan ja mietin olisiko niitä helppo automatisoida. Nyt on työn alla sellainen softa, joka hakee työntekijöiden työaikaleimaustiedot ihmisille aivan jäätävän vaikeaselkoisesta tekstitiedostosta ja järjestelee sen uudestaan. Nyt lukuominaisuus on valmis ja saan ohjelmasta ulos selkeän csv:n. Mutta ohjelma ei tietenkään ole vielä valmis. Tarkoitus on syöttää tiedot sqlite-tietokantaan ja tehdä sille joku graafinen käyttöliittymä. :)

Mitäs kurssia siellä seuraat? Itsellä kanssa projektina, ja kurssina toimii The Modern Python 3 Bootcamp (https://www.udemy.com/the-modern-python3-bootcamp), olen kyllä tykännyt kovastikin. Ohjelmointitaustaa on jonkin verran, joten 1.5x nopeudella mennään eteenpäin toistaiseksi, varmaan tulee laskettua kunhan perusteet on käyty läpi.
 
Viimeksi muokattu:
Lisätään tänne että nyt kun kaikki deep learning jutut kasvaa niin Pythonin osaajista aletaan maksamaan jo aika hyvin. Jo etua on se, jos osaa edes perusteet ja pystyy soveltamaan sitä omaan alaansa. Esim. kaikkien pienten usein tehtävien toimintojen automatisointi on yksi hyvä sovelluskohde. En voi vieläkään käsittää miten monet >Mrd kokoluokan yritykset tekee ihan alkeellista manuaalihommaa esim. exceleiden kanssa... ainoa hidaste on vanhojen jäärien ymmärryksen puute yritysten johdossa.
 
Ei taida ihan vielä olla perusteilla tehtävissä nuo deep learning jutut? Esimerkkikoodin kyllä kirjoittaa mutta jonkun verran pitää lukea discriminaattoreista yms. GAN-aivojumppaa.
 
Ei taida ihan vielä olla perusteilla tehtävissä nuo deep learning jutut? Esimerkkikoodin kyllä kirjoittaa mutta jonkun verran pitää lukea discriminaattoreista yms. GAN-aivojumppaa.

Niin tuossa tarkoitin että jo etua on perusteista kun CV:itä löydään riviin. En tällä viitannut deep learning puoleen josta maksetaankin sitten hunajaa jo.
 
Olen etsinyt parempaa lähdettä pythoniin kuin googlettaminen. Tarvetta olisi ainakin datankäsittelyyn (numpy, pandas, matplotlib), säikeistys, json. udemyssä olisi taas kurssit 10e/kpl, olisiko esim joku seuraavista hyvä?
https://www.udemy.com/python-for-data-science-and-machine-learning-bootcamp/
https://www.udemy.com/learning-python-for-data-analysis-and-visualization/

Toisaalta lähdeteostyyppinen voisi olla käytännöllisempi. Humblella on python-ekirjoja, onko kellään noista kokemusta? Tai olisiko joku muu ehdotus? Hakuteoksena tietysti painettu kirja voisi olla parempi.
Humble Book Bundle: Python 2019 by Packt (pay what you want and help charity)
 
Miten hyviä lienee nuo Packtin julkaisemat kirjat? Muutamista aika tyrmääviäkin kommentteja, useista arvostelu tyyliin "oli tosi hyvä". Todella harvasta on vaivauduttu kirjoittamaan mitään konkreettista positiivista arvostelua.

Yllämainitussa paketissa näyttää että hyvät pohjatiedot saa vasta tuolla $15 maksulla, en nyt sano että sekään mikään hirveä hinta kirjasta. Lähinnä kiinnostusta siirtyä Python 2.x scriptailusta Python 3.x scriptailuun.
 
Pakko todeta että Packtin kirjoista en ole valmis maksamaan yhtään mitään. Ainakin kolme python-kirjaa noilta ja pelkkää kuraa.
 
Jotain Packtin kirjoja olen ostanut, kun oli Humble Bundlessa. Ei ollut suurin osa Pythonista (eli en ole lukenut niitä Python kirjoja, jotka tuli pakosti kaupan päälle), mutta laatu on ehkä @Gotler kuvaamalla tasolla.

Suosittelen ostamaan udemy:stä jonkun Python-videokurssin. Niitäkään en ole käynyt, mutta ne pari muuta kurssia - jotka olen käynyt - on olleet oikein hyviä ja kattavia.

edit: Siellähän on uusi bundle, nyt kuin luin vähän muidenkin viestejä. Kyllä tuosta saa vastinetta rahoilleen, mutta laatu ei ole sieltä parhaasta päästä. Tekisi mieli kyllä ostaa alati kasvavaan kirjastoon "kirjoja, joita en koskaan lue, mutta olin aikonut" tuon $1 tier. Koska halvalla saa.
 
Viimeksi muokattu:
Kaikenlaisia Python kirjoja on tullut pikaisesti selailtua niin todella kuivia teoksia. Pythonilla taitaa helpoiten tehdä potaattilaskurin, että se on siinä hyvä pointti. Siis noista kirjoista, että ei mitään huikeita loitsusarjoja ole näkynyt. Potaattilaskuria kummempaan ei taivu ja loput onkin jotain diippadaappaa ilman loitsuja niin kuin deep learning kirjatkin. Alkeet vaan ja eipä ole vaivautunut kirjoissa selittämään, että miksi on python 2 ja 3. Ainakin vitutuksen takia näin, että kakkonen ei toimi kolmosessa.
Monesti Python kirjassa on jotain muuta scheipeä jo otsakkeessa niin takuulla huono kirja. Katsellaan niin kapeasta putkesta koko juttua niin morjens.
Jotenkin sellainen tuntuma, että näitä kirjoja on väkisin väännetty jollain apurahalla. Plagioitu maksimit muista kirjoista ja ehkä sen takia on tarjolla mysteeriohjelmilla pythonia niin erottuu ainakin sen mysteeriohjelman osalta.

Ei näillä ihan äkkiä mitään unreal engineä ja raudan polvistamista tehdä. Githubista ei alkeita kummempaa ole näkynyt. Udemyn tuntitolkuttomat videot on aika nukuttavia. Höpöttää liikaa ja ei sieltä maksimissaan potaattilaskuria kummempaa ole tulossa. Tuubissa on sitten löytynyt nopeampi tempoista settiä 20 minuuttiin niin kyllähän pauselle oli käyttöä. Ohi mennen pukkas siihen vielä tota ihme enviä uutuutena niin ei ole avautunut vieläkään. Siis jossain vapaassa pilvimaailmassa ajellaan settiä? Eikö tämä docker ole jotain vastaavaa?


Micropythonilla huikein suoritus vaikutti olleen ohjelmoitavat ledit(ws2812b), mutta kiinnostus hiipui, kun micropythonin OTA firmwaret ei oikeasti toiminut. Veikkaan, että tuo on ollut huikea märkäuni kickstartissa, kun rahaa tuli ikkunoista ja ovista niin lupailtiin kaikenlaista.


Tuubissa ei oikein löydy kummempaa tai eräs on ympännyt nimimerkkiinsä pythoniin liittyvää niin alussa näytti olleen jotain alkeita pythonista. Sitten aloittikin clickbait vouhotuksia, että juuri katsojasta tulee se python-osaaja tienaten maksimit. Sai varmaankin katselijoita helpommin pelkällä läpätyksellä kuin loitsujen takomisella.

Paitsi, että kun sitten näkee näitä tuubin ohjelmoinnin helmiä niin ovat suunnilleen sata osaisia niin morjens.
 
Fakta on se, ettei sitä ohjelmointia (Pythonilla tai millään muullakaan) opi kuin koodaamalla. Ja kun sanon että koodaamalla, niin tarkoitan tuhansia tunteja* koodaamista, en sitä että parina viikonloppuna kopioi Youtubesta parista videosta lähdekoodit IDE:en ja klikkaa runia. Noita tuhansia koodaustunteja vasten voi sitten peilata sitä, että paljonko asiaa voi ahtaa yhteen kirjaan tai videoon. Ja senpä takia ne aika usein ovatkin joko hyvin paljon alkeisiin keskittyviä tai menevät syvemmälle jollain hyvinkin kapealla osa-alueella.

*) Jos on ennestään jo ammattikoodari, niin uuden kielen lisääminen omaan työkalupakkiin saattaa onnistua sadoilla tunneilla, mutta silloinkaan tuskin tulee selkärangasta vielä kaikki kielen hienoudet.
 
Jos täällä on Python taitaja/taitajia niin osaatteko sanoa miksi SBC-koneiden käyttiksissä esim. Raspberry Pi:ssä tulee Python 2 ja 3. Harvemmin muissa ohjelmointikielissä on kahta versiota. Tietysti jotain vanhoja on toki jaossa edelleen, mutta uusimmalla mennään eteenpäin.

Kannattaako nyyppien katsella jotain tiettyjä Python moduuleja ja googlailla niitä tarkemmin?

Löytyykö Pythonille joku pätevä foorumi ja yhteisö täältä netin syövereistä?


Tuohon ylempään postaukseen: Voi kun se copypastausohjelmointi olisi juurikin noin suoraviivaista ja helppoa. Lähdekooditkin happamoituu. Paskaa koodiahan ne on, kun eivät toimi uudemmissa kääntäjissä. Niin Pythonissa ei ole kääntäjää vaan on jonkinlainen non stop versio sellaisesta.
 
Jos täällä on Python taitaja/taitajia niin osaatteko sanoa miksi SBC-koneiden käyttiksissä esim. Raspberry Pi:ssä tulee Python 2 ja 3. Harvemmin muissa ohjelmointikielissä on kahta versiota. Tietysti jotain vanhoja on toki jaossa edelleen, mutta uusimmalla mennään eteenpäin.

Kannattaako nyyppien katsella jotain tiettyjä Python moduuleja ja googlailla niitä tarkemmin?

Python 2 ja 3 eivät ole kaikilta osiltaan yhteensopivia. Ja siitä valtavasta pakettikirjastosta mitä pythonille on saatavilla, isoa osaa ei ole päivitetty toimimaan kolmosella. Siksipä pythonista on suhteellisen normaaliakin olla asennettuna molemmat versiot.

Suosituimmat paketit toki on saaneet nuo päivitykset jo ikiaikoja sitten. Oma suositukseni on, että käytä sitä Python 3:a jos et erikseen tiedä että tarvitset kakkosta jonkin tietyn paketin takia.

Ja ei ne lähdekoodit happamoidu, mutta tutoriaalissa on silloin vikaa jos siinä ei kerrota millä Pythonin (ja mahdollisten lisäpakettien) versiolla niitä ajetaan. Jos se on tiedossa, voi iskeä samat versiot sisään ja homma toimii hienosti.

EDIT: Mainittakoon vielä että Python 2.7:n tukiaika päättyy tämän vuoden lopussa, eli sen jälkeen sille ei tule enää bugikorjauksia tai muitakaan päivityksiä. Henkilökohtaisesti toivon että tuo alkaisi olla viimeisiä nauloja Python 2:n arkkuun, jotta pikkuhiljaa ne viimeisetkin tahot siirtyisi kolmoseen.
 
Viimeksi muokattu:
Jos täällä on Python taitaja/taitajia niin osaatteko sanoa miksi SBC-koneiden käyttiksissä esim. Raspberry Pi:ssä tulee Python 2 ja 3. Harvemmin muissa ohjelmointikielissä on kahta versiota. Tietysti jotain vanhoja on toki jaossa edelleen, mutta uusimmalla mennään eteenpäin.

Kannattaako nyyppien katsella jotain tiettyjä Python moduuleja ja googlailla niitä tarkemmin?

En nyt tiedä että olenko mikään taitaja ja varsinkaan tunne Rasberryä, mutta Pythonista on usein tarjolla molemmat versiot johtuen siitä että 2:lla kirjoitettu koodi ei usein suoraan toimi 3:ssa ja toisinpäin johtuen versioden välisistä eroista. Jos alusta lähtee koodaamaan niin, kannattaa ehkä aloittaa suoraan Python 3:lla. Mutta kannattaa tarkistaa että tarvittavat moduulit löytyy jo sille.
 
En nyt tiedä että olenko mikään taitaja ja varsinkaan tunne Rasberryä, mutta Pythonista on usein tarjolla molemmat versiot johtuen siitä että 2:lla kirjoitettu koodi ei usein suoraan toimi 3:ssa ja toisinpäin johtuen versioden välisistä eroista. Jos alusta lähtee koodaamaan niin, kannattaa ehkä aloittaa suoraan Python 3:lla. Mutta kannattaa tarkistaa että tarvittavat moduulit löytyy jo sille.
Suurin osa valmiista esimerkeistä tuntuu olevan edelleen kakkoselle. Samaten olen ollut huomaavinani, että kakkosversion dokumentaatio olisi hieman selkeämpi ja kattavampi. Jos nämä eivät haittaa, niin aikaa paremmin kestävä tuotos syntynee kolmosella. Tarve käytetyille kirjastoille/moduuleille ratkaisee kuitenkin aika paljon.

Mm. täällä on listattu versioiden eroavaisuuksia selkeämmin:
Python 2 vs Python 3: Which Should I Learn?
 
En nyt tiedä että olenko mikään taitaja ja varsinkaan tunne Rasberryä, mutta Pythonista on usein tarjolla molemmat versiot johtuen siitä että 2:lla kirjoitettu koodi ei usein suoraan toimi 3:ssa ja toisinpäin johtuen versioden välisistä eroista. Jos alusta lähtee koodaamaan niin, kannattaa ehkä aloittaa suoraan Python 3:lla. Mutta kannattaa tarkistaa että tarvittavat moduulit löytyy jo sille.

Juurikin näin olen sen eron kuullut näiden kahden välillä. Molempia päivitetään jatkuvasti eli kakkonen ei ole näivettymässä poiskaan.

Python 2 julkaistiin vuonna 2000 ja python 3 vuonna 2008. Python 3:ssa huikeampia ominaisuuksia joita kuitenkin lisätty Python 2:seenkin. Äkkiseltään ei tule mieleen, että kun Python 2 ollut 8 vuotta pidempään olemassa niin siinä tietysti enemmän sitä jotain..

Äkkiseltään Python 2:ssa tämä parempi --> print "hello" ja Python 2:ssa sama print ("hello") siis enemmän koodia hyi.
Laskimena Python 3 ylivoimaisesti parempi laskimena 5/2=2.5 ja Python 2:ssa 5/2=2
 
Viimeksi muokattu:
Juurikin näin olen sen eron kuullut näiden kahden välillä. Molempia päivitetään jatkuvasti eli kakkonen ei ole näivettymässä poiskaan.

Python 2 julkaistiin vuonna 2000 ja python 3 vuonna 2008. Python 3:ssa huikeampia ominaisuuksia joita kuitenkin lisätty Python 2:seenkin. Äkkiseltään ei tule mieleen, että kun Python 2 ollut 8 vuotta pidempään olemassa niin siinä tietysti enemmän sitä jotain..

Kakkosen (tarkemmin 2.7) tukiaika nimenomaan loppuu tämän vuoden lopussa. (1) Aiemmilta kakkosen versioilta se on jo loppunut eikä uudempia tule (2). Eli sen suhteen ollaan jo hyvinkin siinä tilanteessa että se alkaa näivettyä pois. Sen takia sitä ei erikseen kannata alkaa enää opetella, jos on nyt Pythoniin tutustumassa.

1) https://www.python.org/dev/peps/pep-0373
2) https://www.python.org/dev/peps/pep-0404
 
Viimeksi muokattu:
Juurikin näin olen sen eron kuullut näiden kahden välillä. Molempia päivitetään jatkuvasti eli kakkonen ei ole näivettymässä poiskaan.

Python 2 julkaistiin vuonna 2000 ja python 3 vuonna 2008. Python 3:ssa huikeampia ominaisuuksia joita kuitenkin lisätty Python 2:seenkin. Äkkiseltään ei tule mieleen, että kun Python 2 ollut 8 vuotta pidempään olemassa niin siinä tietysti enemmän sitä jotain..

Äkkiseltään Python 2:ssa tämä parempi --> print "hello" ja Python 2:ssa sama print ("hello") siis enemmän koodia hyi.
Laskimena Python 3 ylivoimaisesti parempi laskimena 5/2=2.5 ja Python 2:ssa 5/2=2
Mitä tuleen tuohon print-funktioon, niin onhan se kolmosen tapa parempi. Kaikkiin funktiokutsuihin tarvitaan sulkeet. Miksi print-funktion kohdalla tarvitsisi tehdä poikkeus?

Monesti python 2 esimerkit toimii python 3 kolmosessa, kunhan vaan vaihtaa tuon print-funktion syntaksin.
 
Jos täällä on Python taitaja/taitajia niin osaatteko sanoa miksi SBC-koneiden käyttiksissä esim. Raspberry Pi:ssä tulee Python 2 ja 3. Harvemmin muissa ohjelmointikielissä on kahta versiota. Tietysti jotain vanhoja on toki jaossa edelleen, mutta uusimmalla mennään eteenpäin.

Käyttöjärjestelmän Python on käyttöjärjestelmää varten asennettu. Siellä voi olla jotain kilkkeitä jotka pyörii 2:lla ja toiset 3:lla. Käyttäjä voi ja pitääkin asentaa uusin versio omaan käyttöön, jolla tehdään virtualenv jonne sitten asennellaan pipillä omat paketit.

Ei ole mitään järkeä tai syytä hakata päätä seinään 2:n kanssa vain jos käyttis on tehty sen päälle. Muutenkaan Python 2:een ei kannata enää koskea pitkällä tikullakaan ellei tee jotain legacy-ylläpitoa. Erot on ihan jotain muuta kuin sulkeet printatessa.
 
Monesti python 2 esimerkit toimii python 3 kolmosessa, kunhan vaan vaihtaa tuon print-funktion syntaksin.
Ei vaihdella käsin mitään vaan kokeillaan ajaa koodi 2to3-nimisen ohjelman läpi, mikä konvertoi python 2 -koodin kolmoselle. Tai siis ainakin yrittää tehdä niin.
 
Käyttöjärjestelmän Python on käyttöjärjestelmää varten asennettu. Siellä voi olla jotain kilkkeitä jotka pyörii 2:lla ja toiset 3:lla. Käyttäjä voi ja pitääkin asentaa uusin versio omaan käyttöön, jolla tehdään virtualenv jonne sitten asennellaan pipillä omat paketit.

No just esim. se pip kilke kakkoselle ja pip3 kolmoselle. Ohjeissa käsketään asentamaan pip3 ja ei toimi. Googlauksella selviää, että kannattaakin asentaa se ihan pelkkä pip ja sehän asentuu. Python kolmosella sitten ajellaan kakkosen pipillä kaiken tolkun mukaan.
Siinä mielessä erikoista, että ohjelmoinnissa voi kusta koko kääntö jo siihen, jos jostain puuttuu välilyönti niin sitten tälläistä häröä..
 
No just esim. se pip kilke kakkoselle ja pip3 kolmoselle. Ohjeissa käsketään asentamaan pip3 ja ei toimi. Googlauksella selviää, että kannattaakin asentaa se ihan pelkkä pip ja sehän asentuu. Python kolmosella sitten ajellaan kakkosen pipillä kaiken tolkun mukaan.
Kaiken tolkun mukaan ainoa ero on siinä, mille python-versiolle pip oletuksena lataa paketit. Nykypäivänä voisin kuvitella, että jokaisessa distrossa komento pip suorittaa python 3 -version.

Siinä mielessä erikoista, että ohjelmoinnissa voi kusta koko kääntö jo siihen, jos jostain puuttuu välilyönti niin sitten tälläistä häröä..
Käyttöjärjestelmän työkalut eivät ole erityisesti tarkoitettu ohjelmoijille vaan järjestelmäadmineille. Käyttöjärjestelmä tulee nähdä sovellusalustana, jonka osana ovat myös skriptaustyökalut, joihin voi laskea niin bashin, perlin kuin pythonin. Jos yrität asentaa paketinhallinnasta pip-sovellusta, niin luultavasti saat sieltä juurikin sysadminien käyttöön optimoidun version, joka kaiken lisäksi yrittää olla taaksepäin yhteensopiva saman distron vanhojen versioiden kanssa, jotta sysadminien omat skriptit eivät hajoaisi tuon tuosta.
 
No just esim. se pip kilke kakkoselle ja pip3 kolmoselle. Ohjeissa käsketään asentamaan pip3 ja ei toimi. Googlauksella selviää, että kannattaakin asentaa se ihan pelkkä pip ja sehän asentuu. Python kolmosella sitten ajellaan kakkosen pipillä kaiken tolkun mukaan.
Siinä mielessä erikoista, että ohjelmoinnissa voi kusta koko kääntö jo siihen, jos jostain puuttuu välilyönti niin sitten tälläistä häröä..
Käyttöjärjestelmän versiolla voi mennä aika hankalaksi. Kokeile vaikka asentaa miniconda halutulle Python versiolle omaan kotihakemistoon ja asenna tarvittavat paketit sillä mahdollisesti virtual environmenttia käyttäen.
 
No just esim. se pip kilke kakkoselle ja pip3 kolmoselle. Ohjeissa käsketään asentamaan pip3 ja ei toimi. Googlauksella selviää, että kannattaakin asentaa se ihan pelkkä pip ja sehän asentuu. Python kolmosella sitten ajellaan kakkosen pipillä kaiken tolkun mukaan.
Siinä mielessä erikoista, että ohjelmoinnissa voi kusta koko kääntö jo siihen, jos jostain puuttuu välilyönti niin sitten tälläistä häröä..

On tuossa ollut säätöä edestakaisin kehittäjienkin toimesta, mutta kyllä 99% ohjeista ihan kirjoja myöten on vähän niin ja näin kun ensimmäiseksi kerrotaan että jos koneessa on jo Python valmiiksi niin ei muuta kuin pipillä kirjastoja asentamaan ja sudo eteen jos ei muuten toimi. Kohta ei kukaan tiedä mitä on asennettu minnekin, et voi käyttää eri projekteissa tiettyjä kirjastojen versioita, projektin siirto toiseen koneeseen on hankalaa jne.

Suosittelen että ihan ensimmäiseksi selvittää miten asennetaan Pythonista uusin versio omaan ympäristöön, on se sitten Windowsille .exe, Linuxille PPA-repository, ActiveStaten binääri tai source tai miten haluaakaan. Sen jälkeen opettelee virtualenvin käytön uusimpien virallisten dokumentointien mukaan. Kun se onnistuu, alkaa lukemaan sitä kirjaa tai tutorialia itse kielen ominaisuuksista. Säästyy monelta huolelta kun paketit asentuu virtualenvin sisään ja on aina selvää mitä Pythonin versiota käytetään.

Itse pidän siitä että Pythonin eri versiot on asennettu sourceista kotihakemistoon .python/ -nimiseen hakemistoon ja sieltä voi halutulla versiolla laittaa virtualenvin pystyyn.
 
Aina on asentunut oikealle versiolle kun olen mennyt kyseisen pythonin hakemistoon ja ajanut sen pip.exe:n sieltä. Tietty jos tekee ohjelmia ihan perus Pythonilla, eikä millään softaan integroidulla versiolla, niin parempi on opetella nuo virtual environmentit heti alussa. Eikä Anacondakaan ole ihan huono vaihtoehto, hirveästi kaikkeahan se siinä sivussa asentaa koneelle, mutta moni käyttää esim. Jupyter Notebookia.

Anacondan paketinhallinta on graafinen. Jollain tapaa siinä on kait hyvät linkit dokumentaatioon. Ja paketit löytää helposti haulla. En ole hirveäti tutustunut, kouluissa tuota kuulemma käyttävät. Aika moni paketti asentuu helpommin kuin mitä on kokemusta pip tai easy-install asennuksista, mitä nyt tuli yllätyksenä että paketit eivät asennu jos ei käynnistä ohjelmaa "Run as administrator"-tilassa. Yllätys lähinnä kun ohjelma väitti ne asentaneensa, mutta ne ei vain toimineet, bootin jälkeen ohjelma sanoikin ettei valitsemiani paketteja ole asennettu.
 
Itse pidän siitä että Pythonin eri versiot on asennettu sourceista kotihakemistoon .python/ -nimiseen hakemistoon ja sieltä voi halutulla versiolla laittaa virtualenvin pystyyn.
Ja hyöty tästä on se, että...? Periaatteessa oletus menee niin, että jos asennat paketinhallinnasta python-sovelluksia, niin ne toimivat takuuvarmasti sillä pythonin versiolla, minkä saa myös paketinhallinnasta, mutta jos sulla on levyllä "oma versio", niin se voi olla joko liian uusi tai liian vanha. (Kokemus kuitenkin osoittaa toisin.)

Jos sinulla on jostain syystä itse kirjoitettuja sovelluksia, jotka toimivat vain joillakin pythonin versioilla, niin sitten kannattaa ehkä päivitellä niitä.
 
Ja hyöty tästä on se, että...? Periaatteessa oletus menee niin, että jos asennat paketinhallinnasta python-sovelluksia, niin ne toimivat takuuvarmasti sillä pythonin versiolla, minkä saa myös paketinhallinnasta, mutta jos sulla on levyllä "oma versio", niin se voi olla joko liian uusi tai liian vanha. (Kokemus kuitenkin osoittaa toisin.)

Jos sinulla on jostain syystä itse kirjoitettuja sovelluksia, jotka toimivat vain joillakin pythonin versioilla, niin sitten kannattaa ehkä päivitellä niitä.
Paketinhallinnasta asennetut softat toki olkoot sellaisenaan kuin ovat, mutta jos haluaa käyttää jotain tiettyä Pythonin versiota niin se on joka tapauksessa asennettava itse, makuni mukaan on vain selkeämpää että ne ovat tietyssä paikassa josta ne voi poistaa vain hakemiston tuhoamalla. Muuten täytyy asettaa PPA ja odottaa että sen pitäjä kääntää uuden version asennettavaksi. Joka on tietysti omalla tavallaan helppoa. Jos ei tykkää siitä että käyttiksen paketinhallintaan kertyy "turhaa" tauhkaa niin PPA:t on vähän kyseenalaisia.

Silloin jos ei ole oikeuksia asennella paketteja järjestelmään on toki ainoa keino asentaa se kotihakemistoon joka tapauksessa.

Päällimmäinen pointtini kuitenkin on se, että ei kannata kiinnittää mitään huomiota käyttiksen Pythoniin joka voi olla vaikka versiota 2.6, vaan aina asentaa uusin käyttöön, oli Linuxissa tai ei ja paketinhallinnalla tai ei.

Sanottakoon että en ole näihin Condiin yms tutustunut yhtään.
 
Minä taasen asennan aina ohjelmointikielen paketinhallinnasta. Tällä hetkellä tulee koodailtua pythonilla, javascriptiä node.js:n päälle ja php:tä sekä c++:aa Qt-ympäristössä. Koska käytän rolling release -mallista distroa, niin saan aina tuoreimman version joka alustasta. Pythonin vaihdos kakkosesta kolmoseen oli niin merkittävä asia, että jopa Arch Linuxissa oli (ja on edelleen) mahdollista asentaa molemmat versiot rinnakkain virallisista repoista. Debian-pohjaisissa distroissa eri versioiden asentaminen suoraan repoista on yleensä vaivatonta, koska jokainen julkaisuversio asentuu omaan hakemistoonsa.
 
Asensin jouluna debianin win10:n rinnalle ja siinä on valmiina kaksi eri pythonin versiota. Kokeilin valmiina olleella Python3.5:lla mm.
Koodi:
requests.get("https://bbs.io-tech.fi/")
ja sain errorin.
Yritin asentaa jonkin nettiohjeen avulla Python3.7:n uudemmalla openssl:llä (lähdekoodista) mutta se jäi yritykseksi. Asensin SSL:n johonkin custom hakemistoon ja tein ohjeen mukaiset muutokset Pythonin Modules/Setup.dist -asetustiedoston SLL-polkuun, mutta error tuli kun kirjoitin: make. Ehkä joku tietää miten tämän voisi tehdä johonkin virtualenvironmenttiin. Win10:llä ei ole tämmöistä ongelmaa.
 
Asensin jouluna debianin win10:n rinnalle ja siinä on valmiina kaksi eri pythonin versiota. Kokeilin valmiina olleella Python3.5:lla mm.
Koodi:
requests.get("https://bbs.io-tech.fi/")
ja sain errorin.
Yritin asentaa jonkin nettiohjeen avulla Python3.7:n uudemmalla openssl:llä (lähdekoodista) mutta se jäi yritykseksi. Asensin SSL:n johonkin custom hakemistoon ja tein ohjeen mukaiset muutokset Pythonin Modules/Setup.dist -asetustiedoston SLL-polkuun, mutta error tuli kun kirjoitin: make. Ehkä joku tietää miten tämän voisi tehdä johonkin virtualenvironmenttiin. Win10:llä ei ole tämmöistä ongelmaa.

Tuskin on tarvetta asennella lähdekoodista mitään. Asenna paketeista.

Ja jos tulee erroreita, niin kerro aina, mikä se errori oli, niin joku varmasti auttaa perkaamaan ja opit samalla tulkitsemaan niitä erroreita itsekin.
 
Tuskin on tarvetta asennella lähdekoodista mitään. Asenna paketeista.

Ja jos tulee erroreita, niin kerro aina, mikä se errori oli, niin joku varmasti auttaa perkaamaan ja opit samalla tulkitsemaan niitä erroreita itsekin.
Tässä on tämä runtime-error valmiina olleella python3.5:ssa kun tein requests.get("techbbsosoite"):
Koodi:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 594, in urlopen
    chunked=chunked)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 350, in _make_request
    self._validate_conn(conn)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 837, in _validate_conn
    conn.connect()
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 323, in connect
    ssl_context=context)
  File "/usr/lib/python3/dist-packages/urllib3/util/ssl_.py", line 324, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/usr/lib/python3.5/ssl.py", line 385, in wrap_socket
    _context=self)
  File "/usr/lib/python3.5/ssl.py", line 760, in __init__
    self.do_handshake()
  File "/usr/lib/python3.5/ssl.py", line 996, in do_handshake
    self._sslobj.do_handshake()
  File "/usr/lib/python3.5/ssl.py", line 641, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:720)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 423, in send
    timeout=timeout
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 624, in urlopen
    raise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:720)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/user/Työpöytä/ump.py", line 3, in <module>
    r = get("TechBBS")
  File "/usr/lib/python3/dist-packages/requests/api.py", line 70, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python3/dist-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python3/dist-packages/requests/adapters.py", line 497, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:720)
e: en saa enää tota techbbs: oikeaksi osoitteeksi kun tää foorumin editori muuttaa sen mutta se oli ihan oikea osoite.
Mutta ei siihen kai kannata aikaa enempää tuhlata kun testasin toisella valmiina asennetulla, python2:lla vastaavaa niin se toimi.. Piti vain ensin asentaa requests moduuli python 2:lle paketinhallinnasta.
 
Laskimena Python 3 ylivoimaisesti parempi laskimena 5/2=2.5 ja Python 2:ssa 5/2=2
Tästä olen kyllä vahvasti eri mieltä, tuo kun toimii tuolla samalla logiikalla myös muuttujien kanssa. Jos a=5 ja b=2, niin c=a/b onkin 2.5. Ei kahden kokonaislukumuuttujan jakolaskuna syntyvän uuden muuttujan tyyppi saa muuttua, ellei sitä nimenomaisesti haluta. Toki tämän voi kiertää käyttämällä jakolaskun sijaan sopivaa funktiota, mutta kauneusvirhe mikä kauneusvirhe - ainakin tällaisen jäärän silmissä, joka on ohjelmoinut yli 25 vuotta kielellä, joka tekee tämän toisin.

Toinen aivopieru (jälleen muualta tulevan silmissä) liittyy taulukoiden ja vastaavien indeksointiin:

lista=[0,1,2,3,4,5,6]

lista[1:5]
Out[2]: [1, 2, 3, 4]

Ensimmäisen alkion indeksi on nolla, kuten monessa muussa kielessä, mutta tuo hakasuluissa oleva väli antaakin viiden sijasta vain neljä alkiota. Luin tälle perustelun sekä yhdestä kirjasta että netistä, ymmärsin sen tekevän jotkut asiat näppärämmiksi, mutta näppäryyttä ei pitäisi harrastaa loogisuuden kustannuksella. Vähän aikaa sitten lukemassani Wes McKinneyn kirjassa Python for Data Analysis oli etenkin Pandas-paketin puolella monta muutakin näppärää juttua, jotka vaikuttivat minusta lähinnä vaarallisilta koodin debugattavuuden ja luettavuuden suhteen. Mutta kuten totesin, olen Pythonin parissa aloittelija. Ja kyllä tuossa kirjassa oli paljon oikein hyviltä vaikuttaviakin ominaisuuksia, jotka puuttuivat aiemmin käyttämästäni kielestä (IDL eli Interactive Data Language).
 
Toinen aivopieru (jälleen muualta tulevan silmissä) liittyy taulukoiden ja vastaavien indeksointiin:

lista=[0,1,2,3,4,5,6]

lista[1:5]
Out[2]: [1, 2, 3, 4]

Ensimmäisen alkion indeksi on nolla, kuten monessa muussa kielessä, mutta tuo hakasuluissa oleva väli antaakin viiden sijasta vain neljä alkiota.

Indeksointi on Pythonissa sikäli normaalia että alkaa nollasta, mutta tuossa on kyseessä slice. Sliceä otettaessa on parempi ajatella indeksejä alkioiden väleinä eikä itse alkioina. Esim lista[1:5] tarkoittaa "ensimmäisestä välistä viidenteen väliin". Aivan itsestäänselvää tuo ei ole.

Muutamia hyviä ominaisuuksia tuolla on. Esim. merkkijonon 4 ensimmäistä ja viimeistä kirjainta:

Koodi:
>>> s = "TechBBS"
>>> s[:4]
'Tech'
>>> s[-4:]
'hBBS'

Toisaalta jos haluat jakaa listan kahtia 5. alkion kohdalta:

Koodi:
>>> lista = [1,2,3,4,5,'a','b','c','d']
>>> kohta = 5
>>> lista[:kohta] + lista[kohta:]
[1, 2, 3, 4, 5, 'a', 'b' ,'c' ,'d']

Jos haluat etsiä merkkijonosta seitsemän merkkiä pitkän pätkän ja tiedät että se alkaa tabulaattorilla ja "U7":lla:

Koodi:
>>> s = '\tABBA\tU7TechBBS\tPython'
>>> loc = s.find('\tU7') + 3 #hypätään tunnisteen yli kolme merkkiä
>>> s[loc:loc+7] # haetaan seitsemän merkkiä
'TechBBS'

Haluat listasta joka 3. alkion:

Koodi:
>>> l = [1,2,3,4,5,6,7,8,9,10]
>>> l[::3] #alusta loppuun 3:n askelin
[1, 4, 7, 10]

Esimerkeissä ei ole yhtään ylimääräistä tai "väärän kokoista" numeroa, joten sikäli mielestäni tuo on selkeämpää koodia.
 
Nuo kielten suositummuuslistat ovat myös hyvin alakohtaisia, samaten ne riippuvat siitä, mikä lasketaan kieleksi - onko esim. bash kieli vai ei? Itse käytin aikoinaan paljon IDL:ää, joka on hyvin yleinen kieli geotieteissä, tähtitieteessä ja avaruustutkimuksessa ja lääketieteessä ainakin kuvantamispuolella. Monella muulla alalla se on hyvin pieni esim. MATLAB:iin verrattuna. Python on kyllä nostanut suosiotaan kovasti ainakin tähtitieteen puolella IDL:ään verrattuna johtuen osittain jälkimmäisen kalleudesta, osin ihan siitä, että Pythonilla on laaja kehittäjäyhteisö. Suhteellisen vähäisen kokemukseni perusteella osa asioista on toteutettu Pythonissa paremmin, osa huonommin, mutta jos ei ole varaa laittaa 1500 euroa ohjelmaan, niin se taitaa olla parempi vaihtoehto :)
 
On se Python vaan hyödyllinen kieli nykyään, koska se taipuu niin moneen asiaan. Joskus opiskeluaikoina pidin Pythonia ihan hölmönä aloittelijoiden kielenä ja tykkäsin C:stä. Työelämään siirtymisen jälkeen en ole C:tä tarvinnut, koska teen HW hommia. Sen sijaan Pythonista on ollut paljon apua asioiden automatisoinnissa ja Matlabin korvaajana. Kirjastot ovat laajoja ja simppelien ohjelmien koodaminen on nopeaa. Lisäksi dokumentaation määrä netissä on mielestäni todella hyvä.

Harmillisesti oma Python osaaminen on edelleen aika rajattua, kun olen opiskellut asioita sieltä sun täältä sitä mukaan, kun olen jotain ominaisuutta tarvinnut. Täytyy varmaan ostaa toi udemyn python masterclass -kurssi, kun sitä tuntuu niin monet suosittelevan.

Tekeekö täällä joku tietokone ohjelmistoa pythonilla? Olen pidemmän aikaa suunnitellut koodaavani erilaisia graafisia suunnitteluohjelmia nopeuttamaan töitäni.
 
On se Python vaan hyödyllinen kieli nykyään, koska se taipuu niin moneen asiaan. Joskus opiskeluaikoina pidin Pythonia ihan hölmönä aloittelijoiden kielenä ja tykkäsin C:stä. Työelämään siirtymisen jälkeen en ole C:tä tarvinnut, koska teen HW hommia. Sen sijaan Pythonista on ollut paljon apua asioiden automatisoinnissa ja Matlabin korvaajana. Kirjastot ovat laajoja ja simppelien ohjelmien koodaminen on nopeaa. Lisäksi dokumentaation määrä netissä on mielestäni todella hyvä.
Jotkut überkoodarit eivät aina hoksaa, että ihmisillä on erilaisia tarpeita ohjelmoinnin suhteen. Esimerkiksi eräs kollega ihmetteli sitä, miten me muut käytimme IDL:ää tai MATLAB:ia paljon tehokkaamman C:n tai Fortranin sijaan. Kyllähän nopeusero ohjelmaa ajettaessa oli suuri, jopa yli tekijällä kymmenen. Toisaalta jos on jokin idea, jota haluaa kokeilla, niin Pythonilla (tai noilla kahdella mainitsemallani kielellä) kirjoittaa hyvin nopeasti sen testaamiseen ohjelman. Muutaman sadan rivin ohjelma datan sisään lukemisineen ja käyrien plottaamisineen olisi vaatinut useita tuhansia rivejä Fortranilla/C:llä. Jos idea toimi ja suoritusnopeus osoittautui kriittiseksi, niin valmiin ratkaisun kyllä saattoi portata sille numeronmurskauskielelle.
 
Tekeekö täällä joku tietokone ohjelmistoa pythonilla? Olen pidemmän aikaa suunnitellut koodaavani erilaisia graafisia suunnitteluohjelmia nopeuttamaan töitäni.

On tullut tehtyä myös GUI-sovelluksia. wxPython ja Qt hyvät vaihtoehdot vähän makumieltymyksistä riippuen.

Hyvä opetella alkuunsa tekemään projektit käyttämään virtualenvejä ja Pyinstalleria, niin säästyy monelta ihmetykseltä jos tuleekin tarve ajaa softaa muualla.
 
Opettelen omien tyyppien tekoa, eli classeja ja tää oli aika hauska tehtävä siihen liittyen
Koodi:
"""pingpong.py
Exercise 18.1 in book Think Python

link to book:
https://greenteapress.com/wp/think-python-2e/

Original
running code is:

pong = Pong()
ping = Ping(pong)
pong.add_ping(ping)

I added little debugging
"""
class PingPongParent:
    pass


class Ping(PingPongParent):
  
    def __init__(self, pong):
        self.pong = pong     


class Pong(PingPongParent):

    def __init__(self, pings=None):
      
        if pings is None:
            self.pings = []
        else:
            self.pings = pings
        #print(self.pings)
          
    def add_ping(self, ping):
        self.pings.append(ping)     

      
      

pong = Pong() # pong.pings = [] ,in words: pong is class Pong
print("pong.pings: ", pong.pings)
ping = Ping(pong) # ping.pong = pong --> ping.pong.pings = [] ,in words: ping is class Ping, it has attribute ping.pong and its value pong is class Pong and thus attribute pong has its own class attribute pings which has value [].
##print("pong.pings: ",pong.pings) # checking if changed after: ping = Ping(pong), looks like it is the same.
##print("ping: ", ping)
##print("ping.pong: ", ping.pong)
##print("ping.pong.pings: ", ping.pong.pings) # so far looking allright and reasonable
pong.add_ping(ping) # pong.pings = [ping] = [Ping(pong)] = [pong] = ..etc.. , in words: attribute pong.pings has value ping, which is class Ping. Furthermore ping has its own attribute ping.pong which is class Pong, becouse: ping = Ping(pong). And this pong is *the* pong! So it starts over. So furthermore ping.pong has its own attribute pings which *surprise* is not [] but ping! etc..
print("pong.pings: ", pong.pings) # checking if changed after: pong.add_ping(ping), looks like it has changed! And it should, we added ping which is Ping-object, so looking allright.
##print("ping.pong.pings: ", ping.pong.pings) # it is also here.
##print("pong.pings[0].pong: ", pong.pings[0].pong == pong) # Heheehee, still with me?
##print("pong.pings[0].pong.pings: ", pong.pings[0].pong.pings) # want more this?
##print("pong.pings[0].pong.pings[0].pong: ", pong.pings[0].pong.pings[0].pong) # want more this?


#ok here is more
obj = pong.pings[0].pong
obj_str = 'pong.pings[0].pong'


for level in range(5):
    print("round:", level+1)

    attr = 'pings'
    obj = getattr(obj, attr)
    obj_str += '.pings'
  
    print(obj_str + ": ", obj)
  
    attr = 'pong' 
    obj_str += '[0].pong'
    obj = getattr(obj[0], attr)
  
    print(obj_str + ": ", obj)
Saa kommentoida, vaikka jotain periytymisasioihin liittyen. Siis koodi et ole mun paitsi luokka-määrittelyjen jälkeen.
 
Enpä ole vielä aiemmin nähnyt yhtä sekavaa, redundanttia ja rikkinäistä harjoitustehtävää...

1. PingPongParent-luokka on täysin turha ja mahdollisesti jopa haitallinen.
2. Tarve kutsua metodia Pong.add_ping luokkaa käyttävän koodarin toimesta on vaarallinen tekninen puute.
3. Ping-luokan konstruktori parittaa Pong-instanssin Ping-instanssiin ja Pong-luokan metodi add_ping parittaa Ping-instanssin Pong-instanssiin, mutta kumpikaan ei varmista, että käänteinen assosiaatio tehtäisiin. Tuloksena on rikkinäinen puurakenne / assosiaatioketju.
(4. Nimien Ping, Pong ja erityisesti PingPongParent käyttö on harhaanjohtavaa, kun tehtävä ei liity mitenkään pingikseen eikä pingisanalogiaan. -> Nimeä luokat ja metodit aina niin, että ne kuvastavat käyttötarkoitustaan.)
 
Lainaus:
"Enpä ole vielä aiemmin nähnyt yhtä sekavaa, redundanttia ja rikkinäistä harjoitustehtävää..."

Sekava se oli alkuun itsellekin, en tiedä rikkinäisyydestä, ihan hyvin se toimii.

"1. PingPongParent-luokka on täysin turha ja mahdollisesti jopa haitallinen."

Liittyy siihen että tehtävässä piti piirtää UML-kaavio ohjelmasta. Tuskin on haitallinen kuitenkaan.

"2. Tarve kutsua metodia Pong.add_ping luokkaa käyttävän koodarin toimesta on vaarallinen tekninen puute."

Metodejahan kutsutaan aina ohjelmasta, en ymmärrä tätä kohtaa ollenkaan.

"3. Ping-luokan konstruktori parittaa Pong-instanssin Ping-instanssiin ja Pong-luokan metodi add_ping parittaa Ping-instanssin Pong-instanssiin, mutta kumpikaan ei varmista, että käänteinen assosiaatio tehtäisiin. Tuloksena on rikkinäinen puurakenne / assosiaatioketju."

Tarkoitus tehtävässä on nimenomaan parittaa ne keskenään jolloin saadaan päättymätön attribuutti-ketju, jonka luokat ovat vuorotellen Ping- ja Pong-luokkaa. Siitä ohjelman nimikin tulee. Mitä tarkoitat käänteisellä assosiaatiolla?

"(4. Nimien Ping, Pong ja erityisesti PingPongParent käyttö on harhaanjohtavaa, kun tehtävä ei liity mitenkään pingikseen eikä pingisanalogiaan. -> Nimeä luokat ja metodit aina niin, että ne kuvastavat käyttötarkoitustaan.)"

Edelleen tehtävä ei ole minun keksimä, ja pingis kuvaa mielestäni hyvin syntyvää attribuuttijonoa.
 
Lainaus:
"Enpä ole vielä aiemmin nähnyt yhtä sekavaa, redundanttia ja rikkinäistä harjoitustehtävää..."

Sekava se oli alkuun itsellekin, en tiedä rikkinäisyydestä, ihan hyvin se toimii.

"1. PingPongParent-luokka on täysin turha ja mahdollisesti jopa haitallinen."

Liittyy siihen että tehtävässä piti piirtää UML-kaavio ohjelmasta. Tuskin on haitallinen kuitenkaan.
Ei sillä tietenkään ole mitään väliä tehtävän kontekstissa, mutta aloittelevat koodarit, jotka tehtäviä tekevät, alkavat luulla, että tuollainen täysin turha perusluokka pitäisi aina tehdä "hyvän tavan vuoksi" tai koska sillä saattaa olla jokin tekninen aloittelijalle tuntematon tekninen peruste. Olisi ollut aika helppoa keksiä tehtävänanto, jossa koodia ei tule juurikaan lisää mutta joka on ajatuksen tasolla paljon järkevämpi.

"2. Tarve kutsua metodia Pong.add_ping luokkaa käyttävän koodarin toimesta on vaarallinen tekninen puute."

Metodejahan kutsutaan aina ohjelmasta, en ymmärrä tätä kohtaa ollenkaan.

"3. Ping-luokan konstruktori parittaa Pong-instanssin Ping-instanssiin ja Pong-luokan metodi add_ping parittaa Ping-instanssin Pong-instanssiin, mutta kumpikaan ei varmista, että käänteinen assosiaatio tehtäisiin. Tuloksena on rikkinäinen puurakenne / assosiaatioketju."

Tarkoitus tehtävässä on nimenomaan parittaa ne keskenään jolloin saadaan päättymätön attribuutti-ketju, jonka luokat ovat vuorotellen Ping- ja Pong-luokkaa. Siitä ohjelman nimikin tulee. Mitä tarkoitat käänteisellä assosiaatiolla?
Kysehän on siis kaksisuuntaisesta one-to-many-assosiaatiosta. Oikeassa ohjelmakoodissa se tarkoittaa sitä, että jos luokan A olio saa viitteen luokan B-olioon mutta ei toisin päin, niin ohjelmassa on hyvin todennäköisesti bugi ja siitä voi seurata esimerkiksi ohjelman kaatuminen tai kielestä riippuen vaikka muistivuoto.

Toimiva ohjelmakoodi olisi tällainen:

Python:
class Ping:
    def set_pong(self, pong):
        if not self.pong:
            self.pong = pong
            pong.add_ping(self)

class Pong:
    def add_ping(self, ping):
        if ping not in self.pings:
            self.pings.append(ping)
            ping.set_pong(self)

Siis: sekä Ping- että Pong-luokan assosiaation rakentava metodi varmistaisi, että sekä Ping.pong että Pong.pings ovat aina ajan tasalla, eli että ei ole "orpoja" Ping-instansseja, joilla olisi viite Pong-olioon ilman että sama Pong-olio omaa viitteen kyseiseen Ping-olioon ja toisin päin.

(Huomaa, että loputtoman rekursion välttämiseksi on metodeissa myös tarkistettava, että onko viite jo rakennettu, ennen kuin kutsutaan vastakkaisen luokan metodia. Ilman tarkistusta siitä seuraa ikuinen ping-pong-efekti. Oliko se sittenkin syy, miksi luokat on nimetty näin?)

"(4. Nimien Ping, Pong ja erityisesti PingPongParent käyttö on harhaanjohtavaa, kun tehtävä ei liity mitenkään pingikseen eikä pingisanalogiaan. -> Nimeä luokat ja metodit aina niin, että ne kuvastavat käyttötarkoitustaan.)"

Edelleen tehtävä ei ole minun keksimä, ja pingis kuvaa mielestäni hyvin syntyvää attribuuttijonoa.
Ensinnäkin sinä keksit ihan itse tuon "attribuuttijonolla" kikkailun. En nähnyt koko kirjassa muita viittauksia samaan harjoitukseen tai että samaa koodia olisi käytetty myöhemmin kirjassa. Toisekseen oikeassa ohjelmakoodissa härpäkkeen tarkoitus ei varmastikaan olisi rakentaa hyvin arkista one-to-many-linkitystä vaan se olisi lähinnä vaatimus jonkin oikean toiminnallisuuden toteuttamiseksi, yksi monista välivaiheista.

Miksei luokkia olisi voinut nimetä vaikka näin:

Python:
class Organism:
    pass

class Tree(Organism):
    def __init__(self):
        self.apples = []

    def add_apple(self, apple):
        pass

class Apple(Organism):
    def set_tree(self, tree):
        pass

(Huomaa myös, ettei minun koodissani eikä alkuperäisessäkään esimerkissä kutsuta isäntäluokan konstruktoria aliluokasta vaikka niin pitäisi tehdä. Jälleen yksi aika iso virhe opetusmateriaalissa.)
 
Viimeksi muokattu:

Uusimmat viestit

Statistiikka

Viestiketjuista
257 806
Viestejä
4 478 892
Jäsenet
74 015
Uusin jäsen
Az1

Hinta.fi

Back
Ylös Bottom