Dialogen & konvertering
Från monolog till dialog
Hittills har våra program pratat åt användaren, print() skriver ut, användaren läser. Det är en monolog. De flesta program som faktiskt används i världen är dialoger: de tar emot information, bearbetar den och svarar. En miniräknare som inte kan ta emot tal är inte en miniräknare.
Python har en inbyggd funktion för det här: input(). Den pausar programmet, väntar tills användaren skrivit något och tryckt Enter, och returnerar det som skrivits. Det låter enkelt, och det är enkelt, med ett undantag som orsakar mycket förvirring. Allt input() returnerar är alltid, en sträng. Skriver användaren 25 får du inte heltalet 25. Du får strängen "25".
Det är inte en bugg. Det är så det fungerar, tangentbordet producerar text, och Python litar på det. Men det betyder att du måste ta ett extra steg varje gång du vill räkna med något användaren skrivit in. Det steget kallas Typkonvertering Att omvandla ett värde från en datatyp till en annan. Görs explicit med int(), float() eller str(), Python konverterar aldrig automatiskt. .
+ gör olika saker beroende på typ
Plustecknet anpassar sig helt efter vilka typer det arbetar med. Kör koden nedan och se resultatet:
Redo.
En sträng plus en sträng är alltid sammanslagning, det kallas Konkatenering Att sätta ihop två strängar till en enda med +. Samma tecken som addition, men på strängar slår det ihop text i stället för att räkna: "18" + "5" blir "185". . + bryr sig inte om vad du försöker uppnå, det tittar på typerna och bestämmer utifrån det.
Den utökade tilldelningen du använde på tal i Lådor i RAM & datatyper fungerar likadant på text: hälsning += " världen" lägger till i slutet av det som redan står i variabeln. Räknaren växer med tal, en text växer med fler tecken, och det är samma operator som gör jobbet.
input(), programmet lyssnar
input() tar ett valfritt argument: en prompt som visas för användaren.
Redo.
Text in, text ut, det enkla fallet fungerar utan extra steg. Problemet uppstår när du vill räkna med det inmatade värdet.
Konvertera med int() och float()
Lösningen är att explicit be Python tolka om strängen som ett tal. int() returnerar ett heltal. float() returnerar ett decimaltal.
ålder_text = input("Hur gammal är du? ")
ålder = int(ålder_text)
print(ålder + 5) Först läses texten in och hamnar i ålder_text som en sträng, till exempel "18". Sedan skapar int() heltalet 18, som lagras i ålder. Först därefter går det att räkna.
Det vanligaste är att slå ihop inläsning och konvertering till en rad:
Redo.
Läs det inifrån och ut: input() körs först och returnerar en sträng, int() konverterar den omedelbart.
Att konvertera mellan taltyper låter harmlöst, men det kan sluta katastrofalt. 1996 självförstördes rymdraketen Ariane 5 37 sekunder efter start, för att ett för stort tal konverterades till en typ som inte rymde det. Notan: över 370 miljoner dollar.
Testa att göra fel. Vad händer om strängen innehåller en decimal?
Redo.
int() gissar aldrig vad du menade. Strängen måste se ut exakt som ett heltal, och "25.5" gör inte det. I stället för att avrunda åt dig vägrar den, precis som Python vägrade på Print med stort P. Läser du in decimaltal är float() rätt verktyg, och behöver du sedan ett heltal av dem går det i två steg med int(float("25.5")).
Notera formuleringen: strängen "25.5" duger inte. Vad int() gör med ett decimaltal som redan är ett tal är en annan sak, och den får du pröva själv i uppgiften.
Konvertera med str()
Behovet går också åt andra hållet, ibland har du ett tal du vill sätta ihop med en sträng. Det finns två sätt, str():
Redo.
Den andra varianten är en f-sträng En sträng som börjar med f och bäddar in variabler direkt med {}. Hanterar typkonvertering automatiskt. : strängen börjar med f, och allt inom {} byts ut mot variabelns värde. F-strängen sköter typkonverteringen åt dig, oavsett typ. F-strängar är det moderna sättet att skriva ut variabler i Python och det du rekommenderas att använda.
Redo.
Du har nu alla delarna: läsa in, konvertera, räkna, svara snyggt. I uppgiften sätter du ihop dem till en komplett dialog, i VS Code där input() pausar på riktigt.
Uppgift: En komplett dialog
Skapa filen dialog.py. Nu skriver du hela dialogen själv, i VS Code där input() väntar på riktigt.
Fråga användaren efter namn med
input(). Namnet behöver inte konverteras, det är redan en sträng.Fråga efter födelseår och konvertera svaret till
intdirekt vid inläsningen.Skapa variabeln
aktuellt_åroch ge den årets årtal. Beräkna användarens ungefärliga ålder.Svara användaren med en f-sträng som använder både namnet och åldern, till exempel:
Hej Maja! Du är ungefär 16 år gammal.Kör programmet i terminalen och ha dialogen på riktigt. Testa sedan att skriva ett ord i stället för ett årtal och läs felmeddelandet.
Stagea filen i Source Control-panelen, skriv ett commit-meddelande och pusha.
Vad händer om
Skriv print(int(3.9)) i sandlådan. Vad svarar Python, och är det vad du förväntade dig? Prova int(3.1). Vad drar du för slutsats?
Motivera & reflektera
Motivera i din README varför födelseåret måste konverteras men inte namnet. Vad hände i testet när du skrev ett ord i stället för ett årtal, och varför?
Nästa nivå
Bygg vidare på dialogen till en kalkylator, kalkylator.py: fråga efter två tal, konvertera båda, och skriv ut summan, differensen och produkten med f-strängar. Testa med decimaltal, vad behöver du ändra?