Ditt eget bibliotek
Valideraren, nu på riktigt
I Kraschsäkring byggde du en loop som frågade om tills svaret dög, med ett break sist i try-blocket. Den fungerade, men den satt fast där du skrev den. Skulle tre olika ställen i programmet läsa in ett tal fick du klistra in samma sex rader tre gånger.
Med return går det att paketera om.
Nu räcker en enda funktion. Kör den, inmatningsfönstret innehåller redan ett svar som inte duger följt av ett som gör det:
Redo.
Lägg till fler rader i inmatningsfönstret om du vill se den fråga om flera gånger. Tar raderna slut innan du gett ett giltigt tal har sandlådan inget mer att mata in, och då avbryts körningen. I terminalen finns ingen sådan gräns, där frågar den tills du svarar.
Läs vad som hände med break. Den behövs inte längre, för return gör två saker samtidigt: avslutar loopen och lämnar värdet vidare. Går inläsningen fel nås aldrig return, och loopen går ett varv till, precis som förut.
Anropet ser ut som vilken inläsning som helst, men kan aldrig krascha:
val = läs_int("Välj menyalternativ (1-3): ") Det är först nu Valideraren blir det den utger sig för att vara: ett löfte till den som anropar. Funktionen garanterar att det som kommer tillbaka är ett heltal, oavsett vad användaren hittar på. Anroparen behöver inte kontrollera något.
Ditt första bibliotek
Det här är mer än lösningen på ett problem. Det är den första funktionen du skrivit som har nytta långt utanför koden den skrevs för.
def läs_int(prompt="Ange ett heltal: "):
while True:
try:
return int(input(prompt))
except ValueError:
print("Det är inte ett heltal. Försök igen.")
def läs_float(prompt="Ange ett tal: "):
while True:
try:
return float(input(prompt))
except ValueError:
print("Det är inte ett giltigt tal. Försök igen.") Det är precis vad ett bibliotek är: funktioner du skriver en gång och använder många gånger. random och math är samma sak, byggda av någon annan. Skillnaden är att de här två är dina.
Att importera din egen fil
Skapa filen inmatning.py i samma mapp som programmet som ska använda den, och lägg de två funktionerna där. Filen ska innehålla funktionerna och ingenting annat, ingen kod som körs när filen laddas.
Överst i ditt program skriver du sedan:
from inmatning import läs_int, läs_float Det är samma import som i Slump & moduler, med två skillnader. Modulen är din egen fil i stället för en av Pythons, och modulnamnet är filnamnet utan .py.
Formen from modul import namn plockar in enskilda funktioner så att du anropar dem direkt, läs_int(...), utan modulnamn framför. Skriver du i stället import inmatning heter anropet inmatning.läs_int(...), precis som random.randint(...). Båda fungerar, den första är bekvämare när du bara behöver ett par funktioner.
Python letar efter inmatning.py i samma mapp som filen du kör. Ligger de i olika mappar hittar Python inte modulen och du får ModuleNotFoundError med modulnamnet i meddelandet.
Det här är inte en parentes. I Milstolpe: Caesar-chiffret skriver du en caesar.py med funktioner som returnerar krypterad och dekrypterad text, och i Etik & brute force importerar du dem in i ett helt nytt program som försöker knäcka chiffret. Utan den här delen hade du fått klistra in koden en gång till.
Uppgift: Verktygslådan
Skapa filen
inmatning.pyoch läggläs_int()ochläs_float()där. Filen ska innehålla funktionerna och ingenting annat.Skapa ett litet program i samma mapp, till exempel
test_inmatning.py, som importerar båda funktionerna och använder dem. Mata in en bokstav där ett tal förväntas och bekräfta att programmet frågar om i stället för att krascha.Öppna din
brawl/main.pyoch byt ut varje ställe där du läser in ett tal motläs_int(). Importera funktionen överst i filen. Brawl ligger i sin egen mapp, så lägg en kopia avinmatning.pyibrawl/också, annars hittar Python inte modulen. Att ha samma verktygsfil på två ställen är klumpigt, och det är ett problem riktiga projekt löser med paket. Det ligger utanför den här kursen.Lägg till en tredje funktion i
inmatning.pysom du själv har nytta av, till exempel en som frågar en ja- eller nej-fråga och lämnar tillbakaTrueellerFalse.Gå till Source Control-panelen i VS Code, stagea båda filerna, skriv ett meningsfullt commit-meddelande och pusha.
Vad händer om
Döp om inmatning.py till random.py och kör ett program som både importerar dina funktioner och använder random.randint(). Vilket felmeddelande får du, och vilken fil hittade Python? Döp tillbaka filen efteråt.
Motivera & reflektera
Motivera vilka funktioner du valde att lägga i inmatning.py och vilka du lämnade kvar i programmet. Vad skiljer en funktion som hör hemma i ett bibliotek från en som hör hemma i det program den skrevs för?