TDDE44 Programmering, grundkurs¶

Föreläsning 1.1-1.2¶

Johan Falkenjack, johan.falkenjack@liu.se¶

Föreläsningsöversikt Fö 1.1 & 1.2¶

  • Introduktion
  • Kursadmin
  • Datorer
  • Linux
  • Programmering

Föreläsningsöversikt Fö 1.1 & 1.2¶

  • Introduktion
  • Kursadmin
    • Betygsmoment
    • Kurshemsidan
  • Datorer och historia
  • Linux
  • Programmering
    • Vad är ett program?
    • SICP-citat
    • Syntax och semantik

Vem är jag och vad gör jag här?¶

vem.jpg

  • Johan Falkenjack, oftast han men hen går också bra.
  • Teknologie Licentiat i Datavetenskap och Universitetsadjunkt på Institutionen för Datavetenskap.
    • Slipper forska men brukade forska om maskininlärning och tillämpad statistik inom naturliga språk.
  • Data Scientist, lite programmerare, lite statistiker, på BRP Systems.
  • Tog ungefär 3 år på mig att "fatta" programmering.
  • Ny på kursen, examinator, kursledare, ambulerande labbassistent och allmänt bollplank i mån av tid.

Kursadministration¶


  • 3 Examinationsmoment, LAB1, LAB2 och DAT1
  • 12 Föreläsningar
  • LAB1, U/G, 3 hp
    • 3 Grundläggande Python-uppgifter
    • 4 Mindre laborationer
  • LAB2, U/G, 3 hp
    • 3 Större laborationer
  • DAT1, U/3/4/5, 2 hp
    • Datortenta (2024-05-30)
  • Kurshemsidan har denna och all annan information ni kan önska.
    • https://www.ida.liu.se/~TDDE44

Kurslitteratur¶

  • Ingen obligatorisk.
  • Rekommenderade läsanvisningar finns alltid till:
    • Skansholm, J. (2019). Python från början. Studentlitteratur.
  • Oftast till:
    • Downey, Allen B. (2015). Think Python: How to Think Like a Computer Scientist. Green Tea Press. http://greenteapress.com/wp/think-python-2e/. (Gratis online och PDF-version finns att ladda ner gratis också.)


  • Andra bra alternativ:
    • Lutz, M. (2013). Learning Python, 5th Edition. O’Reilly Media.
    • Punch, W. F., & Enbody, R. (2017). The Practice of Computing Using Python, Global Edition, 3/E. Boston: Pearson.
    • Zelle, John M., (2017) Python Programming : An Introduction To Computer Science Third Edition. Franklin, Beedle & Associates, 2017. ISBN: 9781590282755, 1590282752

Lektioner och labbar under VT1¶

  • Görs i par som man anmäler i Webreg:
    • https://www.ida.liu.se/webreg3/TDDE44-2024-1/LAB1
    • Hitta partner först, anmäl sen.
    • Prata med er assistent om ni inte hittar en partner.
  • Genomförs i Linux-pul eller på egen dator.
  • Ej obligatorisk närvaro, men Laborationerna måste redovisas innan de kan lämnas in.
    • Det finns specifika redovisningstillfällen schemalagda i TimeEdit
  • Lektioner: Övningsuppgifter som ni bör göra
  • Laborationer: Uppgifter som ni måste göra

Inlämning¶

  • Inlämning i systemet Sendlab.
  • Pythonuppgifterna rättas med automaträttningsskript.
    • Rättningskriptet genererar en hash-kod när ni är godkända, denna sparar ni i en txt-fil som ni skickar in i Sendlab här
    • https://www.ida.liu.se/sendlab/student/sendprevalidated?code=tdde44_pyuppg_vt24
  • Laborationerna redovisas för er assistent som sedan låser upp Sendlab åt er.
    • QR-kod för upplåsning hämtar ni här: https://www.ida.liu.se/sendlab/student/request_validation?code=tdde44_labbar_vt24
    • Assistenten scannar den och låser då upp er inlämning.
    • Ni skickar sedan in kod i Sendlab här: https://www.ida.liu.se/sendlab/student/sendprevalidated?code=tdde44_labbar_vt24

Varför måste man läsa den här kursen?


Alla på LiTH och några till läser programmering¶

  • 729G46 Informationsteknologi och Programmering, 12 hp (Kognitionsvetenskap)
  • TDDE23/24 Funktionell och imperativ programmering, 11 hp (D, U)
  • TDDC77 Objektorienterad programmering, 8 hp (IT)
  • TDDE67 Programmering, grundkurs, 8 hp (I)
  • 725G92 Problemlösning och programmering, 7.5 hp (Systemvetenskap)
  • 732G33 Programmering i R, 7.5 hp (Statistik)
  • TDDE54 Programmering och problemlösning, 6 hp (M, TB, KB, EMM, KA, MI)
  • TDP002 Imperativ programmering, 6 hp (IP)
  • TND012 Programmering grk, 6 hp (ED, KTS, MT)
  • TDIU08 Problemlösning och programmering, 6 hp (Di, Ei)

Alla på LiTH och några till läser programmering¶

  • 729G46 Informationsteknologi och Programmering, 12 hp (Kognitionsvetenskap)
    • Python
  • TDDE23/24 Funktionell och imperativ programmering, 11 hp (D, U)
    • Python
  • TDDC77 Objektorienterad programmering, 8 hp (IT)
    • Java
  • TDDE67 Programmering, grundkurs, 8 hp (I)
    • Ada
  • 725G92 Problemlösning och programmering, 7.5 hp (Systemvetenskap)
    • Ada och Python
  • 732G33 Programmering i R, 7.5 hp (Statistik)
    • R
  • TDDE54 Programmering och problemlösning, 6 hp (M, TB, KB, EMM, KA, MI)
    • Ada och Python
  • TDP002 Imperativ programmering, 6 hp (IP)
    • Python
  • TND012 Programmering grk, 6 hp (ED, KTS, MT)
    • C++
  • TDIU08 Problemlösning och programmering, 6 hp (Di, Ei)
    • Ada och Python

but_why.gif

  • Min far, civilingenjör i Teknisk Fysik och Elektroteknik med examen 1979 och nästintill aggressivt ointresserad av alla tekniska problem som inte kan lösas med lödkolv. Han läste åtminstone 3 kurser i programmering på Y-programmet under andra halvan av 70-talet. Programmering har inte blivit mindre relevant för er sedan dess.
  • Ni som läser medicinsk teknik kan googla på Therac-25 och läsa om varför mediciningenjörer bör kunna programmera.
  • Matematik och Teknisk Matematik då? All matematisk programvara idag är bara specialiserade programmeringsmiljöer. Vill ni kunna idka matematik på 2000-talet måste ni vara bekväma med det.

Hur lär man sig programmera?¶

pexels-yan-krukau-8837774_downsized.jpg

  • Genom att programmera.
  • Konstruktivism, nidbilden, misstagen, och varför jag trots allt är konstruktivist.
  • Experimentera, testa, våga göra fel.
  • Man måste öva, öva, öva.

Vad är ett program?

"Computer program, detailed plan or procedure for solving a problem with a computer; more specifically, an unambiguous, ordered sequence of computational instructions necessary to achieve such a solution. "

- Encyclopædia Britannica

Vad är ett program?

"We are about to study the idea of a computational process. Computational processes are abstract beings that inhabit computers. As they evolve, processes manipulate other abstract things called data. The evolution of a process is directed by a pattern of rules called a program. People create programs to direct processes. In effect, we conjure the spirits of the computer with our spells."

- Abelson and Sussman, Structure and Interpretation of Computer Programs aka The Wizard Book

Okej, men vad är i så fall en dator, eller "computer"?

human_computers.jpg

Om vi bortser från den ursprungliga definitionen?

  • Maskin som kan utföra beräkningar?
  • Vilka beräkningar som helst?
  • Vilka beräkningar som helst, givet rätt instruktioner?
  • Om de instruktionerna är program, så är datorer beräkningsmaskiner som kan programmeras att utföra vilka beräkningar som helst.

1931: Kurt Gödel förstör det roliga¶

goedel.png

Gödels ofullständighetssatser

  1. I varje konsistent formellt system $F$ som är tillräckligt för aritmetiken finns någon sann men obevislig formel $G_F$, det vill säga en formel som inte kan bevisas eller motbevisas.
  2. Konsistensen hos ett formellt system $F$ som är tillräckligt för aritmetiken kan inte bevisas inom systemet.

(Själva bevisen lämnas som övning till den ambitiöse men Russels Paradox är en bra startpunkt.)


  • Slutsats: Maskiner som kan beräkna vad som helst är inte möjliga.

1936: Alan Turing och Alonzo Church räddar dagen¶

turing_church_smiling.png

  • På helt olika sätt och helt oberoende av varandra, och kanske inte ens med flit.
  • Båda försökte visa huruvida Avgörbarhetsproblemet (tysk. Entscheidungsproblem) hade en lösning eller ej givet Gödels insikt om att inte alla problem gick att lösa matematiskt.
  • Church publicerade sin lambdakalkyl i artikeln "An Unsolvable Problem of Elementary Number Theory" i april.
  • Turing publicerade sin "On Computable Numbers, with an Application to the Entscheidungsproblem" i maj men hade delat ett utkast med en kollega redan innan Church publicering.
  • Church bjöd snudd på omgående in Turing till Princeton och erbjöd sig att handleda Turings forskarstudier. Japp, Turing hade inte ens påbörjat forskarstudier när han uppfann sin maskin.

Turing-maskinen, en dator i teorin

  • Maskinens beståndsdelar:
    • Ett band med oändligt antal rutor som kan innehålla en symbol (eller vara tom)
    • Ett läs- och skrivhuvud som kan läsa och skriva symboler till/från bandet
    • En ändlig lista över tillstånd.
    • Ett tillståndsregister som lagrar maskinens aktuella tillstånd.
    • En ändlig uppsättning instruktioner som beskriver vad som ska göras givet maskinens tillstånd och aktuell symbol under läs- och skrivhuvudet.
  • En instruktion beskriver
    • vad som ska göras med aktuell ruta (skriva/sudda)
    • om/hur huvudet ska flytta på sig
    • maskinens nya tillstånd att instruktionen har utförts
  • Turing insåg snart att hans maskin gick att generalisera ytterligare.
  • Uppsättningen av instruktioner kunde skrivas i början av bandet och det var inte nödvändigt att separera dessa.
  • En sådan maskin, som kunde läsa in sin uppsättning av instruktioner från bandet, kallade han för en Universell Maskin.

1937: Turing bevisar att hans Universella Maskin (senare kallad Universella Turing-maskinen) och $\lambda$-kalkylen är ekvivalenta.


Vi har nu två olika formalismer som kan uttrycka alla beräkningsbara problem!

Dator?

Teoretisk maskin som givet rätt instruktioner och oändligt mycket plats för minnesanteckningar kan utföra alla beräkningar som är möjliga i ändlig tid.


(Ändlig tid kan dock fortfarande vara väldigt länge.)

Hur skriver man instruktioner?


eller


Hur programmerar man?

ENIAC¶

eniac-marlyn-wescoff-and-ruth-lichterman2.webp

Programmerarna Marlyn Wescoff och Ruth Lichterman implementerar ett program på ENIAC (sannolikt för någon form av ballistisk beräkning).

  • Vi har konstaterat att datorer är maskiner. Elektroniska datorer uttrycker i grunden bara ett elektriskt flöde. På tidiga datorer som Eniac var detta extremt tydligt.
  • I ENIAC uttrycktes programmen som hundratals telefonväxelkablar, ställdon, och brytare som tillsammans lät strömmen flöda genom maskinen enligt ett visst mönster.
  • Själva datan lästes in via hålkort.
  • ENIAC var Turing-komplett. Dvs bortsett från det oändliga lagringsutrymmet kunde ENIAC beräkna allt som Turing-maskinen kunde.

1945: John von Neumann och den fundamentala datorarkitekturen¶

von_neumann_hat.png

  • John von Neumann tyckte dock att ENIACs approach var väldigt omständig.
  • Programmering via kabel var omständigt, tidskrävande, och besvärligt att felsöka.
  • Alan Turing hade ju visat med sin Universella Maskin att även instruktionerna kunde skrivas på bandet.
  • Om datan representerades av hålkort där sekvenser av hål representerade 1:or och 0:or, så borde program kunna representeras på samma sätt.

von Neumann-arkitekturen

  • Processorenhet med aritmetisk-logisk enhet och in/ut-register för denna
  • Kontrollenhet med aktuellt instruktionsregister och en programräknare som håller koll på nästa instruktion
  • Internminne som lagrar både data och instruktioner som används i den aktuella processen
  • Externminne för långtidslagring av data och program (sekvenser av instruktioner)
  • In- och Utenheter
  • von Neumann refererade till Alan Turing och menade att hans arkitektur bara var en realisering av vad Turing uppfunnit iom den Universella Turing-maskinen
  • Kallas mer generellt för Stored-Program Computer och är det vi normalt sett menar när vi pratar om datorer idag

Binär maskinkod, vår första abstraktion i kod

  • Består av långa sekvenser av 1:or och 0:or som representerar instruktioner och den data som instruktionerna opererar på.
  • Exempelvis 10111000, 00000000, 10111000, 10001110, 11011000, 11000110, 00000110, 10011110, 00001111, 00100100, 11001101, 00100000
    • Med "vanliga" heltal med talbas 10 motsvarar detta 184, 0, 184, 142, 216, 198, 6, 158, 15, 36, 205, 32
  • Ofta uttrycker vi 8-bitars sekvenser av binära tal (1 byte) som hexadecimala tal (med talbas 16).
    • Vi använder a för att representera vanliga heltalet 10, b för 11, osv. upp till f för 15
    • Exemplet ovan blir då b8, 00, b8, 8e, d8, c6, 06, 9e, 0f, 24, cd, 20
  • Resultat på en dator med MS-DOS på Intel 8086-hårdvara: Ett dollartecken i nedersta högra hörnet på skärmen.
  • Vi säger att maskinkod är en abstraktion av den underliggande hårdvaran.
  • Vi behöver inte längre tänka på elektroniska komponenter, vi har abstraherat bort det.

Maskinkod för Intel 8085 (1976), några exempel

Binary Opcode (hex) Description
10000111 87 Add the contents of register A to that of the accumulator
00111010 3a Load data stored in the given memory address
01111001 79 Move data from register A to C
11000011 c3 Jump to instruction in specified memory address
11000001 c1 Pop from stack and copy to memory registers B + C
  • Språket är strikt bundet till en viss typ av hårdvara.
  • Inte särskilt uttrycksfullt. Vi kan hämta bit-sekvenser från minnet, placera dem i register, och utföra enkla matematiska och logiska operationer på dem.

  • Allt annat än lättläst

  • Det är ungefär allt. Vill vi göra något mer avancerat måste vi skriva väldigt många operationer.

  • Eller så bygger vi något i maskinkod som, givet vissa inputs, generera annan maskinkod.

Assemblykod, en abstraktion av maskinkod

MOV AX, 47104
MOV DS, AX
MOV [3998], 36
INT 32
  • Ett assemblator-program (eng. assembler) kan använda ovanstående text och producera ett program i maskinkod.
    • (Exempel från http://www.swansontec.com/sprogram.html)
  • Samma program som ovan, fast i Assembly-kod
  • Olika assemblatorer kan vara implementerade för olika hårdvaror, men deras assembly-kod kan se likadan ut.
  • Dvs. vi kan, med vissa begränsningar, assemblera samma assembly-kod till maskinkod för olika hårdvaror.
  • Vi har abstraherat bort maskinkoden, och i någon utsträckning, beroendet av viss hårdvara.
  • Mer läsbart, men fortfarande inte så uttrycksfullt.

Högnivåkod som översätts till assembler och maskinkod

#include <stdio.h>
int main() {
  printf("Hello, World!\n");
  return 0;
}
  • En kompilator översätter ett program från kod som vi, med lite övning, kan läsa och förstå, till maskinkod.
  • Kan efter kompilering köras direkt och oberoende av kompilatorn.
  • Tillåter eller kräver ofta manuell hantering av hårdvaruresurser som t.ex. minne och man behöver ofta vara väldigt detaljerad för att kompilatorn ska producera optimal maskinkod.
  • Kompilering av stora projekt kan ta lång tid och efter kompilering är man åter bunden till viss hårdvara.
  • Kan dock ge mycket snabb kod.
  • Enormt mycket mer uttrycksfullt.

Högnivåkod som kan köras direkt av ett annat program

print("Hello, World!")
  • En interpretator eller programtolk kan köra program direkt, utan att översätta dem till maskinkod.
  • Kräver alltid att interpretatorn för det aktuella språket är installerad för att programmet ska gå att köra.
  • Kan köras på alla plattformar till vilka det finns en interpretator.
  • Ofta en eller flera storleksordningar långsammare att köra än kompilerad kod.
  • Dock oftast mycket snabbare att skriva och testa.
  • Perfekt för att lära sig programmera.

Abstraktionshierarki


Interpreterade högnivåspråk

Kompilerade högnivåspråk


Assemblerkod


Maskinkod

Jajaja, men vilket programmeringsspråk är bäst?

sunny.gif
  • Vilket snickarverktyg är bäst, en såg eller en hammare?
  • Till skillnad från snickare så brukar programmerare ha ett svar.
    • De har dock nästan alltid fel (om man frågar ett slumpmässigt urval av andra programmerare).


  • Det finns fall där en viss typ av språk definitivt är bäst, men det beror på vad programmet ska göra.
  • Många verkliga program är byggda i flera olika språk där varje språk används för det som det är bäst på.

Fråga som faktiskt kan besvaras:


Vilket programmeringsspråk är sämst?



(JavaScript)
  • För att jämföra med snickar-exemplet:
  • Du tror att du använder en hammare och slår i en spik men när du är klar inser du att du istället sågat av dig ena benet.

Python-Logo.png

Kort om Python

guido.jpg
  • Födelsedatum: sent 80-tal men officiellt 20e februari 1991
  • Skapare: Guido van Rossum (före detta "Benevolent Dictator For Life", eller BDFL, över Python)
  • Fyllde 2.0 i oktober 2000
  • Fyllde 3.0 i december 2008
  • Idag: 3.12
    • (I kursen använder vi 3.11)
  • Top 5 i de flesta rankningar av popularitet, nr 1 i flera av dem.
  • Interpreterat, objekt-orienterat och dynamiskt typat programmeringsspråk.
  • Varför Python i den här kursen?
  • Populärt som nybörjarspråk
    • Alltså finns väldigt mycket resurser på grundläggande nivå
  • Finns till flera plattformar, även inbäddade system, och används i produktion inom många områden

    • Alltså finns väldigt mycket resurser från verkligheten

    • Snabbt och enkelt att testa

  • Stöd för flera olika programmeringsparadigm
    • Möjlighet att demonstrera olika koncept inom programmering

Programmeringsspråk på Github

state_of_the_octoverse.PNG

The State of the Octoverse (2022)

LiUs GNU/Linux-miljö


eller


Vad i hela fridens namn, jag har ju knappt använt en dator med tangentbord förut?!

Operativsystem¶

operating-system-logos1.jpg

  • Mest fundamentala mjukvaran på en dator.
  • Ger andra mjukvaror en miljö att verka i utan behöva arbeta direkt mot hårdvara.
  • Filsystem.
  • Nätverk.
  • Ytterligare ett sätt att abstrahera bort onödig komplexitet.

It's a UNIX System!¶

unix_system.gif

  • Lex Murphy tittar på 3D-animerad filnavigering och hackar en hel nöjesparks säkerhetssystem på under 30 sekunder.
  • Tekniskt sett helt korrekt. Det här systemet fanns faktiskt. Silicon Graphics 3D File System Navigator
  • Inte på något sätt typiskt för hur UNIX eller en UNIX-liknande miljö brukar se ut, varken då eller nu.

Hur brukar det se ut?

  • Demonstrera inloggning via ThinLinc.

LiUs Linuxmiljö

  • Operativsystem: GNU/Linux (Ubuntu 20.04)
  • Inloggning med LiU-ID
  • Möjlighet att logga in från egen dator via ThinLinc (VPN krävs utanför LiUs
    • nätverk)
  • Se LiUs studentsidor samt kurshemsidan för mer info
    • https://liuonline.sharepoint.com/sites/student-under-studietiden/SitePages/Fjarrinloggning.aspx
    • https://www.ida.liu.se/~TDDE44/distans/thinlinc/
    • https://www.ida.liu.se/~TDDE44/distans/rdp/

Terminalen som gränssnitt

Vadå gränssnitt?

  • Engelska: interface
  • Gränssnitt - platsen där två olika system möts och kommunicerar med varandra - något som ligger mellan två olika system och genom vilket systemen kommunicerar med varandra.
  • Gränssnitt
    • Hårdvarugränssnitt, fysiska anslutningar mellan apparater, t.ex. USB, SATA, XLR, etc.
    • Nätverksgränssnitt, mellan apparat och nätverk, t.ex. Ethernet, WiFi, Fiber, etc.
    • Mjukvarugränssnitt, mellan olika program och/eller hårdvaror, t.ex. operativsystem, drivrutiner, API:er.
  • Ofta pratar vi om användargränssnitt, där det ena systemet är en människa och det andra är ett tekniskt system som hen använder, t.ex. en mjukvara.

Kommandoradsgränssnitt (CLI - Command Line Interface)¶

bash_shell.png

  • Syfte: miljö för att utveckla och köra egna program
  • Enklare (färre rörliga delar) än ett grafiskt gränssnitt:
    • Output: text (en rad/tecken i taget)
    • Input: textkommandon
  • Kraftfullt, nästan ett programmeringsspråk i sig.
  • Jämfört med grafiskt gränssnitt:
    • Output: fönster med olika interaktiva grafiska komponenter
    • Input: musposition, musklick, tangenttryckningar, objekt som dras och släpps m.m

Jag har hört att det heter skal/prompt/konsol, inte terminal?

  • Terminalprogrammet
    • Tillhandahåller funktionalitet för skalprogram att visa text och ta emot tangentbordstryck från användaren.
  • Skalet/skalprogrammet (eng. shell)
    • Tillhandahåller ett interaktivt gränssnitt för att köra kommandon.
    • Startas automatiskt när vi öppnar terminalprogrammet.
    • En typ av interpretator.
  • Prompt
    • Sekvens av tecken som visar att skalet är redo att ta emot ett kommando.
    • Tecknet $ används ofta för att representera en godtycklig prompt i böcker och dokumentation.
  • Konsol
    • Ett specialfall av terminal som tillhandahålls direkt av operativsystemets kärna (eng. kernel). $\leftarrow$ överkurs
  • Alla är delar av ett Kommandoradsgränssnitt
  • Skalet/skalprogrammet (eng. shell)
    • Exempel, Unix/Linux: sh (Thompson, senare Bourne, Shell), bash (Bourne Again), csh (C), ksh (Korn), tcsh (TENEX C), zsh, scsh (Scheme), dash (Debian Almquist), fish (kolla in https://fishshell.com/)
    • Exempel, Windows: COMMAND.COM, CMD.EXE, PowerShell

fish_shell.png

Var är vi?

travolta_lost.gif
  • I skalet, t.ex. i bash, så befinner vi oss alltid någonstans i filsystemet och kommandon som körs, körs alltid i katalogen vi står i. Kallas för arbetskatalog.
  • Om vi t.ex. kör ett kommando som skapar en fil, så skapas den i katalogen vi står i. Samma om vi sedan kör ett kommando för att ta bort en fil med samma namn.
  • Ett filsystem är hur data är organiserad på någon typ av media för långtidslagring, t.ex. en hårddisk, ett USB-minne, eller, på den gamla onda tiden, en diskett.

Katalogstruktur i UNIX-liknande system¶

file_system.png

  • Katalog == Directory
    • /var är förälder parent directory till /var/tmp
    • /var/tmp är underkatalog subdirectory till /var
  • Självklart finns många, många fler kataloger.
  • Filträd - hierarkisk struktur
  • Jämför med mappar i Windows, macOS, eller Google Drive.

Jaja, men var är vi nu?


Svar: ~


Symbolen `~` utläses som "tilde" och är ett alias till den inloggade användarens hemkatalog. Den "riktiga" sökvägen till en användares hemkatalog är `/home/användarnamn`
  • Bash startar "by default" alltid i hemkatalogen om man inte angett något annat.

Viktiga sökvägar

Absoluta — utgår från en fixerad punkt i filsystemet

  • / : roten i filsystemet
  • ~ : din hemkatalog
  • ~/Downloads : där filer du laddar ner hamnar
  • ~adalo256 : användaren adalo256s hemkatalog
  • /dev/null : intigheten, filsystemets svarta hål

Relativa — utgår från katalogen vi står i

  • . : ett alias för arbetskatalogen (eng. working directory), dvs. katalogen vi står i
  • .. : ett alias för föräldrakatalogen (eng. parent directory) till den katalog vi står i
  • Notera skillnaden mellan ~/Downloads och ~adalo256

  • Hemkatalogen

    • Dokument
    • Inställningar
    • Program som bara du ska ha tillgång till

Absoluta sökvägar¶

filsystemets_tradstruktur.png Innehållet i /home/jodfo01
- __Utgår från _roten___ i filsystemet; katalogen "högst upp", och som som alla andra kataloger ligger i - Absolut sökväg till roten i Linux & macOS: `/` - Varje fil eller katalog har __en__ unik ___absolut___ sökväg
- __Exempel på absoluta sökvägar__ ```bash /home/jodfo01/katalog1 /home/jodfo01/katalog2/hejsan/hoppsan /home/jodfo01/katalog3/fil7 ```

Relativa sökvägar¶

filsystemets_tradstruktur.png Innehållet i /home/jodfo01
- Utgår från en specifik plats i filsystemet - Varje fil eller katalog har olika relativa sökvägar beroende på vilken katalog man utgår ifrån.
- __Exempel på relativa sökvägar till__ `/home/jodfo01/katalog3/fil7` - `fil7` (från `/home/jodfo01/katalog3`) - `katalog3/fil7` (från `/home/jodfo01/`) - `../katalog3/fil7` (från `/home/jodfo01/katalog2`) - `../../katalog3/fil7` (från `/home/jodfo01/katalog2/hejsan`)

Hur vet vi var vi är?

  1. Kolla prompten
    • I LiUs Linux-miljö är prompten konfigurerad att innehålla sökvägen till den aktuella katalogen (eng. working directory). Detta gäller dock inte på alla system och användare kan ändra sin prompt hur de vill.
  2. Kommandot pwd : print working directory
    • Skriver ut sökvägen i terminalen.

Kommandot cd : change directory

  • Flytta till en annan katalog, en sökväg skickas med som argument till kommandot.
  • Exempelvis:
    • cd / : flytta till rotkatalogen
    • cd .. : flytta till föräldrakatalogen
    • cd - : flytta tillbaka till den senaste katalogen vi var i
    • cd katalognamn : flytta till underkatalog till arbetskatalogen med namnet katalognamn (ger fel om den katalogen inte finns)
    • cd : specialfall som flyttar till hemkatalogen

Delar av ett kommando¶

delar_av_ett_kommando_ls.png

_option_ = flaggor/växlar (olika för olika kommandon), t.ex. `-l` för kommandot `ls`

Delar av ett kommando¶

delar_av_ett_kommando_cp.png

_option_ = flaggor/växlar (olika för olika kommandon), t.ex. `-R` för kommandot `cp`

Vad händer egentligen när ett kommando körs?¶

Exempel på kommandon¶

  • Interna (eller inbyggda)
    • echo : skriver ut argument i terminalen
    • cd: byter katalog (arbetskatalog - katalogen man "står i")
  • Externa
    • ls: visar innehåll i katalog
    • mv: flytta/döp om fil eller katalog
    • mkdir: skapa katalog
    • cat: skriv ut innehåll i fil
    • touch: skapa ny fil/uppdatera senast ändrad hos existerande fil
    • man: visa hjälptext för kommandon
  • Interna kommandon
    • Inbyggda i skalet
    • Körs direkt
  • Externa kommandon
    • Separata program
    • Skalet måste leta upp dem
    • Kan läggas till
    • Vi kan göra egna
  • Inte alltid självklart vilka som interna och vilka som är externa, och ibland finns flera med samma namn.

Kan det finnas flera kommandon med samma namn?!¶

what the fudge

Kommandot which till räddning!¶

$ which ls
/bin/ls
  • Kommandot which visar sökvägen till det program som kommer köras om vi kör kommandot ls.
  • Kommandot ls är alltså ett program lagrad i filen ls i katalogen /bin.
  • För interna kommandon eller kommandon som inte finns kommer which inte ge något svar.
  • Unix har ganska smarta namn på sina standardkommandon.

Kommandot python3¶

  1. Interaktiv användning: $ python3


  1. Skriv och kör ett skript: $ python3 filnamn
  • Side note: Vi skriver python3 för att på LiUs system så finns fortfarande en del gamla grejer som förutsätter att python pekar på Python 2.x. Så därför kör kommandot python en äldre version

Interaktiv användning¶

  • Starta en pythontolk genom att skriva python3 i terminalen.
  • Python ersätter skalprogrammet i terminalen.
  • Bra för att experimentera, testa och felsöka.
  • Avsluta genom att trycka Ctrl-D eller genom att köra python-kommandot exit().
    • Tekniskt sett så anropar vi funktionen exitutan några argument

Skriv och kör ett skript¶

  1. Starta en text-editor (t.ex. VSCode)
  2. Skriv kod och spara i en fil med exempelvis namnet hello.py.
  3. Från terminalen, kör programtolken och skicka med sökvägen till textfilen med pythonkoden som argument genom att skriva python3 hello.py
  • Bra för kod som man vill spara eller sätta i produktion.

Äntligen, dags för Python!¶

Korta videos om Python¶

Inspelade av Jody Foo som också designat den här kursen¶

https://web.microsoftstream.com/channel/5bf65e11-e261-45aa-ab27-0ec34e2b10e4¶

(mindre kort kort URL)¶

Syntax och semantik¶

"We are about to study the idea of a computational process. Computational processes are abstract beings that inhabit computers. As they evolve, processes manipulate other abstract things called data. The evolution of a process is directed by a pattern of rules called a program. People create programs to direct processes. In effect, we conjure the spirits of the computer with our spells." - Abelson and Sussman, Structure and Interpretation of Computer Programs aka The Wizard Book

  • Syntax, programmeringsspråkets grammatik, bestämmer hur vi får skriva ett program.
  • Semantik, programmets betydelse, vilken "computational process" som ett visst program uttrycker.

Några beståndsdelar i ett program¶

  • enkel sats (simple statement): fullständig instruktion (motsvarar en "mening")
  • värde (value): t.ex. ett tal eller text
  • operator (operator): token/symbol som står för en instruktion
  • uttryck (expression): ett uttryck kan beräknas till ett värde (ibland säger man även utvärderas eller evalueras istället för beräknas)
  • variabel (variable): namngiven referens till ett värde
  • nyckelord (keyword): speciellt ord som refererar till instruktioner som ska utföras
  • skiljetecken (punctuator)
  • block (block): en del av ett program som kan betraktas som en enhet
  • sammansatt sats (compound statement): en sats som kan innehålla andra satser

Enkla satser¶

enkel sats (simple statement): fullständig instruktion (motsvarar en "mening")¶

In [11]:
1
Out[11]:
1
  • En enkel sats motsvarar "en mening", dvs minsta beståndsdelen i programmeringsspråk som har betydelse.
  • Ett program består av en eller flera satser.
  • Felskriven sats → syntaxfel
  • Exempel på satser:
    • uttryck
    • tilldelningssats
    • korrekt användning av nyckelord

Värden¶

värde (value): t.ex. t.ex. ett tal eller text¶

  • I Python är alla värden objekt.
  • Alla objekt har en klass som beskriver vilken typ av värde det innehåller och hur det kan användas.
  • Mer om att skapa egna klasser under andra halvan av kursen, nu använder vi bara Pythons inbyggda klasser.


  • I många andra programmeringsspråk skiljer man på datatyp och klass men i Python är de samma sak.
In [15]:
[1, 2]
Out[15]:
[1, 2]

Klasser: heltal och flyttal¶

  • De flesta programmeringsspråk skiljer på heltal (eng. integer) och flyttal (eng. floating-point number)
    • Flyttal är det vanligaste sättet att representera decimaltal i en dator
  • Flyttal och heltal är olika klasser, float och int
In [ ]:
 
  • Flyttal skrivs i Python med decimalpunkt. Exempel: 1.0, 3.1415, -4.5
  • Heltal skrivs som vanligt. Exempel: 1, -10, 6000
  • Både flyttal och heltal kan vara antingen positiva eller negativa i Python.

Klasser: sträng och lista¶

  • En sträng, objekt av klassen str, är en sekvens av tecken som skrivs inom citationstecken.
  • En lista, objekt av klassen list, är en sekvens av andra objekt som skrivs inom hakparenteser.
In [17]:
["hej", 1]
Out[17]:
['hej', 1]
  • Både dubbla och enkla citationstecken kan användas, i en sträng startad med dubbla ciationstecken kan man använda enkla citationstecken utan att strängen slutar, och vice versa.
    • "Ada Lovelace anses vara den första programmeraren.", 'Barbara Liskov uppfann abstrakta datatyper.', "Rina Dechter hittade på termen 'deep learning'", 'Grace Hoppper hittade på termen "kompilator"'

Operatorer¶

operator (operator): token/symbol som står för en instruktion¶

Operatorer, operationer, operander?¶

  • Operatorer beskriver någon form av operation, dvs något som skall utföras.
  • En operator opererar på en eller flera operander, dvs det som något ska utföras med eller på.


  • Antalet operander som en viss operator opererar på kallas för dess aritet (eng. arity) eller ställighet, de operatorer vi är vana vid tar oftast 1 eller 2 operander, dvs har en aritet på 1 eller 2.

Matematiska operatorer¶

  • +, -, *, / : de fyra fundamentala räknesätten addition, subtraktion, multiplikation och division
  • ** : exponentiering (potens, "upphöjt till")
  • // : heltalsdivision, dvs. division med eventuella decimaler trunkerade
    • OBS: Inte vanlig avrundning men kan liknas vid att avrunda neråt till närmsta heltal
  • % : modulo (rest vid heltalsdivision)
In [23]:
1%3
Out[23]:
1

Matematiska operatorer¶

In [ ]:
 
In [3]:
print(10 + 3)
print(10 - 3)
print(10 * 3)
print(10 / 3)
10 ** 3
10 // 3
10 % 3
13
7
30
3.3333333333333335

Operatorer och operander som inte är tal¶

In [29]:
1.0+1
Out[29]:
2.0
  • Många operatorer kan användas för annat än bara matematiska operationer.
  • Operandernas klass avgör vilken operation som utförs, finns ingen giltig operation får vi ett fel
  • Exempelvis kan operatorn + användas för att konkatenera, dvs sammanfoga, strängar eller listor:
    • "hej" + "san"
    • "hej" * 2
    • "2" + 2

Uttryck¶

uttryck (expression): ett uttryck kan beräknas till ett värde (ibland säger man även utvärderas eller evalueras istället för beräknas)¶

In [ ]:
1+1
  • Allt som kan beräknas till ett värde är ett uttryck.
  • Exempel
    • användning av operatorer; 5 + 3
    • funktionsanrop; len("hejsan")
  • Varje uttryck kan stå som en självständig sats.
  • MEN, alla satser är inte uttryck

Variabler¶

variabel (variable): namngiven referens till ett värde¶

Variabler & tilldelningssatser¶

  • En variabel är en symbol som refererar till ett värde
  • Kan innehålla värden av vilken typ som helst, och skapas genom att de tilldelas ett värde.
In [35]:
hej = 1

hej = 3

hej = [1, 2]

hej
Out[35]:
[1, 2]
  • Exempel
    • x = 5
  • Värdet i högerledet tilldelas till variabeln i vänsterledet.
  • Om högerledet är ett uttryck beräknas det innan tilldelningen kan ske
    • x = 7 + 9
    • voltage = 5 * (3 + 6)

Lämpliga variabelnamn¶

  • I Python använder vi substantivlika namn på variabler
    • t.ex. value, filename, player, age
  • Ett variabelnamn skrivs med små bokstäver
  • Om ett variabelnamn innehåller flera ord används ett understreck, _, mellan orden
    • t.ex. book_title, left_panel, confirm_button
  • SHODDY VARNAMES-anekdot

Ändra värdet på existerande variabel¶

  • Vi kan skriva över värdet på en variabel genom att tilldela ett nytt värde
    • min_variabel = 10
    • min_variabel = 3
  • För att öka värdet på en variabel med $1$ skrivs
    • min_variabel = min_variabel + 1
  • Nedanstående syntax för augmented assigment kan också användas för att t.ex. öka ett värde med $3$ - min_variabel += 3
  • Motsvarande finns för samtliga matematiska operatorer, dvs.
    • +=, -=, *=, /=,

Block¶

block (block): en del av ett program som kan betraktas som en enhet¶

indentation_yes_but_no.jpg

  • Block existerar på flera nivåer och block kan innehålla andra block i flera nivåer.
  • En fil med python-kod är ett block på en relativt hög abstraktionsnivå.
  • Block avgränsas med indentering, dvs inskjutning eller indrag av texten (i Python använder vi alltid 4 mellanslag för varje nivå av indentering som definierar ett block).
  • Alla andra block är de som tillhör olika sammansatta satser.

Sammansatta satser¶

sammansatt sats (compound statement): en sats som kan innehålla andra satser¶

  • En eller flera klausuler
  • En klausul består av en huvudrad och ett tillhörande block med minst en sats
huvudrad som inleds med ett nyckelord
    sats 1
    sats 2
    ...
    sats n
  • Exempelvis funktionsdefinitioner, villkorssatser, loopar, klassdefinitioner, try-satser m.fl.
  • Nödvändig byggsten för allt annat än mycket enkla program.
  • Ibland existerar flera klausuler, t.ex. i villkorssatser, mer om det i föreläsning 2.

Funktioner¶

  • Namngivna bitar kod kod som vi kan återanvända
  • Mer generellt, en typ av subrutin, ett program i programmet
  • Vi säger att vi anropar en funktion när vi vill använda den
  • Inbyggda funktioner kontra egendefinierade funktioner

Funktioner som skapar objekt kan användas för typomvandling¶

  • T.ex. mellan olika typer av tal:
In [42]:
round(2/3)
Out[42]:
1
float(5) # Funktionen `float()` omvandlar värden till flyttal
int(3.1415) #Flyttal kan omvandlas till ett heltal genom att använda funktionen `int()`. Vid omvandlingen trunkeras alla decimaler på samma sätt som vid heltalsdivision.
int(3.9)
round(3.9) # Vill man ha avrundning används funktionen `round()`, som också kan ta emot ett andra argument för antal decimaler.
round(3.1415, 2)

Funktioner i Python har alltid returvärden¶

  • Dvs ett funktionsanrop är ett uttryck.
  • Värdet av uttrycket är värdet som funktionen returnerar.

Funktioner kan ta argument¶

  • När en funktion anropas skickar vi oftast med något eller några värden.
  • Dessa värden är argument till funktionen och påverkar på något sätt vad funktionen gör.
  • Jämför med operatorer och deras operander.

Funktioner som svarta lådor¶

  • Vi kan tänka på funktioner som svarta lådor som tar emot någonting och ger tillbaka någonting.
  • Vad de tar emot och vad de ger tillbaka är det enda vi behöver bry oss om.
    • (Tills vi kommer till funktioner med sidoeffekter men vi väntar med det.)
  • När vi använder en funktion behöver vi inte veta koden inuti ser ut.

Funktion som returnerar ett värde¶

return_hello.drawio.png

Funktionen return_hello tar inga argument och returnerar alltid strängen "hello".

In [9]:
return_hello()
Out[9]:
'hello'

Funktion som tar ett argument och returnerar ett värde¶

double_value.drawio.png

Funktionen double_value tar ett värde och returnerar det dubbla.

In [35]:
double_value(2)
Out[35]:
4

Funktion som tar två argument och returnerar ett värde¶

avg_value.drawio.png

Funktionen avg_value tar två värden och returnerar genomsnittet av dem.

In [54]:
avg_value(1, 3)
Out[54]:
2

Definiera nya funktioner¶

  • Vi definierar (skapar) egna funktioner för att
    • använda samma kod flera gånger
    • dela upp ett problem i mindre delproblem
    • göra kod lättare att läsa
  • Namngivning av funktioner
    • använd namn som beskriver vad de gör
    • använd verb-liknande namn
    • Exempel: calculate_average, get_number_of_votes

Funktioner i Python¶

  • Definition av dubbleringsfunktionen med mer bekant notation.

    • Det beräknade uttrycket är det som funktionen returnerar.
    • $f(x) = 2x$
  • I Python:

In [ ]:
 
  • Sammansatt sats, def inleder huvudraden
  • Nyckelordet return instruerar pythontolken att ett värde ska returneras.
  • Raden som börjar med return är en retursats.
    def f(x):
      return 2 * x
    

Syntax för en funktionsdefinitionssats¶

def funktionsnamn(parameter1, parameter2, ..., parameterN):
    sats1
    sats2
    sats3
    ...
  • Exempel på en sammansatt sats.
  • Nyckelordet def följt av namnet på den funktion man definierar (skapar) och en sekvens av parametrar inom parenteser och slutligen ett :.
    • När funktionen anropas binds argumententen till parametrarna.
    • Vi kan tänka att parametrarna tilldelas värdena av argumenten och det är parameternamnen vi använder för att komma åt dessa värden inne i funktionen.
  • Raderna efter :-tecknet är indenterade, dvs. indragna, med 4 mellanslag och utgör ett block.
  • Detta block kallas också funktionens kropp (eng. body).
    • Kroppen slutar på den sista raden innan vi återvänder till samma indenteringsdjup som def eller filen tar slut.

Definiera och kör (anropa) en funktion i Python¶

  • Med nyckelorden def och return samt skiljetecknet : kan vi definiera funktionen $f(x) = 2x$ i Python.
  • En funktion anropas genom att skriva funktionens namn följt av ett parentespar. Eventuella argument skrivs inom parenteserna.
  • När funktionen anropas returnerar den värdet som fås när uttrycket 2 * x beräknas.
In [57]:
# f(x) = 2x
# definierad i Python
def f(x):
    return 2 * x

# anropa funktionen, spara returvärdet i variabeln
# resultat
resultat = f(10)

Nyckelord och betydelsebärande tecken¶

  • Vissa ord har speciell betydelse i Python, t.ex.
    • def
    • return
  • Korrekt användning av nyckelord ger oss en sats.
  • Vissa tecken används på samma sätt som skiljetecken i naturligt språk. Exempel:
    • nyckelord som påbörjar ett block har ett : innan första raden på det nya blocket
    • tecknet # påbörjar en kommentar, resten av raden ses inte som Pythonkod

Funktioner utan returvärden?¶

  • I Python måste alla funktioner returnera något.
  • Måste man ha en return-sats?
  • Om funktionen avslutas utan en explicit return-sats så kommer Python automatiskt se till att funktionen returnerar None
  • None är det värde som vi använder i Python för att beteckna "inget värde"

Inbyggda funktionen print()¶

  • Skriver ut värden till terminalen
  • Returnerar inget, dvs returnerar värdet None
In [58]:
print("Hej")
x = 56
namn = "Beata"
print(namn)
print(x + 487)
Hej
Beata
543

Mer om strängar¶

Osynliga tecken¶

  • Vissa tecken är "osynliga", t.ex. tab och radbrytningar
  • För att skriva dem används följande teckenkombinationer
    • tabtecken: "\t"
    • radbrytning: "\n"

Varje tecken i en sträng har ett index¶

  • Index är heltal.
  • Numreringen börjar på 0
    • Tänk att vi börjar på "nollte" position och läser ett tecken framåt för att få ut första tecknet, osv.
  • Strängen "hejsan":
h e j s a n
0 1 2 3 4 5

Åtkomst av tecken på en viss position i en sträng¶

  • Vi kan använda följande notation för att komma åt ett tecken på en viss position i en sträng
    • my_string[index]
  • my_string[0] är det första tecknet i variabeln my_string.
  • Negativa index kan användas för att titta "bakifrån"
    • my_string[-1] ger det sista tecknet i variabeln my_string

Längden på en sträng¶

  • För att ta reda på hur många tecken en sträng innehåller kan funktionen len() användas.
  • Exempel
In [63]:
namn = "Alfred"
# tilldela variabeln namnlängd värdet som len(namn)
# returnerar
namnlängd = len(namn)
# skriv ut värdet i variabeln namnlängd
print(namnlängd)
6

Delsträngar¶

  • my_string[start:end] från index start, inkludera tecknen på alla index mindre än end
  • my_string[:end] från första tecknet, inkludera tecknen på alla index mindre än end
  • my_string[start:] alla tecken från index start till slutet av strängen
h e j s a n
0 1 2 3 4 5
In [66]:
my_string = "hejsan"
my_string[1:4]
Out[66]:
'ejs'

Ett värde som en sträng¶

  • Vi kan använda funktionen str() för att få en strängrepresentation av vilket värde som helst.
  • Exempel:
In [1]:
3+3
Out[1]:
6
In [2]:
str(3) + str(3)
Out[2]:
'33'
In [69]:
str(True)
Out[69]:
'True'

Mer om listor¶

Datatypen list¶

  • Används för att lagra en sekvens av värden (element i listan).
  • Listor är också värden, dvs en lista kan innehålla listor (som i sin tur kan innehålla listor osv)
  • Syntax:
studenter = ["Ada", "Bertil", "Cecilia"]
  • Det går bra att blanda datatyper i en lista:
diverse = [5, 3.0, "rosa", [100, 200, 300]]
  • Precis som med strängar använder vi index för att komma åt ett värde på en viss position.
  • Index för listor börjar också på 0

Del-listor¶

  • Vi kan även plocka fram delar av en lista
  • my_list[start:end] från index start, inkludera alla värden med index mindre än end
  • my_list[:end] från början, inkludera alla värden med index mindre än end
  • my_list[start:] från index start till slutet av listan
'h' 'e' 'j' 's' 'a' 'n'
0 1 2 3 4 5
In [3]:
my_list = ['h', 'e', 'j', 's', 'a', 'n']
my_list[1:4]
Out[3]:
['e', 'j', 's']

Operatorer som kan användas med listor¶

  • Operatorn + kan användas för att slå ihop två listor till en ny lista. Ordningen spelar roll!
In [4]:
frukter1 = ["äpple", "päron"]
frukter2 = ["apelsin", "banan"]
alla_frukter1 = frukter1 + frukter2
alla_frukter2 = frukter2 + frukter1
In [5]:
print(alla_frukter1)
['äpple', 'päron', 'apelsin', 'banan']
In [6]:
print(alla_frukter2)
['apelsin', 'banan', 'äpple', 'päron']

Ändra på ett värde i en lista¶

  • Vi kan ändra värdet på en viss position i en lista med en tilldelningssats:
In [7]:
values = [1, 2, 3, 4]
print(values)
[1, 2, 3, 4]
In [9]:
# ändra värde på index 2
values[2] = "hoppsan"
print(values)
[1, 2, 'hoppsan', 4]

Lägga till nytt värde till slutet på en lista¶

In [10]:
frukter = ["apelsin"]
print(frukter)
['apelsin']
In [11]:
frukter = frukter + ["banan"]
print(frukter)
['apelsin', 'banan']

Lägga till nytt värde till början på en lista¶

In [12]:
frukter = ["apelsin"]
print(frukter)
['apelsin']
In [13]:
frukter = ["banan"] + frukter
print(frukter)
['banan', 'apelsin']

Metoden list.append()¶

  • Användning av operatorn + med listor ändrar inte på operanderna
    • nedanstående uttryck kommer beräknas, men resultatet sparas inte
In [15]:
characters1 = ["a", "b", "c"]
characters1 + ["d"]
print(characters1)
['a', 'b', 'c']
  • Metoder är ett slags funktioner som man hänger på ett objekt med hjälp av punktnotation
    • Mer om metoder i Tema 4-6
  • Metoden list.append(value) lägger till value till en lista
In [16]:
tcharacters1.append("d")
print(characters1)t
['a', 'b', 'c', 'd']

Moduler¶

Moduler¶

  • Specialiserade funktioner m.m. kan göras tillgängliga t.ex. genom att importera moduler i sin Python-kod.
  • Varje fil med Python-kod kan användas som en modul.
  • Det finns ett antal moduler som ingår i Pythons så kallade standardbibliotek (Python Standard Library).
    • Moduler i standardbiblioteket finns alltid tillgängliga i alla Python-installationer utan att behöva installera något extra.

Moduler¶

  • Tillhandahåller ytterligare funktionalitet, t.ex. funktioner för speciella tillämpningar
  • Exempel på moduler som följer med Python
    • random: har t.ex. funktioner som returnerar slumpvärden
    • sys: funktioner m.m. som har med systemet att göra (lägre abstraktionsnivå)
    • os: funktioner m.m. som har med operativsystemet att göra (högre abstraktionsnivå)

Import av modul och exempel på användning¶

  • För att få tillgång till en modul behöver den importeras med en import-sats, som oftast inleds med nyckelordet import.
  • Standard är att lägga alla importsatser i början av textfilen.
In [17]:
import random
# funktionen random() i modulen random returnerar ett slumpmässigt
# flyttal mellan 0.0 och 1.0
slumpvärde1 = random.random()
print(slumpvärde1)
0.11297619324484309
In [18]:
# funktionen randint(heltal1, heltal2) i modulen random returnerar ett
# slumpmässigt heltal från heltal1 till och med heltal2.
slumpvärde2 = random.randint(10, 90)
print(slumpvärde2)
72

Import, namnrymder, punktnotation¶

  • import random
  • Ovanstående laddar in innehållet i modulen random och ser till att det hamnar i namnrymden random
  • Funktionen randint(heltal1, heltal2) i modulen random kommer man då åt genom att skriva
random.randint(heltal1, heltal2)
In [19]:
# import-exempel 1
import random

list_of_names = ["Ada", "Bea", "Cecilia", "Dolores"]

def random_greeting1(names):
    # random.choice() väljer ut ett slumpmässigt element från
    # en sekvens
    name = random.choice(names)
    print("Hello " + name + "!")
    
def random_greeting2(names):
    # random.randint() slumpar fram ett heltal från ett slutet
    # intervall
    random_index = random.randint(0, len(names)-1)
    print("Hello " + names[random_index] + "!")
In [46]:
random_greeting1(list_of_names)
Hello Ada!
In [49]:
random_greeting2(list_of_names)
Hello Cecilia!
In [50]:
#import-exempel 2

from random import *

list_of_names = ["Ada", "Bea", "Cecilia", "Dolores"]

def random_greeting1(names):
    # choice() från modulen random väljer ut ett slumpmässigt
    # element från en sekvens
    name = choice(names)
    print("Hello " + name + "!")

def random_greeting2(names):
    # randint() från modulen random slumpar fram ett heltal från
    # ett slutet intervall
    random_index = randint(0, len(names)-1)
    print("Hello " + names[random_index] + "!")
In [46]:
random_greeting1(list_of_names)
Hello Ada!
In [49]:
random_greeting2(list_of_names)
Hello Cecilia!
In [ ]: