Kartan ritas
Planera problemet, inte koden
Nästan alla gör så här första gången: förstår problemet ungefär, börjar skriva kod direkt, löser det som syns, stöter på något nytt, lappar ihop det, stöter på ännu något, lappar igen. Till slut är koden ett lager av tillfälliga lösningar staplade på varandra som ingen längre riktigt förstår. Det kallas Spagettikod Kod utan tydlig struktur, där lager av tillfälliga lösningar staplats på varandra tills allt hänger ihop med allt. Drar du i en ände rör sig hela röran, och en liten ändring på ett ställe går sönder på ett annat. , inte för att det ser ut som spagetti utan för att det beter sig som det: allt är trasslat i allt, och drar du i en ände rör sig hela röran. Det är inte ett karaktärsfel; det är vad som händer när man försöker tänka och koda samtidigt. Att planera i förväg är inte ett hinder för att komma igång. Det är det snabbaste sättet att komma igång rätt.
En algoritm, en precis och stegvis metod för att lösa ett problem, kan planeras och testas långt innan den möter verkligheten. När forskarna som samarbetade med Event Horizon teleskopet 2019 presenterade den första bilden någonsin av ett svart hål hade Katie Bouman och hennes kollegor utvecklat och testat bildalgoritmerna i åratal mot simulerad data, den riktiga teleskopdatan fanns ännu inte. När den väl kom fick flera team rekonstruera bilden oberoende av varandra, som ett bevis på att metoden, inte önsketänkandet, hade skapat den. Planen kom först. Bilden kom sedan.
Den här lektionen introducerar två verktyg för att planera logik innan du skriver en enda rad Python: flödesscheman och pseudokod. Inget av dem är kod. Ingen av dem kan köras. De är kartor, och en bra karta gör resans faktiska rörelse snabbare och säkrare.
Flödesscheman, logik som bild
Ett Flödesschema Ett diagram som visualiserar ett programs logiska flöde med standardiserade former: ovaler för start och slut, rektanglar för processer och romber för beslutspunkter. Används för att planera och kommunicera logik innan koden skrivs. är ett diagram som visar hur ett program rör sig från start till slut, inklusive alla beslutspunkter längs vägen. Det använder fyra grundläggande former:
- En oval markerar start och slut, varje flödesschema börjar och slutar med en oval.
- En rektangel representerar en process eller ett steg, något som händer: “fråga användaren om åldern”, “beräkna summan”, “skriv ut resultatet”.
- En romb representerar en beslutspunkt, en fråga med ett ja- eller nej-svar: “är åldern >= 18?”, “är lösenordet korrekt?“. Från romben går två pilar ut: en för ja, en för nej.
- Pilar visar riktningen, de binder ihop formerna och talar om i vilken ordning saker sker.
Här är ett flödesschema för ett enkelt ålderskontrollprogram:
Romben i mitten är det kritiska elementet, det är den som representerar en if-sats. Allt till vänster om romben är if-blocket. Allt till höger är else-blocket.
Pseudokod, logik som text
Pseudokod En informell beskrivning av ett programs logik skriven i naturligt språk med programmeringsstruktur. Kan inte köras av en dator, finns för att göra planering snabbare och tydligare. är ett mellanting mellan mänskligt språk och programmeringskod. Det har programmets struktur men följer inte någon syntaxregel, det kan inte köras, och det är inte meningen att det ska kunna det. Det finns för att du ska kunna skriva ned logiken snabbt, på det språk du tänker bäst på, utan att fastna i detaljer som kolon, indrag och parenteser.Samma ålderskontrollprogram i pseudokod:
STARTA
Fråga användaren: "Hur gammal är du?"
Lagra svaret i variabeln ålder
OM ålder är 18 eller äldre:
Skriv ut "Välkommen!"
ANNARS:
Skriv ut "Åtkomst nekad."
SLUTA Det finns inga regler för hur pseudokod ska se ut. Versaler, indrag, svenska nyckelord, det är din kod, skriven för dig. Vad som är viktigt är att logiken är tydlig nog att du kan läsa den om en dag och förstå exakt vad programmet ska göra.
Kommentarer
Det naturliga nästa steget är att kopiera pseudokoden rakt in i din Python-fil, omvandlad till kommentarer. En kommentar i Python börjar med # och ignoreras helt av tolken, den existerar bara för att hjälpa människor förstå koden.
Redo.
Nu har du en plan inskriven direkt i filen. Nästa steg är att skriva den faktiska koden under varje kommentar.
Det är ett arbetsflöde, inte en engångsteknik: problem -> flödesschema -> pseudokod -> kommentarer -> kod. Varje steg förfinar förståelsen tills koden nästan skriver sig själv.
Logikfel är osynliga för Python
Det finns en kategori fel som Python aldrig berättar om: logikfel. Python kräver korrekt syntax och kraschar om den saknas. Men om syntaxen stämmer och programmet kör, bryr sig Python inte om logiken är rätt eller fel. Koden gör det du bad om, men det du bad om var fel. Den sortens fel får sin fulla behandling i De tre felen senare i kursen.
Programmet nedan ska välkomna myndiga besökare och neka minderåriga. Kör det med den förifyllda inmatningen 17 och titta noga på resultatet.
Redo.
Python ser korrekt syntax och kör utan klagomål. Men programmet gör tvärtom vad det ska. Det är ett logikfel, och det enda verktyget som kan hitta det innan koden är skriven är flödesschemat, för ett flödesschema avslöjar avsikten på ett sätt som kod inte alltid gör.
Uppgift: Planera busskontrollen
En busschaufför kontrollerar resenärernas kort. Det finns tre utfall: kortet är giltigt, kortet har gått ut, eller resenären har inget kort alls. Varje utfall ger sitt eget svar.
Skapa filen busskort_plan.py.
- Rita ett flödesschema på papper för kontrollen. Räkna romberna: hur många beslut krävs för tre utfall?
- Skriv pseudokod för samma program i valfritt textformat.
- Skriv in pseudokoden som Python-kommentarer i
busskort_plan.py. - Skriv den faktiska koden under kommentarerna. Använd
input()ochif/else. Programmet behöver bara hantera två av de tre utfallen just nu, det tredje kräverelif, som introduceras i nästa del, Konsten att välja. - Lägg till flödesschemafotot i din projektmapp. Stagea allt via Source Control-panelen i VS Code och pusha.
Vad händer om
Kör ditt färdiga program och svara med något du inte förberett, till exempel kanske. Vad gör programmet? Fanns den vägen med i ditt flödesschema?
Motivera & reflektera
Motivera varför du planerade med flödesschema och pseudokod innan du skrev kod. Hittade du något i planen som hade blivit ett logikfel i koden?
Nästa nivå
Rita ett flödesschema där ett beslut leder till ett nytt beslut: får du köra bilen? Först frågar programmet om du har körkort, och bara om svaret är ja frågar det om du är nykter. Ett nej på den första frågan ska aldrig leda till den andra.
Rita det, och jämför formen med schemat i uppgiften. Där stod besluten efter varandra, här sitter det ena inuti det andra. Vad säger det om hur koden kommer att se ut?