Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python, isalnumin käyttö ja luuppi

dansky [28.12.2019 15:25:57]

#

Moi!

Olen aloitteleva koodailija, ja nyt ole jäänyt jumiin Pythonin kurssitehtävään. Tehtävänä on siis lukea tiedostosta lista merkkejä ja seuloa merkkisarjoista salasanaksi kelpaavat. Eli hylkyyn, jos on erikismerkkejä. Mun täytyy kysyä teiltä kokeneemmilta apua, kun en itse tiedä mikä mulla menee vikaan. Nyt tuo koodi antaa kaikkiin merkkijonoihin tekstin "sisältää virheellisiä merkkejä." Tässä koodi:

tiedosto = open("merkkijonoja.txt","r")

while True:
    salasana = tiedosto.readline()
    if not salasana:
        break

    if (salasana.isalnum() == True):
        print(salasana[:-1] + " kelpaa salasanaksi.")

    if (salasana.isalnum() == False):
        print(salasana[:-1] + " sisältää virheellisiä merkkejä.")

tiedosto.close()

Grez [28.12.2019 15:49:54]

#

Tähän voisi antaa sellaisen vihjeen, että luuletko isalnum -funktion pitävän rivinvaihtomerkkiä kirjaimena tai numerona?

The Alchemist [28.12.2019 16:20:27]

#

On muuten ihan helvetin tyhmä harjoitustehtävä, olipa tarkoitus sitten hyväksyä tai hylätä erikoismerkkejä sisältävät salasanaehdokkaat. Ja tosiaan: niitä erikoismerkkejä pitäisi ennemmin löytyä kuin että niitä ei saisi käyttää ollenkaan.

Ole konsistentti koodaustyylin osalta. Ensimmäisessä if-ehtolauseessa et käyttänyt ympäröiviä sulkeita mutta kahdessa seuraavassa käytit. Pythonissa niitä ei pitäisi käyttää koska ne ovat turhia. Sulkeita käytetään vain usean eri ehdon ryhmittelyyn.

Älä evaluoi samaa ehtoa kahdesti vaan käytä else-lohkoa jälkimmäisen if:n sijaan.

Metabolix [28.12.2019 18:32:00]

#

Tähän ikuiseen harjoitustehtävään löytyy vastauksia intuitiivisesti hakusanalla 5345m345ö34l, joka on usein ilmoitettu tehtävän ensimmäiseksi esimerkkisyötteeksi. Tehtävä on näköjään levinnyt niin laajalle, että vastauksia löytyy suomen ja englannin ohella jopa kiinaksi!

Kuten yllä vihjattiin, ongelma tarkastuksessa on sama kuin ongelma tulostuksessa. Jälkimmäisen ongelman olet ratkaissut poistamalla merkkijonosta viimeisen merkin juuri tulostusrivillä. Parempi ratkaisu olisi jo lukemisen yhteydessä pyyhkiä rivinvaihtomerkki pois.

dansky [29.12.2019 16:48:49]

#

Iso kiitti vastauksista ja vinkeistä! Mä lähden työstään tota tehtävää teidän vinkkien avulla. Ehkä se siitä ennen pitkää ratkeaa mullekin.... Ikinä en ole mitään koodannut niin vähän hakemistahan tämä on.

Tronic [29.12.2019 20:45:29]

#

with open("merkkijonoja.txt") as f:
    for line in f:
        pw = line.strip()  # poistetaan tyhjät merkit alusta ja lopusta
        if pw:
            print(pw, "kelpaa" if pw.isalnum() else "ei kelpaa")

Tiedostot on hyvä avata esimerkin mukaisella with-lohkolla. Tässä tiedosto on lohkon sisällä käytettävissä nimellä f ja lohkon päätyttyä se suljetaan automaattisesti. tiedosto.close():a ei siis tarvita, eikä pidä käyttää.

Tiedostosta saa for-loopilla rivin kerrallaan.

Luettujen rivien loppuun tulee rivinvaihtomerkki, josta päästään eroon strip-funktiolla. Seuraavaksi if-lauseella testataan jäikö salasanaan yhtään merkkiä (ei käsitellä tyhjiä rivejä, mutta jatketaan tiedoston lukemista loppuun saakka).

Kahden vaihtoehtoisen arvon valintaan on tässä käytetty rakennetta foo if ehto else bar. Perinteistä if-elseä eri riveillä voi toki myöskin käyttää, mutta sitten molempiin lohkoihin pitää laittaa omat printit.

Mikäli tehtävässä täytyy varmistaa, että salasanassa on kirjaimia *ja* numeroita, joudut hieman muokkaamaan ratkaisua.

Vastaus

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

Tietoa sivustosta