Opiskelen Pythonia avoimessa yliopistossa, ja jouduin ongelmiin terminologian kanssa. Tehtävänä oli seuraava:
Kirjoita ohjelma, joka kysyy käyttäjältä luvun, ja tulostaa sen 20:n merkin levyiseen kenttään viiden desimaalin tarkkuudella.
Ongelma on se, että en ole varma, mikä on kenttä. Kokeilin seuraavaa, joka toimi kai oikein jos ymmärsin mitä kentällä tarkoitetaan:
'{0:20.5f}'.format(3)
Kuitenkin seuraava tuottaa liian pitkän kentän:
'{0:20.5f}'.format(3343434332423432434443)
Miten tuollainen luvun vieminen vakiopituiseen kenttään pitäisi toteuttaa?
Kenttä (field) tarkoittaa tällaisessa yhteydessä luvulle varattua tilaa tekstissä. Se on ilmeinen esimerkiksi taulukkoa tulostettaessa:
for i in range(1, 11): print("|", end = "") for j in range(1, 11): print(" %4d |" % (i * j), end = "") print()
On todennäköistä, että tehtävän laatija ei ole miettinyt asiaa siltä kannalta, että luvussa voi olla enemmän numeroita. Veikkaan, että haettu ratkaisu on juurikin 20.5f. Toinen mahdollisuus on 20.5e, jolloin luku ilmoitetaan kymmenpotenssimuodossa kuuden merkitsevän numeron tarkkuudella. Ei pidä takertua yksityiskohtiin, kun selvästi olet joka tapauksessa saavuttanut tehtävän tavoitteen.
Hmm. Samanlaisesta tehtävästä tuli nolla pistettä. Voinen kai paljastaa koko tehtävän, kun sen arvosteluaika meni jo.
Tutkitaan seuraavaa ohjelmakoodia:
luku = input("Anna luku: ") luku = 3.14159 * luku print("" %(luku))
Millainen merkkijono ohjelmakoodin lopussa olevalle tulostuskomennolle pitäisi kirjoittaa, jotta se tulostaisi muuttujan luku sisällön kolmen desimaalin tarkkuudella siten, että lukuesitys tulostetaan 15:n merkin levyiseen kenttään?
Vastauksen on oltava täsmällinen, siinä ei saa olla ylimääräisiä merkkejä (ylimääräisiä välilyöntejä tms.). Kirjoita merkkijonolle lainausmerkit "..."
Vastaukseni oli "{0:15.3f}", oikea vastaus kuulemma "%15.3f", ja omalla koneellani koodi kaatuu toisella rivillä:
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't multiply sequence by non-int of type 'float'
Olenkohan katkera tai jotain, mutta mielestäni on aika hassua muotoilla rivillä kolme tulostusta jos ohjelma kaatuu rivillä kaksi?
Käytätkö edes oikeaa Pythonin versiota? Tehtävä on ehkä laadittu versiolle 2, jossa inputilta tuleva data evaluoidaan ja luvuista tulee siis lukuja, kun taas versiossa 3 input palauttaa aina tekstiä.
Vastauksesi on joka tapauksessa väärä, koska %-operaattori ei käsittele noita aaltosulkumerkintöjä.
Metabolix kirjoitti:
Käytätkö edes oikeaa Pythonin versiota?
Kurssin sivulla lukee:
kurssisivu kirjoitti:
HUOM! Tällä kurssillä käytetään Python kielen versiota 3. Python 2 ja 3 eivät ole suoraan keskenään yhteensopivia. Lataa siis koneellesi uusin 3.3.2 versio Pythonista.
Omalla koneellani oleva Python:
jaakko@jaakko-VPCEB1S1E:~$ python3 Python 3.3.2+ (default, Oct 9 2013, 14:56:03) [GCC 4.8.1] on linux Type "help", "copyright", "credits" or "license" for more information.
Amiston kursseja? Kuulostaa joltain kansalaisopiston python-kurssilta valmistuneelta tuo vetäjä. Pistä reklamaatiota väärästä tehtävästä.
The Alchemist kirjoitti:
Amiston kursseja?
Itä-Suomen avoimessa yliopistossa käyn tätä kurssia. Palautteen pistinkin menemään.
Aihe on jo aika vanha, joten et voi enää vastata siihen.