Ei kyllä kauan kestänyt ennenkuin tulen tänne toisen ongelman kanssa.
plussa = str(raw_input("Turn + counting on? 1 = yes, 0 = no")) miinus = str(raw_input("Turn - counting on? 1 = yes, 0 = no")) import time from time import * def laskuri(eka, toka): if plussa == 1 and miinus == 0: print eka, '+', toka, '=', eka + toka if miinus == 1 and plussa == 0: print eka, '-', toka, '=', eka - toka if miinus == 1 and plussa == 1: print "Please restart this Python program and put 1 to other and 0 to other, you cannot put 1's to both or 0's to both" print "This program will quit in 5 seconds automaticly" sleep(5) quit if miinus == 0 and plussa == 0: print "Please restart this Python program and put 1 to other and 0 to other, you cannot put 1's to both or 0's to both" print "This program will quit in 5 seconds automaticly" sleep(5) quit eka = str(raw_input("First number?")) toka = str(raw_input("Second number?")) laskuri(eka, toka) answer = str(raw_input("There's the answer, another calculation yes, exit no. other plus or minus numbers reset")) if answer is reset: plussa = str(raw_input("+ counting 1 or 0?")) miinus = str(raw_input("- counting 1 or 0?")) answer = yes if answer is yes: eka = str(raw_input("First number?")) toka = str(raw_input("Second number?")) laskuri(eka, toka) sleep(2) quit if answer is no: answer2 = str(raw_input("you are going to quit this, are you sure? y/n")) if answer2 is 'y': quit if answer2 is 'n': eka = str(raw_input("First number?")) toka = str(raw_input("Second number?")) laskuri(eka, toka) answer = str(raw_input("There's the answer, another calculation yes, exit no, other plus or minus numbers type reset")) if answer is reset: plussa = str(raw_input("+ 1 or 0")) miinus = str(raw_input("- 1 or 0")) answer = yes if answer is yes: eka = str(raw_input("First number?")) toka = str(raw_input("Second number?")) laskuri(eka, toka) answer = str(raw_input("There's the answer, you have reached the limit of answers.")) print("This program will shut down itself, amount of answers given will be increased in next versions") print("This program shuts down in 8 seconds") sleep(8) quit if answer is no: quit
Koitin tässä tehdä plus ja miinuslaskukonetta raw_inputteja käyttäen. Mutta tulee virhe lähes joka kohdasta, siis miten tuollaisia oikein tehdään?
Pari huomiota.
Pythonissa funktioita kutsutaan sulkumerkinnällä. Jos lähdekoodissa lukee pelkkä quit, sitä ei kutsuta. Sen nimeen vain viitataan, mutta se viittaus ei tee mitään. Merkintä quit() kutsuisi tätä funktiota, mutta sitäpä ei taida olla olemassa. Kutsu funktiota exit() sen sijaan.
Merkkijonojen yhtäsuuruutta testataan ==-operaattorilla.
>>> "peruna" == "peruna" True >>> "peruna" == "peruna " False >>> "peruna" == " peruna ".strip() True
Merkkijono.strip() poistaa siis ylimääräiset välilyönnit merkkijonon laidoilta, jolloin vertailu ei erehdy niiden takia.
Jos pitkä ohjelma ei toimi, ota siitä lyhyt osa, ja selvitä miksi se ei toimi. Nyt kysymyksestäsi ei käynyt ilmi, mitä kaikkia ongelmia ja virheitä tuli vastaan, joten en kerennyt tehdä muuta kuin tarttua näihin kahteen asiaan.
Viimeiseen kysymykseesi voisi myös vastata, että Pythonissa ei tarvitse tehdä laskimia ollenkaan, koska Python-tulkki on jo laskin. Mutta jos teet harjoituksena, niin jatka vaan. Yritä nyt aluksi saada syötteen luku toimimaan ihan erikseen, kun nyt selvisi miten testata merkkijonoja, joita raw_inputista saa.
Kannattaa myös muistaa tekstin ja lukujen ero.
>>> a, b = "12", "34" >>> a + b '1234' >>> int(a) + int(b) 46
Juu kiitti Pekka ja Metabolix, ensimmäistä kertaa en ole Python IDLE:ssä tekemässä mitään simppeliä.
En tiedä missä kohdassa tuossa on virhe.
mutta tuo ohjelma tekee vähän oudosti.
Se ekaksi kysyy että mikä on miinus (laitoin 0) ja plussa (laitoin 1)
sitten se kysyy ensimmäisen numeron (62)
sitten toinen numero (52)
Tässä on vastauksesi........ (yes)
ja ohjelma sammui heti.
vastausta ei näkynyt, ja yes, no ja reset komennot lopettivat ohjelman heti vaikka kaikkien niiden komentojen jälkeen tulee yksi raw_input.
Aja ohjelmasi jotenkin niin, että ohjelman loppuessa jää näkyville, mikä kiikastaa. Esimerkiksi erikseen avattu komentorivi (cmd.exe) on Windowsissa tähän hyvä vaihtoehto.
Kohdista if answer is reset:
puuttuu selvästi lainausmerkit, ohjelma varmasti kaatuu juuri tähän, kun reset-nimistä muuttujaa ei ole olemassa. Lisäksi yhtäsuuruusvertailussa oikea merkintä on ==
eikä is
. Sama ongelma on muutamassa sijoituslauseessa noiden sisällä. Tarkistapa nyt siis, että kaikki tekstit on kirjoitettu lainausmerkkeihin mutta muuttujia ei.
Juu, en nyt keksi ollenkaan itse mikä kiikastaa, ja en tajunnut oikein tuosta, lisäsin tuossa jo vähän aikaa sitten lainausmerkit kaikkiin kohtiin,
if answer is reset: -> if answer is "reset":
mutta sama vika yhä, kaikissa on kyllä lainausmerkit, mutta ei ole
"answer" = ....
vaan
answer = ....
EDIT: cmd.exessä se vain lopettaa sen ohjelman, siis se ei lopeta sitä cmd.exeä, vaan sen mun "laskurin"
Python IDLEssä se tekee saman.
EDIT2:tein tälläisen testikoodin tässä äsken
answer = str(raw_input("kirjoita 1")) #testauksessa laitoin pelkän 1 numeron tuohon if answer is "1": print("helloworld") pass if answer is 1: print("helloworld2") pass else: print("ei toimi") pass
se laittoi:
helloworld
ei toimi
Jälleen muistutan, että == on yhtäsuuruustestaus. Is testaa objektien identiteettiä, ja aiheuttaa mm. tällaista päänvaivaa (oman koneeni Python 2.5):
>>> 256 is 16*16 True >>> 289 is 17*17 False
Tuo EI ole yhtäsuuruustestausta. Se antaa kurkata Python-tulkin sisuksiin, ja kertoo jotain pienten kokonaislukujen sisäisestä esitystavasta.
289 == 17*17
on ihan eri juttu.
Ja tässä koko koodi elif-rakenteen kanssa, jolloin vain yksi if-lauseen sisältö suoritetaan kerralla. Se on lyhenne sanoista else if.
answer = str(raw_input("kirjoita 1")) if answer == "1": print("helloworld") pass elif answer == 1: print("helloworld2") pass else: print("ei toimi") pass
Elifejä voi laittaa peräkkäin useampia.
Pekka Karjalainen kirjoitti:
.....paljon tekstiä.....
Tuo auttoi paljon! Menen katselemaan niitä oppaita vielä että saisin ne vastauksetkin näkymään siinä.
Korjailin vähän mutta nyt ilmeni uusi ongelma.
eka = str(raw_input("First number?")) #600 laitoin toka = str(raw_input("Second number?")) #600 tähänkin if laskutapa == "+": vastaus = eka, '+', toka, '=', eka + toka pass elif laskutapa == "-": vastaus = eka, '-', toka, '=', eka - toka pass print(laskuri(eka, toka))
600 + 600 = 600600 antoi tulokseksi.
eiku ei mitään, vaihoin str -> int.
Mutta yksi pieni haitta, se antaa tulokseksi
600 + 600 = 1200
None
Se tulostaa "None", koska tulostat laskuri-funktion paluuarvon, mutta laskuri-funktiossa ei ole return-lausetta. Tällöin paluuarvo on aina None.
Aihe on jo aika vanha, joten et voi enää vastata siihen.