Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: While True ja If Elif Else

noquaa [02.02.2014 16:51:17]

#

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.")

The Alchemist [02.02.2014 17:04:49]

#

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.

Chiman [02.02.2014 17:33:26]

#

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?')

noquaa [04.02.2014 11:08:08]

#

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.")

Chiman [04.02.2014 11:56:07]

#

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ä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta