11 svar
126 visningar
Luffy behöver inte mer hjälp
Luffy 449 – Fd. Medlem
Postad: 17 nov 2022 17:40

Python - Linjärsökning i lista

Hej se uppgift:

Jag har gjort följande:

def laslista():

    ordlista = open("ordlista.txt")
    ordlista= (ordlista.read().split())
    return ordlista

def linsok(ordlista, ord):
        if ord in ordlista:
            print (ord + " finns")
        else:
            print (ord + " finns ej")

def main():
    ordlista = laslista()
    while True:
        ord=input("Vilket ord vill du söka efter? Ange exit för att avsluta: ")
        if ord != "exit":
            linsok(ordlista,ord)
        else:
            break;


if __name__ == "__main__":
    main()

Jag förstår dock inte vad som menas med att funktionen ska returnera True eller False, varför ska det göras, varför kan man inte ha som jag gjort ovan?

Fermatrix 7841 – Fd. Medlem
Postad: 17 nov 2022 17:45 Redigerad: 17 nov 2022 17:46

Oftast när man använder sig av en funktion av typen: list.contains(element) så vill man ha true eller false. 

Om jag har en kö, vill jag veta om Luffy finns i kön, jag vill inte ha en massa prints. 

Sedan så används detta om man vill göra något OM elementet existerar. 

Din implementation fungerar, och är säkert bra för vissa program, men du kommer förmodligen mer ofta än inte vilja ha tillbaka en bool och inte få ut en print.

 

Säg att om Luffy existerar, så vill jag ta bort dig från min kö. Då vill jag ju först veta, finns luffy till att börja med? Annars försöker jag ta bort något som inte existerar och detta leder väldigt ofta till Odef beteende.

Luffy 449 – Fd. Medlem
Postad: 17 nov 2022 17:52
Dracaena skrev:

Oftast när man använder sig av en funktion av typen: list.contains(element) så vill man ha true eller false. 

Om jag har en kö, vill jag veta om Luffy finns i kön, jag vill inte ha en massa prints. 

Sedan så används detta om man vill göra något OM elementet existerar. 

Din implementation fungerar, och är säkert bra för vissa program, men du kommer förmodligen mer ofta än inte vilja ha tillbaka en bool och inte få ut en print.

 

Säg att om Luffy existerar, så vill jag ta bort dig från min kö. Då vill jag ju först veta, finns luffy till att börja med? Annars försöker jag ta bort något som inte existerar och detta leder väldigt ofta till Odef beteende.

Jag gjorde nu följande:

def laslista():

    ordlista = open("ordlista.txt")
    ordlista= (ordlista.read().split())
    return ordlista

def linsok(ordlista, ord):
        if ord in ordlista:
            return True
        else:
            return False

def main():
    ordlista = laslista()
    while True:
        ord=input("Vilket ord vill du söka efter? Ange exit för att avsluta: ")
        if ord != "exit":
            a = linsok(ordlista,ord)

            if a==True:
                print(ord + " finns")
            if a==False:
                print(ord + " finns ej")
        else:
            break;


if __name__ == "__main__":
    main()

Dock är det enda jag har gjort att returnera True/false och sedan bara lägga if satserna med print i main() istället. Är det mer korrekt?

Fermatrix 7841 – Fd. Medlem
Postad: 17 nov 2022 18:00

Ja, det fungerar.

Det är egentligen det uppgiften vill att du skall göra. Men återigen, din lösning fungerar lika bra.

Fermatrix 7841 – Fd. Medlem
Postad: 17 nov 2022 18:05 Redigerad: 17 nov 2022 18:08

Varför har du en break med semikolon?

else:
	break;

Vad är det du vill bryta dig ut ur?

Ha en if, else istället, så blir koden mer kompakt. Du behöver inte heller skriva 

a==True

Det räcker med:

if a:
	...

Du ska heller inte använda:

a==True

Om det är av typen True, False eller None skriver du istället:

if a is True:
	...

En annan liten detalj är att du inte följer PEP-8. Men jag antar att det inte finns några krav att ni skall göra det?

Luffy 449 – Fd. Medlem
Postad: 17 nov 2022 18:16

En annan liten detalj är att du inte följer PEP-8. Men jag antar att det inte finns några krav att ni skall göra det?

Dessa är de kraven som ställs:

Fermatrix 7841 – Fd. Medlem
Postad: 17 nov 2022 18:27 Redigerad: 17 nov 2022 18:28

Om 3. ska göras med en kommentar så har du missat detta, eller åtminsone inte hunnit göra det ännu.  

Annars tycker jag det ser bra ut och uppfyller alla kraven.

Ett tips är att använda en "guard clause" .

Exempelvis:

def linsok(ordlista, ord):
        if ord in ordlista:
            return True
        else:
            return False

Kan skrivas som:

def linsok(ordlista, ord):
        if ord not in ordlista:
            return False

	return True

Nu blev det mycket tydligare och kompakt. Else-satsen är alltså onödig. 

Om du sedan har 3-4 nestade if-satser, så kan man ofta bryta isär det om man istället kollar på negationen. :)

Luffy 449 – Fd. Medlem
Postad: 17 nov 2022 18:36
Dracaena skrev:

Om 3. ska göras med en kommentar så har du missat detta, eller åtminsone inte hunnit göra det ännu.  

Yes! Jag tänkte att jag gör det i slutet eftersom jag fortfarande har andra funktioner som måste skapas.

Ett tips är att använda en "guard clause" .

Exempelvis:

def linsok(ordlista, ord):
        if ord in ordlista:
            return True
        else:
            return False

Kan skrivas som:

def linsok(ordlista, ord):
        if ord not in ordlista:
            return False

	return True

Nu blev det mycket tydligare och kompakt. Else-satsen är alltså onödig. 

Om du sedan har 3-4 nestade if-satser, så kan man ofta bryta isär det om man istället kollar på negationen. :)

Okej! Tack för all hjälp :D

Fermatrix 7841 – Fd. Medlem
Postad: 17 nov 2022 18:41

Det är ingen som helst fara, lycka till! :)

Laguna Online 30473
Postad: 17 nov 2022 19:51

def linsok(...

    return (ord in ordlista)

är ännu kortare.

Luffy 449 – Fd. Medlem
Postad: 17 nov 2022 19:58
Laguna skrev:

def linsok(...

    return (ord in ordlista)

är ännu kortare.

Men då returneras väl inte True/False?

Fermatrix 7841 – Fd. Medlem
Postad: 17 nov 2022 20:19

Jo, eftersom 'ord in ordlista' returnerar en bool. :)

Svara
Close