729G46 Informationsteknologi och programmering
Tema 4. Föreläsning 1
Jody Foo, jody.foo@liu.se
Föreläsningsöversikt (4.1-4.2)
⁃ Om Tema 4-6
⁃ Datalogiskt tänkande (Computational Thinking)
⁃ Algoritmer
⁃ Komplexitet
⁃ Objektorienterad programmering i praktiken
terminologi
använda objekt
⁃ Programmeringsmetod
Tema 4-6
Temaupplägg, Tema 4-6
⁃ Uppgifterna i varje tema bygger på varandra
⁃ Temauppgift: algoritmisk tillämpning av ny syntax och begrepp
⁃ Lektion i Teams inför temauppgift
⁃ Algoritmseminarium: Genomgång och diskussion av temauppgiften i grupp
⁃ Algoritmrapport: Skriftlig behandling av aspekter av temauppgiften.
Examination: resultat på delmoment
⁃ LAB2. 4,5hp: Temauppgift 4-6
⁃ EXA2. 1,5hp: Algoritmseminarier och algoritmrapporter
⁃ För betyget Godkänd på LAB2 ska alla temauppgifter vara OK/
genomförda på G-nivå.
⁃ För betyget Väl godkänd på LAB2 krävs två temauppgifter på plus-nivå.
⁃ För betyget Godkänd på EXA2 ska alla algoritmseminarier och algoritmrapporter vara inlämnade och godkända.
⁃ För betyget Väl godkänd på EXA2 ska minst två av algoritmrapporterna vara godkända på guldnivå och ingen av rapporterna godkända på
bronsnivå.
⁃ För VG på kursen: VG på LAB1, LAB2 och EXA2
Övergripande läromål för varje tema
⁃ Algoritmiskt tänkande: prova på och förstå, några algoritmer inom en viss domän.
⁃ Programmering:
Objektorienterad modellering och design syntax i Python
programmeringsmetod (implementation, testning, felsökning)
Tema 4-6
⁃ Tema 4: Sorteringalgoritmer och objekt
Introduktion till algoritmiskt tänkande och objektorientering Sorteringsalgoritmer
⁃ Tema 5: Grafiska gränssnitt och layout
Introduktion till GUI-programmering Algoritm för layout
⁃ Tema 6: Eget program att-göra-program
Objektorienterad design
Grupper
⁃ Anmäl er till en pargrupp precis som tidigare!
⁃ En tredje gruppmedlem
Lektion nästa vecka
⁃ Kanal för lektionstillfällen
⁃ Vi börjar i mötet som heter "Gemensamt möte"
⁃ Efteråt ansluter ni till möten som finns för varje seminariegrupp
Kort om uppdelning av kod i
funktioner
Funktioner: ta in argument, returnera resultat
⁃ Dåliga mönster
att använda globala variabler
koppla ihop funktioner "i onödan" - alla funktioner sitter ihop i en lång kedja;
a b c d
⁃ Ovanstående är inte skrivna i sten!
Funktioner: ta in argument, returnera resultat
⁃ Bra mönster
ta emot information som behövs som argument returnera resultat
huvudfunktion som kopplar ihop underfunktioner a
b c d
⁃ Ovanstående är inte skrivna i sten!
Datalogiskt tänkande
computational thinking
Datalogiskt tänkande
⁃ Problemlösningsprocess för att beskriva, analysera och lösa problem på ett sätt så att datorer kan hjälpa till, t.ex.
Bryta ner komplexa problem i mindre delar (dekomposition) Hitta mönster och utnyttja dessa
Skapa algoritmer för att automatisera lösningen av problem Representera data genom abstraktioner som modeller och simuleringar
Identifiera, analysera och implementera möjliga lösningar
Generalisera och överföra problemlösningsprocessen på andra typer av problem
⁃ Träna på datalogiskt tänkande genom programmering
Färdigheter
⁃ vana vid att hantera komplexitet
⁃ uthållighet vid arbete med svåra/stora problem
⁃ tolerans för tvetydighet/osäkerhet
⁃ förmåga att hantera öppna problemställningar (hitta gränser, begränsningar)
⁃ förmåga att kommunicera och samarbeta med andra för att komma fram till en gemensam lösning
Algoritmer
Vad är en algorithm?
⁃ Informellt: en väldefinierad beräkningsbar (computational) procedur som givet ett värde, eller en mängd värden som input producerar ett värde, eller en mängd värden som output. (Cormen et. al. 2009. Introduction to algorithms)
⁃ En algoritm är en metod som, givet ett väldefinierat
utgångsläge, löser ett problem genom att ett ändligt antal elementära och väldefinierade operationer tillämpas i en förskriven ordning. (Lunell. 2011. Datorn i världen, världen i datorn)
⁃ En algoritm sägs vara korrekt om det för varje indata, avslutar med korrekt utdata.
Vad är algoritmiskt tänkande?
⁃ Ett sätt att analysera och angripa problem.
⁃ Att gå från ett icke väldefinierat problem till ett väldefinierat problem.
⁃ Bryta ner problemet.
⁃ Se mönster.
Vad har detta för relevans för en kognitionsvetare?
⁃ Att bryta ner ett problem är en viktig komponent i att förstå en domän.
⁃ Detta är en färdighet som vi tillämpar när vi
gör kvalitativ analys skapar modeller
programmerar skriver rapporter
⁃ Inom programmering har vi möjlighet att implementera vår lösning och testa den på med korta iterationer.
När blir det en algoritm?
⁃ Input: Vad är indata? Vad vet vi? Vad behöver vi veta? Hur representerar vi data?
⁃ Formulera problemet: Gör problemet väldefinierat: För vilka input vill vi kunna komma fram till en lösning? Vilka är
normalfallen?
⁃ Output: Hur ser en lösning ut? Vad är en korrekt lösning?
Finns flera korrekta lösningar? Finns det en bästa lösning?
⁃ Formulera lösningen: Gör lösningen väldefinierad. Hur vet vi att något är en lösning?
Komplexitet
Komplexitet
⁃ Hur mycket behöver datorn göra? Hur komplicerat är det att lösa detta problem, med den här algoritmen?
⁃ Exempel, for-loop, leta efter största elementet
Hur många operationer behöver algoritmen?
def get_max_value(values):
max_value = values[0]
for value in values:
if value > max_value:
max_value = value return max_value
Komplexitet
⁃ Antal operationer är proportionerligt mot len(values)
⁃ Ordo-notation (Big O notation)
⁃ För nedanstående funktion:
O(n), där n är storleken på input
def get_max_value(values):
max_value = values[0]
for value in values:
# Ju större len(values) är, desto mindre påverkar # spelar antalet operationer i for-loopen roll.
if value > max_value:
max_value = value return max_value
Komplexitet, nästlade loopar
⁃ Antalet par-kombinationer man kan bilda givet n värden
⁃ [ 1, 2, 3 ... n ]
def get_pairs(values) pairs = []
for v1 in values:
for v2 in values:
pairs.append(str(v1) + ":" + str(v2)) return pairs
⁃ O(n2)
Komplexitet i stigande ordning
⁃ O(1): konstant
⁃ O(log n): logaritmisk
⁃ O(n): linjär
⁃ O(n2): kvadratisk
⁃ O(n3): kubisk
⁃ O(2n): exponentiell
Komplexitet
Sorting out sorting
https://www.youtube.com/watch?v=SJwEwA5gOkM
Objektorienterad
programmering
Programmeringsparadigm
⁃ Funktionell programmering
⁃ Procedurell programmering
⁃ Logikprogrammering
⁃ Objektorienterad programmering
Objektorienterad programmering
⁃ Ett alternativ till att använda funktioner för att strukturera kod: Objekt istället för abstrakt datatyp
⁃ Bättre sätt att organisera större projekt - återanvändning
⁃ C++, Objective-C, C# och Java är exempel på andra OO programmeringsspråk
Objektorienterad programmering (OOP)
⁃ Objekt är i fokus jämfört med funktioner i fokus som vid funktionell programmering.
⁃ Man försöker relatera data och metoder till objekt.
⁃ Både data och metoder kan "ägas"/tillhöra objekt (inkapsling)
⁃ Objekt, dess egenskaper och beteenden (vad objektet kan göra och vad man kan göra med objektet).
I objektorienterad programmering
Klass
Variabel/Referens Objekt
Klasser jmf med objekt
⁃ En klass är en mall, en beskrivning av något som kan finnas i världen.
⁃ En klass beskriver vilka egenskaper (variabler) klassen har och vilka beteenden (metoder) den har.
⁃ Det som finns i världen är instanser av klasser, även kallade för objekt.
En klass är en mall som
används för att skapa ett objekt.
Objekt kallas också för
instanser.
Objekt är instanser av klasser
Varför skriva objektorienterad
kod?
Varför skriva objektorienterad kod?
⁃ Många problem kan modelleras i termer av objekt.
⁃ Att tillämpa objektorienterade principer är ett sätt att främja skrivandet av kod som i bästa fall underlättar
återanvändbarhet underhåll
läsbarhet felsökning
⁃ Inget av ovanstående är garanterat.
⁃ Vi kan skriva objektorienterad kod som är svår att återanvända, svår att underhåll, svår att läsa etc.
Hur ser ett objektorienterat
program ut?
Ett objektorienterat program
⁃ Modellerar komponenter som klasser
⁃ Programmet
skapar instanser av klasserna
beskriver hur instanserna ska interagera med varandra
⁃ Standard att använda UML (Unified Modeling Language) för att beskriva objektorienterade diagram (t.ex. med
klassdiagram)
Exempel på klassdiagram (UML) för
ett schackspel
Exempel på klassdiagram (UML) för
ett alfapetspel
Python som objektorienterat
språk
Objektorientering i Python
⁃ Alla värden i python är objekt
⁃ Till och med funktioner är objekt
⁃ En stor del av enkelheten att använda Python beror på att det finns ett stort utbud av standardiserade beteenden som
klasser kan implementera.
⁃ T.ex.
för att kunna översätta ett objekt till en behöver dess klass implementera metoden object.__str__()
för att använda "index"-syntax på ett objekt behöver dess klass implementera metoden object.__getitem__()
Ni har redan använt objekt...
# en lista är ett objekt lista1 = []
# Ett objekt har metoder som man meddelar att man vill köra genom
# att använda punktnotation. Vad händer egentligen nedan?
lista1.append("en sträng")
Ni har redan använt objekt...
# en lista är ett objekt
a_string = "visst är python roligt!"
# Ett objekt har metoder som man meddelar att man vill köra genom
# att använda punktnotation. Vad händer egentligen nedan?
print(a_string.upper())
Exempel
⁃ RSS-flöden: nyheter, podcasts m.m.
⁃ Data i XML, t.ex.
https://insidan.liu.se/nyhetsarkiv/?format=rss&l=sv https://corren.se/rss/lokalt/linkoping
⁃ feedparser, ett Python-paket gjort för hantering av RSS- strömmar
https://github.com/kurtmckee/feedparser https://feedparser.readthedocs.io/en/latest/
Beter sig som ett dictionary.
Enkelt program som visar senaste nyheterna
#!/usr/bin/env python3 import feedparser
from time import strftime
feed = feedparser.parse("https://corren.se/rss/lokalt/linkoping")
# loopa igenom de 5 senaste nyheterna for entry in feed.entries[:5]:
# skriv ut nyheten
pub_time = strftime("kl. %H:%M", entry.published_parsed) print(f"* {pub_time}: {entry.title} [{entry.link}]")
Vad är en klass?
Objekt, dess egenskaper och beteenden
klassens namn
variabler
metoder
Klassdiagram i UML
Unified Modelling Language
Klassnamn
namn : attributtyp
namn : attributtyp = defaultvärde operation()
operation() : returdatatyp operation(parameterlista)
operation(parameterlista) : returdatatyp
Exempel
trial : str
image_file : str time : int
correct_answer : str subjects_answer : str degrees_rotated : int
DataRow
get_error_type() : int
Exempel på definition och
användning av en klass
Klassen Dog
Definition av en klass
class Dog(object):
def __init__(self, namev):
self.name = namev self.age = 0
def talk(self):
print("Voff, jag heter " + self.name)
Skapa ett objekt: instantiera en klass
⁃ Inbyggda klasser, t.ex. listor och dictionaries har "syntaktiskt socker".
a_list = []
a_list = list() a_dict = {}
a_dict = dict()
⁃ För egna klasser använder vi dess namn följt av parenteser (och eventuella argument). T.ex.
dog = Dog("Fido")
Vad händer när vi skapar en instans av en klass?
⁃ Skapa instans av klass: Klassnamn(arg1, arg2 ... argn)
⁃ Python skapar ett objekt och kör klassens __init__()- metod
⁃ Objektet som skapats skickas som det första argumentet till
__init__().
⁃ Argument som skickats med vid anrop av klassnamnet skickas vidare till __init__() efter self.
Vi skapar några hundar
class Dog(object):
def __init__(self, namev):
self.name = namev self.age = 0
def talk(self):
print("Voff, jag heter " + self.name) hund1 = Dog("Pluto")
hund2 = Dog("Lassie")
Hund
name: "Pluto"
age: 0
talk
Hund
name: "Lassie"
age: 0
talk
hund1
hund2
Punktnotation
⁃ Vi har tidigare använt punktnotation för att komma åt en funktion från en modul. T.ex.
random.random()
⁃ Vi använder även punktnotation för att komma åt variabler och metoder för ett objekt:
objekt.variabel objekt.metod()
⁃ Exempel
a = [1, 2, 3]
a.append(4) s = "hejsan"
s.upper()
Testar hundarna
class Dog(object):
def __init__(self, namev):
self.name = namev self.age = 0
def talk(self):
print("Voff, jag heter " + self.name) hund1 = Dog("Pluto")
hund2 = Dog("Lassie") print(hund1.age)
print(hund1.name) hund1.talk()
print(hund2.age) print(hund2.name) hund2.talk()
Ändra värden
hund1.age = 4 hund2.age = 8
Hund
name: "Pluto"
age: 4
talk
Hund
name: "Lassie"
age: 8
talk