13 svar
112 visningar
Qetsiyah är nöjd med hjälpen!

Hemgjord miniräknare, något är fel med min while-loop

Som Hondel föreslog här så har jag gjort en while loop, men den fungerar inte. 

"gör om gör rätt" printas vad jag än skriver, jag får en error innan programmet körs:

SyntaxWarning: "is not" with a literal. Did you mean "!="? while answer is not "multiplicera" or "addera":

Löste problemet helt själv (tabbade hela if-modulen), hurra för mig.

Yngve Online 18422 – Volontär digitala räknestugor
Postad: 3 sep 2020 Redigerad: 3 sep 2020

https://stackoverflow.com/questions/2209755/python-operation-vs-is-not

== och != är test på likhet men "is not" är test av identitet, dvs om Vä och Hö är samma objekt eller inte.

Jag löste inte alls problemet, nu printar den 

lol du får inte välja, här är båda:
Produkt: 8.0
Summa: 6.0
Gör om gör rätt

Vad jag än skriver. Jag förstår inte det du länkar till

Laguna 11665
Postad: 3 sep 2020 Redigerad: 3 sep 2020

Den där varningen var ny för mig. Den infördes tydligen i 3.8. Innan dess fick man skylla sig själv. Problemet är att "is" kollar om objekten upptar samma minne, och inte bara om om de är lika. Använd == i stället.

Nånting du har skrivit in, som ser ut som "addera", är inte nödvändigtvis samma objekt i minnet som strängen "addera" som redan står i programmet.

Edit: när jag googlade på felmeddelandet fick jag den här, som verkar rätt bra: https://adamj.eu/tech/2020/01/21/why-does-python-3-8-syntaxwarning-for-is-literal/

Va? Jag förstår inte den hemsidan heller! Jag ändrade till != som instruktionen sa och programmet printar ändå bara "gör om gör rät"

Mina hemmasnickrade python-kunskaper har svikit mig. Det verkar helt klart att du ska använda != istället för "is not". Så det är första grejen.

Det finns dock ett till fel som gör att while-loopen bara står och snurrar:

while answer != "multiplicera" or "addera" 

Betyder inte att den kollar om answer varken är multiplicera eller addera. "or" i det här fallet är ett logiskt "or" vilket betyder att det som står på båda sidor är två uttryck som vardera ska generera Sant eller falskt, och om minst ett är sant blir totalen sant och while-loppen kör ett varv till. answer != "multiplicera" blir sant om answer inte är "multiplicera" vilket är vad vi vill och förväntar oss. Men till höger om "or" står bara "addera". "addera" är inte 0, False, None eller liknande, så det kommer tolkas som Sant. Alltid. Och det betyder att answer != "multiplicera" or "addera"  alltid kommer vara sant, så loopen kör varje gång. Rätt syntax blir alltså

while answer != "multiplicera" or answer != "addera":

If-satsen står på rätt ställe, om du tabbar in den kommer den vara med i loopen vilket du inte vill

Tack! Jag har skrivit "answer != "addera"" nu. Men jag ville ha en till dialog som sätter igång miniräknaren och där man har valet att inte vilja se den, kolla här:

if intro == ja
^
IndentationError: unexpected indent

Hondel 330 – Mattecentrum-volontär
Postad: 3 sep 2020 Redigerad: 3 sep 2020
Qetsiyah skrev:

Tack! Jag har skrivit "answer != "addera"" nu. Men jag ville ha en till dialog som sätter igång miniräknaren och där man har valet att inte vilja se den, kolla här:

if intro == ja
^
IndentationError: unexpected indent

Först en grej: det saknas parentes efter lower. Det ska vara lower().

Ja, den gillar inte att du tabbar in när det inte ska vara någon tab. Vill du ha samma funktionalitet här, att den ska skriva ut "Du måste svara ja eller nej" tills användaren gör det? Då är det väl bara göra likadant som tidigare. Efter att du tagit in intro första gången har du en while intro != "ja" or.... och sedan det du skrivit under else i bilden. Efter loopen kommer if-satserna

Laguna 11665
Postad: 3 sep 2020
Hondel skrev:

Mina hemmasnickrade python-kunskaper har svikit mig. Det verkar helt klart att du ska använda != istället för "is not". Så det är första grejen.

Det finns dock ett till fel som gör att while-loopen bara står och snurrar:

while answer != "multiplicera" or "addera" 

Betyder inte att den kollar om answer varken är multiplicera eller addera. "or" i det här fallet är ett logiskt "or" vilket betyder att det som står på båda sidor är två uttryck som vardera ska generera Sant eller falskt, och om minst ett är sant blir totalen sant och while-loppen kör ett varv till. answer != "multiplicera" blir sant om answer inte är "multiplicera" vilket är vad vi vill och förväntar oss. Men till höger om "or" står bara "addera". "addera" är inte 0, False, None eller liknande, så det kommer tolkas som Sant. Alltid. Och det betyder att answer != "multiplicera" or "addera"  alltid kommer vara sant, så loopen kör varje gång. Rätt syntax blir alltså

while answer != "multiplicera" or answer != "addera":

If-satsen står på rätt ställe, om du tabbar in den kommer den vara med i loopen vilket du inte vill

while answer != "multiplicera" or answer != "addera"     kommer också att snurra. answer är ju alltid skilt från något av orden. Det är 'and' vi vill ha.

Efter överläggning med min lärare så har min miniräknare blivit såhär:

Och den fungerar felfritt! Hipphurra

Laguna skrev:
Hondel skrev:

Mina hemmasnickrade python-kunskaper har svikit mig. Det verkar helt klart att du ska använda != istället för "is not". Så det är första grejen.

Det finns dock ett till fel som gör att while-loopen bara står och snurrar:

while answer != "multiplicera" or "addera" 

Betyder inte att den kollar om answer varken är multiplicera eller addera. "or" i det här fallet är ett logiskt "or" vilket betyder att det som står på båda sidor är två uttryck som vardera ska generera Sant eller falskt, och om minst ett är sant blir totalen sant och while-loppen kör ett varv till. answer != "multiplicera" blir sant om answer inte är "multiplicera" vilket är vad vi vill och förväntar oss. Men till höger om "or" står bara "addera". "addera" är inte 0, False, None eller liknande, så det kommer tolkas som Sant. Alltid. Och det betyder att answer != "multiplicera" or "addera"  alltid kommer vara sant, så loopen kör varje gång. Rätt syntax blir alltså

while answer != "multiplicera" or answer != "addera":

If-satsen står på rätt ställe, om du tabbar in den kommer den vara med i loopen vilket du inte vill

while answer != "multiplicera" or answer != "addera"     kommer också att snurra. answer är ju alltid skilt från något av orden. Det är 'and' vi vill ha.

Konstigt att jag inte reflekterade över att ”or” var fel, trots att jag förklarade vad det innebar...

Man kan också lägga alternativen i en lista:

while answer not in ['addera', 'multiplicera']:

Qetsiyah 4739 – Volontär digitala räknestugor
Postad: 4 sep 2020 Redigerad: 4 sep 2020

Ja skaft! Min lärare föreslog det också, men jag fattade för trögt så han föreslog att jag skulle använda not(...) istället. Om jag vill ha fler operationer som subtrahera och dividera så blir listan smidig, det ska jag testa.

Svara Avbryt
Close