Olen vasta aloittanut ohjelmoinnin pythonilla.
Alkajaisiksi tein keno ja lotto numeroiden arpojan. Ohjelma toimii nyt, kun while true loopin sisällä on rakenne if-if-if. Jos muutan rakenteen if-elif-else, herjaa tulkki syntaksista runko muuttujalle kohdassa "else runko == "l":". Mistä tämä virhe syntyy?
Tässä tapauksessa if-if-if tai if-elif-elif rakenteesta ei ilmeisesti ole varsinaista vaikutusta ohjelman toimivuuteen, mutta onko pythonissa oikea tapa tehdä if-elif-else rakenne? Muutenkin oppisin mieluisasti ohjelman toimimaan myös edellä mainituilla tavoilla.
Koodia:
# -*- coding: utf-8 -*- #!/usr/bin/python3.2 import random while True: print("\nArvotaanko (l)otto vai (k)eno numerot?") runko = input("Voit sulkea ohjelman (lo)peta käskyllä: ") #Ohjelman lopetus if runko == "lo": break #KENO if runko == "k": print("\nArvotaan kenon numeroita.") taso = int(input("Minkä tason keno arvotaan: ")) rivi = int(input("Kuinka monta riviä arvotaan: ")) for i in range(rivi): arvonta = random.sample(range(1,70), taso) print(arvonta) continue #LOTTO if runko == "l": rivi=int(input("Kuinka monta riviä lottoa arvotaan: ")) print("\nArvotaan loton seitsemän numeroa",rivi,":lle riville: ") for i in range(rivi): arvonta = random.sample(range(1,40), 7) print(arvonta) continue print("Onni olkoon puolellanne.")
Else ei ole elif. Vastaus tuohon tyylittelyä koskevaan kysymykseesi on paljon intuitiivisempi, kun kysymyksen kirjoittaa tällä tavoin:
Kumpi on parempi: if-else vai if-continue?
P.S. Python 3:ssa oletusmerkistö on utf-8, joten on etiketin vastaista käyttää coding-direktiiviä utf-8-enkoodauksen kanssa.
noquaa kirjoitti:
Jos muutan rakenteen if-elif-else, herjaa tulkki syntaksista runko muuttujalle kohdassa "else runko == "l":". Mistä tämä virhe syntyy?
Siitä, että else kattaa kaikki jäljelle jääneet tapaukset, eikä sille pidä asettaa enää mitään ehtoja. Parempi rakenne sinun tapauksessasi olisi if-elif-elif tai if-elif-elif-else, jossa vika else-haara tulostaa virheilmoituksen tuntemattomasta komennosta.
if-elif-elif-litanian vaihtoehtona on käyttää dictionaryä tähän tapaan:
def arvo_lottonumerot(): # ... def arvo_kenonumerot(): # ... toiminnot = {'l': arvo_lottonumerot, 'k': arvo_kenonumerot, 'lo': sys.exit} try: toiminnot[syote]() except KeyError: print('Mitä höpiset?')
Selvempi, kiitos.
En dictionarya tai try-exceptiä sellaisenaan saanut toimimaan, mutta näiden käyttämiseen olisikin hyvä tutustua vielä.
Funktioiden luominen ja kutsuminen oli myös uusi asia.
Muokkasin koodia hieman tällä periaatteella ja tuli vähän siistimpi rimpsu? Otin continuet pois if-elif-elif-elsestä, ne lienee turhia tässä tapauksessa.:
#!/usr/bin/python3.2 import random def lottonumerot(): rivi=int(input("Kuinka monta riviä lottoa arvotaan: ")) print("\nArvotaan loton seitsemän numeroa",rivi,":lle riville: ") for i in range(rivi): arvonta = random.sample(range(1,40), 7) print(arvonta) def kenonumerot(): taso = int(input("Minkä tason keno arvotaan: ")) rivi = int(input("Kuinka monta riviä arvotaan: ")) for i in range(rivi): arvonta = random.sample(range(1,70), taso) print(arvonta) while True: print("\nArvotaanko (l)otto vai (k)eno numerot?") runko = input("Voit sulkea ohjelman (lo)peta käskyllä: ") if runko == "lo": break elif runko == "k": kenonumerot() elif runko == "l": lottonumerot() else: print("?!?!?") print("Onni olkoon puolellanne.")
noquaa kirjoitti:
Muokkasin koodia hieman tällä periaatteella ja tuli vähän siistimpi rimpsu?
Tuli, hyvä. Jos haluat arvotut numerot suuruusjärjestykseen, voit käyttää sorted-funktiota.
Lisäys: Itse poistaisin suurimman osan tyhjistä rivistä, koska ne tekevät koodista kovin harvan. Jättäisin tyhjät rivit vain ennen def- ja while-rivejä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.