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?
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.
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?
Ja, det fungerar.
Det är egentligen det uppgiften vill att du skall göra. Men återigen, din lösning fungerar lika bra.
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?
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:
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. :)
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
Det är ingen som helst fara, lycka till! :)
def linsok(...
return (ord in ordlista)
är ännu kortare.
Laguna skrev:def linsok(...
return (ord in ordlista)
är ännu kortare.
Men då returneras väl inte True/False?
Jo, eftersom 'ord in ordlista' returnerar en bool. :)