Imperativ och Funktionell Programmering i Python …TDDD73/info/2015/fo1-ht2015.pdf · • Du ska...

26
2015-08-31 1 Imperativ och Funktionell Programmering i Python #TDDD73 Fredrik Heintz, IDA [email protected] @FredrikHeintz Mål med föreläsningen 2015-08-31 Fredrik Heintz, Fö1 #TDDD73 Du ska bli grymt inspirerad att lära dig programmera! Du ska känna till och förstå målen och upplägget med kursen. Du ska känna till och förstå kopplingen mellan TDDC66, TDDD73, TDDD63 och TATA65. Du ska ha sett ett Python-program och känna till den grundläggande terminologin. Du ska vara medveten om att det krävs mycket arbete att bli bra programmerare!

Transcript of Imperativ och Funktionell Programmering i Python …TDDD73/info/2015/fo1-ht2015.pdf · • Du ska...

2015-08-31

1

Imperativ och FunktionellProgrammering i Python#TDDD73Fredrik Heintz, [email protected]@FredrikHeintz

Mål med föreläsningen

2015-08-31Fredrik Heintz, Fö1 #TDDD73

• Du ska bli grymt inspirerad att lära dig programmera!

• Du ska känna till och förstå målen och upplägget med kursen.

• Du ska känna till och förstå kopplingen mellan TDDC66, TDDD73,TDDD63 och TATA65.

• Du ska ha sett ett Python-program och känna till den grundläggandeterminologin.

• Du ska vara medveten om att det krävs mycket arbete att bli braprogrammerare!

2015-08-31

2

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Autonoma farkoster på IDA

2015-08-31Fredrik Heintz, Fö1 #TDDD73

• 245kLOC header filer,• 875kLOC C++,• 600kLOC C,• 300kLOC java,• 150kLOC python• Totalt mer än 2 millioner rader kod

2015-08-31

3

Världen är beroende av mjukvara!

2015-08-31Fredrik Heintz, Fö1 #TDDD73

De som verkligen förstår ochkan utnyttja mjukvaruteknik

äger framtiden

Vem riktar sig kursen till?

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Hur mycket kan jag om programmering redan?

Hjälp!Jag fattar noll!

Rädda mig!Ska man tryckapå Enter nu?!

Hur svårtkan det vara?

Det är mig Google ringernär de har problem.

2015-08-31

4

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Hur långt kommer vi i den här kursen?

2015-08-31

5

Kursmål enligt kursplanen• Efter avslutad kurs ska du kunna:

– redogöra för grundläggande datavetenskapliga begrepp relaterade tillprogrammering och programspråk

– konstruera program i Python

– metodiskt lösa programmeringsrelaterade problem med hjälp av ettinteraktivt arbetssätt med implementering, testning och felsökning

– formulera och implementera rekursiva och iterativa algoritmer

– konstruera abstraktioner med varierande grad av stöd i detunderliggande språket

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Några roliga saker vi inte hinner med• Hur man designar grafiska gränssnitt

• Hur datorer kommunicerar med varandra över nätverk

• Hur man lagrar information i databaser

• Hur man startar processer för att få saker att hända samtidigt

• Hur man hanterar större programmeringsprojekt

• Hur man gör appar

Vi kommer att fokusera på grunderna i programmering ochhur man etablerar goda vanor för att bli en bra programmerare.Allt det andra – och mycket mer – kommer längre fram.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

6

Vad är ett program och vad är programmering?

Programmering i ett nötskalprogram en uppsättning regler eller instruktioner med uppgift att styraen dators beräkningar (Nationalencyklopedin NE)programmering skrivande av instruktioner för en dators arbete (NE)

komponenternaprogramspråket ochdess konstruktioner

processenprinciper för hur man

utformar program

resultatethur program körs ochhur de påverkar folk

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

7

Programutvecklingsprocessen

Implementation Översätt designen till ett datorprogram!

Testning Prova programmet och rätta eventuella fel!

Underhåll Fortsätt utveckla programmet vid behov!

Analys Förstå vilket problem som ska lösas!

Specifikation Beskriv vad programmet ska göra!

Design Beskriv hur programmet ska lösa problemet!

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Datalogiskt tänkande

2015-08-31Fredrik Heintz, Fö1 #TDDD73

• Computational Thinking

• Data + logik + tänkande

• En problemlösningprocess för attbeskriva, analysera och lösa problempå ett sätt så att datorer kan hjälpa till

– Bryta ner problem i delar

– Hitta mönster

– Skapa abstraktioner

– Designa algoritmer

2015-08-31

8

Datalogiskt tänkande>

Programmering>

Kodning

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Hur lär man sig att programmera?

2015-08-31

9

Enligt Peter Norvig, forskningschef på Google• Bli intresserad av programmering, så att du orkar lägga ner 10000

timmar på träning.• Skriv många olika program.• Prata med andra programmerare och läs deras kod.• Om du vill, läs på universitet.• Arbeta i projekt tillsammans med andra programmerare.• Ta över projekt efter andra programmerare.• Lär dig åtminstone ett halvt dussin olika programmeringsspråk.

Peter Norvig (2001) Teach Yourself Programming in Ten Years. http://norvig.com/21-days.html

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Varför har vi valt programspråket Python?

2015-08-31

10

Pythons historik• Skapades i slutet av 1980-talet av holländaren Guido van Rossum, som

fortfarande spelar en stor roll för språkets utveckling.

• Det femte mest populära programspråket i världen. [1]

• Åtta av tio toppuniversitet i USA använder Python som förstaspråk. [2]

• Version 3.0, som vi kommer använda, kom i december 2008. Det var enganska stor förändring som inte är bakåtkompatibel.

• Fri programvara.[1] TIOBE Programming Community Index, augusti 2015http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html[2] IT World, 8 juli 2014http://www.itworld.com/software/426242/python-bumps-java-top-learning-language

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Fördelar med Python• Lätt att komma igång med. Enklare syntax än t.ex. Java och C++.

• Har en stabil användarbas både på universitet och i industrin.

• Funkar bra både för systemprogram och för tillämpningar.

• Neutralt i förhållande till olika programmeringsparadigm.

• Kan användas för att illustrera koncept inom programmering.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

11

Kursupplägg

Traditionell programmeringskurs

2015-08-31Fredrik Heintz, Fö1 #TDDD73

print("Hello")

1

Föreläsare

Student Labbass

2015-08-31

12

Student

Lärare

Yadayada

?

Labbass

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Upplägg för Python

Aktivitet Tid i HT1 InnehållFöreläsningar 2 h Introduktion och översiktSeminarier 16 h Torrövningar samt diskussioner utifrån övningarnaLaborationer 26 h Arbete i datorsal med övningar och uppgifter, diskussionerEget arbete 68 h Läsa, öva, experiementera, arbeta med övningar och uppgifter

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Inlärning kräver aktivitet. Föreläsningar är huvudsakligen passiva.Därför är föreläsningarna ersatta med studiematerial samt seminarier.

Detta kräver att DU förbereder dig genom att studeramaterialet på egen hand INNAN seminarierna.

2015-08-31

13

TDDD73Funktionell ochimperativprogrammeringi Python

TDDC66Datorsystem ochprogrammering

ExaminationWebbaserad datorintroduktionSlutuppgiftProva på-laborationer

Laborationsomgång 1-2

Laborationsomgång 3-7

Datortentamen

UPG1

LAB1

LAB1

DAT1

Förstaläsperioden

Första och andraläsperioden

Python

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Tillåtet och otillåtet samarbete• Allt arbete med examinerande uppgifter i kursen TDDC66 Datorsystem

och programmering ska ske enskilt (förutom prova på-laborationernadär arbetet sker i par).

• I kursen TDDD73 Funktionell och imperativ programmering i Python(d.v.s. i praktiken från labbomgång 3) kommer ni att arbeta i par som nisjälva får välja.

• Vad är enskilt arbete? Var går gränsen för fusk?

• Universitetets disciplinnämnd kan vid fusk stänga av studenter upp tillsex månader, vilket innebär att man ej får delta i undervisning och intefår några studiemedel.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

14

Kurslitteratur• John M. Zelle (2010) Python Programming:

An Introduction to Computer Science. SecondEdition. ISBN 978-1-59028-241-0

• Boken har ett bra pedagogiskt upplägg somansluter väl till det vi vill göra i kursen.

• Den täcker dock inte allt som vi vill gåigenom, så läs studiematerialet!

• Om man skaffar en annan Python-bok, se tillatt den täcker Python 3!

• På tentan får ni ha med en publicerad bok.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Personal• Examinator: Fredrik Heintz

• Studierektor: Peter Dalenius

• Kursadministratör: Anna Grabska Eklund

• Lektions- och laborationsassistenter:– D1a: Fredrik Bergstrand, Sara Bergman

– D1b: Henning Nåbo, Anders Märak Leffler

– D1c: Simon Lindblad, Emil Segerbäck

– U1: Fredrik Heintz, Erik Hansson, Viktor Holmgren

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

15

Information och kommunikation• På kurswebben finns all information om kursen du behöver:

http://www.ida.liu.se/~TDDD73

– Studiematerial– Laborationsmaterial– Länk till schema– Planering och deadlines– Regler för redovisning och komplettering– m.m.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Förhållande mellan övriga kurser under termin 1

2015-08-31Fredrik Heintz, Fö1 #TDDD73

TDDC66 Datorsystem ochprogrammering TDDD73 Imperativ och funktionell programmering i Python

TDDD63 Perspektiv på datateknik/datavetenskap

TATA65 Diskret matematik TDDD72 Logik (bara U)

2015-08-31

16

Introduktion till Python ochprogrammeringsterminologi

Hur man startar Python-interpretatorn

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

17

Hur man använder Python-interpretatorn>>> 2+3

5

>>> 2+4*5-6

16

>>> print("Hello world!")

Hello world!

>>> def greeting():

... print(”Nobody expects the Spanish Inquisition.")

... print(”Our chief weapon is surprise... and fear.")

...

>>> greeting()

Nobody expects the Spanish Inquisition.

Our chief weapon is surprise... and fear.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Hur man använder Python-interpretatorn>>> def skryt(namn):

... print("Det är bra att kunna Python.")

... print(namn, "är jättebra på Python.")

...

>>> skryt("Peter")

Det är bra att kunna Python.

Peter är jättebra på Python.

>>> skryt("Jenny")

Det är bra att kunna Python.

Jenny är jättebra på Python.

>>>>>> skryt

<function skryt at 0x218390>

>>> print

<built-in function print>

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

18

Vårt första Python-program

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Vad gör programmet?

def find_root():

print("This program tries to find the square root of a number.")

x = eval(input("Enter a number: "))

guess = x/2

for i in range(5):

guess = (guess + x/guess)/2

print(guess)

find_root()

1. Skriv ut liteinformativ text

2. Läs in en rad frånanvändaren, försöktolka vad som matadesin och spara detta ivariabeln x

3. Börja gissa attroten ur x är x/2 ochspara gissningen ivariabeln guess

4. Upprepa deföljande raderna5 gånger

5. Räkna uten ny bättregissning ochskriv ut den

Newton-Raphsons metod för atträkna ut kvadratroten av ett tal x.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

19

Varför så mycket mellanrum?

def find_root():

print("This program tries to find the square root of a number.")

x = eval(input("Enter a number: "))

guess = x/2

for i in range(5):

guess = (guess + x/guess)/2

print(guess)

find_root()

Newton-Raphsons metod för atträkna ut kvadratroten av ett tal x.

Underordnaderader måste skjutasin en bit på raden,indenteras.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Olika sätt att köra vårt programzaza4 <23>zaza4 <23> python3 newton.pyzaza4 <23> python3 newton.py

This program tries to find the square root of a number.

Enter a number:

zaza4 <23> python3 newton.py

This program tries to find the square root of a number.

Enter a number: 2

zaza4 <23> python3 newton.py

This program tries to find the square root of a number.

Enter a number: 2

1.5

1.4166666666666665

1.4142156862745097

1.4142135623746899

1.414213562373095

zaza4 <24>

zaza4 <23> python3 newton.py

This program tries to find the square root of a number.

Enter a number: 2

1.5

1.4166666666666665

1.4142156862745097

1.4142135623746899

1.414213562373095

zaza4 <24> python3

zaza4 <23> python3 newton.py

This program tries to find the square root of a number.

Enter a number: 2

1.5

1.4166666666666665

1.4142156862745097

1.4142135623746899

1.414213562373095

zaza4 <24> python3

Python 3.2.2 (default, Mar 7 2012, 13:44:00)

[GCC 3.4.6] on sunos5

Type "help", "copyright", "credits" or "license" for more

information.

>>>

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

20

Hur man använder Python-interpretatorn>>> import newton

This program tries to find the square root of a number.

Enter a number: 2

1.5

1.4166666666666665

1.4142156862745097

1.4142135623746899

1.414213562373095

>>> newton.find_root()

This program tries to find the square root of a number.

Enter a number: 10

3.5

3.178571428571429

3.162319422150883

3.1622776604441363

3.162277660168379

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Hur man använder Python-interpretatorn>>>>>> from newton import *>>> from newton import *

This program tries to find the square root of a number.

Enter a number:

>>> from newton import *

This program tries to find the square root of a number.

Enter a number: 3

>>> from newton import *

This program tries to find the square root of a number.

Enter a number: 3

1.75

1.7321428571428572

1.7320508100147274

1.7320508075688772

1.7320508075688772

>>>

>>> from newton import *

This program tries to find the square root of a number.

Enter a number: 3

1.75

1.7321428571428572

1.7320508100147274

1.7320508075688772

1.7320508075688772

>>> find_root()

>>> from newton import *

This program tries to find the square root of a number.

Enter a number: 3

1.75

1.7321428571428572

1.7320508100147274

1.7320508075688772

1.7320508075688772

>>> find_root()

This program tries to find the square root of a number.

Enter a number:

>>> from newton import *

This program tries to find the square root of a number.

Enter a number: 3

1.75

1.7321428571428572

1.7320508100147274

1.7320508075688772

1.7320508075688772

>>> find_root()

This program tries to find the square root of a number.

Enter a number: 5

>>> from newton import *

This program tries to find the square root of a number.

Enter a number: 3

1.75

1.7321428571428572

1.7320508100147274

1.7320508075688772

1.7320508075688772

>>> find_root()

This program tries to find the square root of a number.

Enter a number: 5

2.25

2.236111111111111

2.2360679779158037

2.23606797749979

2.23606797749979

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

21

Två viktiga byggstenar

print("Hello")

x = x + 3

a + b/2

square(y + 7)

Satser gör något.

Uttryck har ett värde.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Imperativ och funktionell programmering• Imperativ programmering

– Ett program är en följd av satser som manipulerar globaladatastrukturer så att deras tillstånd förändras över tid.

• Funktionell programmering

– Ett program är en uppsättning funktioner vars utdata enbart berorav indata, d.v.s. de har inga sidoeffekter och manipulerar integlobala datastrukturer.

• Objektorienterad programmering

– Ett program är en uppsättning objekt som har vissa egenskaper ochkan utföra vissa metoder. Programkörning innebär attmeddelanden skickas mellan dessa objekt.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

22

Satser – ryggraden i ett program• Ett Python-program består av ett antal satser (eng. statements) som

utförs i tur och ordning. De är huvudsakligen imperativa.Vi ska titta på de fem viktigaste, där vi redan sett de fyra första:

• Enkla satser

– Tilldelning (eng. assignment)– Funktionsanrop

• Sammansatta satser

– Iteration med for

– Funktionsdefinition– Selektion med if

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Olika typer av satser: Tilldelning

def find_root():

print("This program tries to find the square root of a number.")

x = eval(input("Enter a number: "))

guess = x/2

for i in range(5):

guess = (guess + x/guess)/2

print(guess)

find_root()

Hur ser det ut? namn = uttryckVad händer? Uttrycket beräknas och resultatet sparas i den namngivna variabeln.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

23

Olika typer av satser: Funktionsanrop

def find_root():

print("This program tries to find the square root of a number.")

x = eval(input("Enter a number: "))

guess = x/2

for i in range(5):

guess = (guess + x/guess)/2

print(guess)

find_root()

Hur ser det ut? funktionsnamn(frivilliga argument)Vad händer? Argumenten skickas till funktionen, underprogrammet, för behandling.

Funktionsanrop som inte är självständiga satser

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Olika typer av satser: Iteration med for

def find_root():

print("This program tries to find the square root of a number.")

x = eval(input("Enter a number: "))

guess = x/2

for i in range(5):

guess = (guess + x/guess)/2

print(guess)

find_root()

Hur ser det ut? for namn in område: undersatserVad händer? Undersatserna körs så många gånger som området specificerar.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

24

Olika typer av satser: Funktionsdefinitioner

def find_root():

print("This program tries to find the square root of a number.")

x = eval(input("Enter a number: "))

guess = x/2

for i in range(5):

guess = (guess + x/guess)/2

print(guess)

find_root()

Hur ser det ut? def funktionsamn(frivilliga argument): undersatserVad händer? Undersatserna sparas för att kunna anropas senare.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Olika typer av satser: Selektion

if a > 0:

print(“positivt")

Enkelt val

if a > 0:

print(“positivt")

else:

print(“negativt")

Två alternativ

if 0 <= a < 10:

print("ental")

elif a < 0:

print("negativt")

else:

print("tio eller mer")

Tre eller fler alternativ

2015-08-31Fredrik Heintz, Fö1 #TDDD73

2015-08-31

25

Inför första laborationstillfället• Ta reda på vilken labbgrupp du är med i (se kurswebben).

• Ta reda på när den labbgruppen har sitt första labbtillfälle(se schemat).

• Dyk upp på rätt plats i rätt tid. Våra laborationer brukar börja kvartöver. De flesta har sin första laboration på onsdag, några redan imorgon.

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Mål med föreläsningen

2015-08-31Fredrik Heintz, Fö1 #TDDD73

• Du ska bli grymt inspirerad att lära dig programmera!

• Du ska känna till och förstå målen och upplägget med kursen.

• Du ska känna till och förstå kopplingen mellan TDDC66, TDDD73,TDDD63 och TATA65.

• Du ska ha sett ett Python-program och känna till den grundläggandeterminologin.

• Du ska vara medveten om att det krävs mycket arbete att bli braprogrammerare!

2015-08-31

26

2015-08-31Fredrik Heintz, Fö1 #TDDD73

Glöm aldrig!

Imperativ och FunktionellProgrammering i Python#TDDD73Fredrik Heintz, [email protected]@FredrikHeintz