13 svar
197 visningar
Qetsiyah är nöjd med hjälpen
Qetsiyah 6503 – Livehjälpare
Postad: 3 sep 2020 12:40

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":

Qetsiyah 6503 – Livehjälpare
Postad: 3 sep 2020 12:50

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

Yngve 37878 – Livehjälpare
Postad: 3 sep 2020 12:51 Redigerad: 3 sep 2020 12:52

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.

Qetsiyah 6503 – Livehjälpare
Postad: 3 sep 2020 12:53

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 Online 28587
Postad: 3 sep 2020 13:01 Redigerad: 3 sep 2020 13:02

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/

Qetsiyah 6503 – Livehjälpare
Postad: 3 sep 2020 13:18

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"

Hondel 1294
Postad: 3 sep 2020 13:20

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

Qetsiyah 6503 – Livehjälpare
Postad: 3 sep 2020 13:27

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 1294
Postad: 3 sep 2020 13:34 Redigerad: 3 sep 2020 13:36
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 Online 28587
Postad: 3 sep 2020 14:43
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.

Qetsiyah 6503 – Livehjälpare
Postad: 3 sep 2020 15:37

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

Och den fungerar felfritt! Hipphurra

Hondel 1294
Postad: 3 sep 2020 15:38
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...

Skaft 2373 – F.d. Moderator
Postad: 3 sep 2020 16:22

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

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

Qetsiyah 6503 – Livehjälpare
Postad: 4 sep 2020 15:00 Redigerad: 4 sep 2020 15:01

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