510 likes | 727 Views
Introduktion til programmering. Uge 40 Python 2 Learning Python, kap 8-12 . Plan. Opsamling ER-diagrammer og SQL Sidste gang Sætninger og udtryk Kontrolstrukturer Selektion If…: Gentagelse While …: For …: Øvelse 1 Funktioner Stand-up programmering Dokumentation Øvelse 2.
E N D
Introduktion til programmering Uge 40 Python 2 Learning Python, kap 8-12.
Plan • Opsamling ER-diagrammer og SQL • Sidste gang • Sætninger og udtryk • Kontrolstrukturer • Selektion • If…: • Gentagelse • While…: • For…: • Øvelse 1 • Funktioner • Stand-up programmering • Dokumentation • Øvelse 2
ER-diagrammer og SQL • En tabel består typisk af mindst to kolonner • Intern repræsentation (ID) ændrer sig aldrig. Det gør ekstern repræsentation såsom nummeret på et sæde osv. Hvis der f.eks. Kommer flere sæder eller færre
Afleveringer • Har alle afleveret deres øvelsesopgaver? • Husk det! Det har betydning for hvilken eksamensform i skal gå op i
Html og css bog? • Har bogen som e-book
Sidste gang • Navne, værdier og typer • Objekter • Type(værdi) (string) • Id(variabel) (x45hx344) • Simple typer (scalarer) • Tekst (string), index, slicing • Tal (int, float) • Sammensatte typer • List [] • Tuple () • Dictionary () • Udtryk – skabe nye værdier (”peter”[::-1])
Repetition af udtryk • 'Peter'[1:3][::-1] = 'te’. Hvorfor?
Udtryk • Udtryk (expression): noget der repræsenterer en værdi • 1 repræsenterer et heltal • ’Peter’ repræsenterer en tekst (string) • Et sammensat udtryk er en kombination af andre udtryk og operatorer der repræsenterer og producerer en (ny) værdi • 1 + 2 repræsenterer 3 –et tal (1 og 2 = udtryk, + = operator) • 'Peter'[1:3] repræsenterer 'et’ – en tekst • [1,2,3][1] repræsenterer 2 – et tal • [1,2,3][0:2] repræsenterer [1, 2] – en liste • [1:3] repræsenterer en operation
'Peter'[1:3][::-1] = 'te’. Hvorfor? • Fortolkningen af udtryk består i at frembringe det objekt de repræsenterer Fortolkning Objekt Repræsentation
O O O O I I I I R R R R 'Peter'[1:3][::-1] = 'te’. Hvorfor? te Repræsentationer der er aflæselige for maskinen et slicing O slicing Peter I R Repræsentationer der er aflæselige for mennesker 'Peter' [1:3] [::-1]
Sætninger og udtryk • Programmer består af et eller flere moduler • Moduler består af sætninger (statements) • Sætninger indeholder udtryk • Udtryk repræsenterer og producerer værdier • Sætninger • Sætninger repræsenterer ikke værdier • Sætninger regulerer hvordan værdierne produceres • Eksempel • >>> len('peter') • 5 • >>> x = 'peter’ • >>> Udtryk: producerer 5 sætning: producerer ingenting men ændrer variables værdier
Påstande – Boolske udtryk • Udtryk der repræsenterer værdierne sand eller falsk. • De repræsenterer værdierne 1 og 0 (i nyere versioner True og False) • Naturlige sprog: påstande • Bussen går kl. 9.13. • Det er løgn! • Nogle sproghandlinger som ordrer kan hverken være sande eller falske • Gå nu op i bussen. • Det er løgn – lyder mærkeligt, men kan siges. • >>> 1 + 3 == 4 • True • >>> 'Peter' == 'Karl’ • False • >>> 'Peter' <> 'Karl’ • True
Sandhedsværdier • Boolske operatorer • And, or, not • Boolske udtryk producerer nye sandhedsværdier af gamle sandhedsværdier • >>> 1+2 == 3 and 4+5 == 9 • True • >>> not (1+2 == 3 and 4+5 == 9) • False • >>> (1+2 == 3 or 1+2 == 9) • True
Naturlige sprog og logiske • Naturlige sprog lægger en årsagsfortolkning ind i hvis-så • Det gør logikken ikke • Hvis 2 + 3 = 5, så vinder socialdemokraterne næste valg • Logisk: altid sand fordi 2 + 3 = 5 • Naturligt sprog: nonsens (eller ironisk) fordi der ikke er nogen årsagssammenhæng
If-kontrolstruktur (sætning) if <boolsk udtryk> : <handling1> <handling2> • if <boolsk udtryk>: er en selektionsstruktur • <boolsk udtryk> skal repræsentere en sandhedsværdi • Handlingssætningerne udgør en blok • Blokke er indenteret med tabulator eller mellemrum • Brug tabulator ikke mellemrum det bliver noget rod
’if’ • if-sætninger kan indeholde mange forskellige betingelser if<noget> : #indledende <h1> <h2> <hn> elif<nogetAndet> : #ellers hvis <h1> <hn> else: #hvis intet var sandt <h1>
Porfyrs træ • ifraw_input('Legemlig substans?') == 'ja': • print 'Ja. Legemlig substans' • ifraw_input('levende?')== 'ja': • print 'Ja.Levende organisme' • ifraw_input('Ja. Sansende?')== 'ja': • print'Ja. Et dyr' • ifraw_input('rationelt?')== 'ja': • print 'Ja. Rationelt dyr' • ifraw_input('dødelig?')== 'ja': • print 'Ja. Et menneske' • else: • print 'Nej. Gud' • else: • print 'Nej. Et dyr' • else: • print 'Nej. En plante' • else: • print 'Nej. Død natur (sten, jord)' • else: • print 'Nej. Et begreb'
Eksempler • Eksempel 1 • Legemlig substans? • Ja. Kropslig • levende? • Ja.Levende organisme • Sansende? • Ja. Et dyr • rationelt? • Ja. Rationelt dyr • doedelig? • Nej. Gud • Eksempel 2 • Legemlig substans? • Ja. Kropslig • levende? • Ja.Levende organisme • Sansende? • Nej. En plante
While-loop • While <boolsk udtryk>: • Statement • Statement • … • Checker om <boolsk udtryk> er sandt. • Hvis det er, udføres den efterfølgende blok. • Ellers springes til det statement der følger efter blokken
While i et program (optælling) • filename = raw_input('Indtastnavnpå file: ') • if filename == '': • filename = 'entekst.txt' • myfile = open(filename,'r') ##open the file • aline = myfile.readline() ##read the first line from the file • nol = 0 #number of lines • now = 0 #number of words • while aline <> '': • #as long as aline is not empty • nol += 1 #increase the linecounter • thewords = aline.split(' ')#split the line into words • now = now + len(thewords)#increase the word counter by the number of words • aline = myfile.readline()#read the next line from the file • print 'The number of lines is ' + str(nol) • print 'The number of words is ' + str(now)
For-loop • For <navn> in <sequence>: • Statement • Statement • … • Navn kommer til at referere til medlemmerne af <sequence>, fra første til sidste • Meget hyppigt brugt
Select med OR-betingelse SELECT * FROM tabel WHERE adresse = ”Vestergade OR efternavn = ”Jensen” requirement= {'adresse':'Vestergade', 'efternavn':'Jensen'} • resultat = [] • #gennemløb alle rækker i tabellen • for rowin tabel: • #gæt på at rækken ikke duer • success = False • #gennemløb alle stikord i betingelsen • for keywordin requirement.keys(): • #hvis værdien af stikordet i betingelsen = værdien af stikordet i rækken • ifrequirement [keyword] == row[keyword]: • #rækken duede alligevel • success = True • #hop ud af løkken • break • ifsuccess == True: • #hvis rækken duede, tilføj rækken til resultatet • resultat.append(row) tabel = [{'fornavn':'Peter','efternavn':'Andersen','adresse':'Vestergade'}, {'fornavn':'Karen','efternavn':'Jensen','adresse':'Oestergade'}, {'fornavn':'Hans','efternavn':'Karlsen','adresse':'Vestergade'}]
Afbrud af løkker • Break: hopper ud af den inderste loop • Continue: hopper op til loopens betingelse • Pass: gør ingenting. Kan også bruges i if-konstruktioner, funktioner osv. Kan bruges hvis vi ikke helt ved hvad der skal stå i sætningen endnu, men vi ved den skal med
Øvelse 1 • Lav en pengemaskine der kan give tilbage på et hvilket som helst beløb i mønterne 1, 2, 5, 10, 20 • Øvelsen ligger på hjemmesiden
Funktioner • Funktioner er en måde at gruppere sætninger så de kan kaldes igen og igen • Et funktionsnavn repræsenterer et funktionsobjekt (callableobject) • Det er en måde at strukturere et program i overskuelige enheder • To keywords: • def: sætter et navn til at referere til et funktionsobjekt • return: får funktionen til at returnere en værdi (et objekt)
Funktioner • def funktionsnavn ( param1, param2, ..., paramN): • sætning1 • sætning2 • ... • sætningN • return resultat
Eksempel Funktionens navn Parametrene • defudskrivOmvendt(tekst): • return tekst[::-1] • >>>x = udskrivOmvendt('peter') • >>> x • 'retep’ Beskrivelse af selve funktionen (callable object) Vi kan give alle typer af parametre med der kan slices også lister
Pass by reference • Parameternavne refererer til samme objekt som de aktuelle parametre • Samme objekt hedder to forskellige ting • Pas på! • x = [1,2,3] • def func(y): • del(y[0]) • >>> func(x) • >>> x • [2, 3] Intern repræsentation i funktionen funktion x R O [1,2,3] O y R
Scope • Navne der oprettes inden i en funktion er forskellige fra identiske navne der bruges uden for funktionen • Det område hvor et navn gælder kaldes dets scope • Det er altid det mindste scope der gælder • Deres reference er også forskellige • Analogi: • I familiens skød betyder ’Anders’ snothvalpen henne i sofaen • I den politiske offentlighed betyder ’Anders’ Danmarks statsminister • Sæt nuværende_scope til det omgrænsende scope af navnets forekomst • Så længe vi ikke har fundet navnet: • Findes navnet i nuværende_scope: • Ja. Bruge dette navns reference • Nej: sæt nuværende_scope til det omgrænsende scope af nuværende_scope • Hvis vi ikke har fundet navnet • Giv en fejlmeddelelse
Eksempel a = "karsten" def funktion(): a = "anders" print a funktion() #kald funktionen print a #udskriv det der står uden for funktionen >>> #output anders karsten
Globale og lokale variable • def func(): • z =[] • z = [1,2,3] • func() • z • [1, 2, 3] • def func() • global z • z = [] • func() • z • [] [] 1,2,3 Hvis ikke opretter vi en ny lokal variabel Ingen assignment derfor leder den opad i scopet
Funktionsværdier • Et funktionsnavn refererer til en værdi med typen ’function’ • >>> type(func) • <type 'function'> • >>> • Derfor kan man tildele et andet navn funktionsobjektet som værdi
To funktioner • def union (sekvens1, sekvens2): #foreningsmængde • resultat = sekvens1[:] • for x in sekvens2: • if not(x in sekvens1): • resultat.append(x) • return resultat • defintersection(sekvens1,sekvens2):#overlap • resultat = sekvens1[:] • for x in sekvens1: • if not(x in sekvens2): • resultat.remove(x) • return resultat
Funktionsnavne • Man kan sætte et andet navn til at referere til funktionsobjektet • >>> foreningsmængde = union • >>> foreningsmængde([1,2,3],[4,6]) • [1, 2, 3, 4, 6] • Man kan også bruge et funktionsnavn som parameter i en anden funktion [1, 2, 3, 4, 5, 6] foreningsmængde funktion [1,2,3] [4,5,6] union
Funktioner som parametre • def do(sekvens1,funktion, sekvens2): • return funktion(sekvens1, sekvens2) • I overskriften optræder funktionen som parameter - som data der flyttes • I kroppen optræder funktionen som noget der kan kaldes • Von Neumann igen!
Funktionsnavn og funktionsresultater • doer en metafunktiondersætterandrefunktionersammen med deresargumenter • print do([1,2,3],union,[3,4,5]) • [1, 2, 3, 4, 5] • Funktionsnavnetunionbrugessom parameter ogdetsværdiudføresidofunktionen. • Resultatetaffunktionskaldkanogsåogsåbrugessom parameter • print intersection(union([1,2,3],[3,4,5]),[1,4]) • [1, 4] • Resultatet af Union ([1,2,3],[3,4,5]),nemlig[1, 2, 3, 4, 5], gives som parameter til Intersection hvis anden parameter er [1,4] • Union repræsenterer en funktion • Union ([1,2,3],[3,4,5])repræsenterer en liste.
Returnering af flere værdier fra enfunktion • Brug en tupel • Brug tupel-unpacking • def funktion(a,b): • res1 = a+b • res2 = a* b • res3 = a-b • return (res1,res2,res3) • x,y,z = funktion(23,34)
Funktionsnavne • Giv altid funktioner sigende navne der beskriver hvad funktionen gør • Hvis det er svært at finde på et navn, eller navnet bliver meget langt, er det fordi at flere funktioner er blevet indlejret i den samme funktion og funktionen bør derfor splittes op i flere funktioner • sorterUdskrivOgGemTeksten() #ikke et godt navn, hvad nu hvis vi kun ville gemme
if __name__ == “__main__”: • Hvordan undgår man at få udført eventuelle sætninger i et modul? • def f1(): pass • def f2(): print “Morten” • if __name__ ==”__main__”: • f1() • f2() Bruges typisk til tests
Opsummering • Store dele af Python kan forstås gennem følgende simple model: • En repræsentation/udtryk står for et objekt/en værdi • Fortolkningen af et udtryk producerer det objekt som repræsentationen står for • Kombinationen af en funktion/operation plus andre værdier producerer en nye værdi • Et funktionsnavn står for et funktionsobjekt • print intersection • <function intersection at 0x011851B0>
Moduler • Moduler er Python-programmerder kan bruges fra andre Python-programmer • Læg jeres moduler i den samme mappe • De ”importeres” ved at bruge kommandoen import. • Import <modulnavn> • From <modulnavn> import * • Moduler kan indkapsle en verden man ønsker at bruge men ikke at forstå. • Modulet beskriver hvordan dets verden fungerer i detaljer men man behøver kun at vide hvordan man bruger dets verden • Vi tager alle funktionerne ud af programmet og lægger dem i et modul. Når vi skal skrive et program der benytter sig af modulets funktionalitet, importerer vi modulet. • typisk samle funktioner inde for samme problemdomæne, f.eks. Math, persistens osv. så vi ved hvad modulet kan bruges til
Stand-up programmering • Lav et modul der kan analysere tekster • Modulet skal kunne: • Fjerne alle karakterer der ikke er ord • Give mulighed for at ændre hvilke karakterer der ikke er ord • Analysere hvor mange antal ord der er i teksten • Give svar på antal forekomster af hvert ord i teksten
Sigende funktionsnavn igen • Hvert funktionsnavn havde i vores tekst analyse_modul sigende navne hvilket gør det nemt for andre at forstå hvad modulet gør og hvordan det skal bruges • stripNonCharacters • getWordCount • getWordCountDictionary Hvis funktioner havde hedet a, b, c havde de været svære at forstå
Kommentarer & Docstring • Kommentarer i pythonprogrammer starter med # • Kommentarer ignoreres af fortolkeren • Docstring er en kommentar der gemmes med koden • def funktion(): • “”” Dette er en docstring “”” • Pass • Eksempel fra text_module_finished
Docstring • dir(str), dir(list) liste over attributter og funktioner • help(str.startswith) hjælp til den specifikke funktion • Dir(text_module) • Help(text_module) • Help(text_module.stripNonCharaters)
Dir • >>> dir(text_module_finished) • ['__builtins__', '__doc__', '__file__', '__name__', 'getWordCount', 'getWordCountDictionary', 'nonWords', 'nonWordsSpeciels', 'setNonWordsList', 'stripNonCharacters']
Help • >>> help(text_module_finished) • Help on module text_module_finished: • NAME • text_module_finished - # -*- coding: ISO-8859-1 -*- • FILE • d:\documents\ito e07\peter bv\uge 40\programs\text_module_finished.py • FUNCTIONS • getWordCount(string, strip=True) • string => a string containing words for counting • strip => optional, default = True: should the string be stripped for non-word • characters before count i performed? • return: an integer value representing the count • getWordCountDictionary(string, strip=True) • string => a string containing words for counting • strip => optional, default = True: should the string be stripped for non-word • characters before count i performed? • return: a dictionary where each word in the string represent a key • and each value is the count of the specific word • setNonWordsList(nonW, nonWordsS) • nonW => a list of characters which should not be treated as words • and therefore should be replaced with "" • nonWordsS => a list of characters which should not be treated as words • but represent a special character which should followed by a space e.g. • newline, tab, slash • stripNonCharacters(string) • string => the string which should be stripped from non-word characters • return: a string stripped from non-word characters • DATA • nonWords = [',', '.', '!', '?', '"', "'", '(', ')', ';', '_', '-', '--... • nonWordsSpeciels = ['\n', '\r', '\t', '/']
Docstrings • I text analyse modulet • def stripNonCharacters(string): • """ • string => the string which should be stripped from non-word characters • return: a string stripped from non-word characters • ""“ • I prompten>>>help(text_module_finished.stripNonCharacters) • Help on function stripNonCharacters in module text_module_finished: • stripNonCharacters(string) • string => the string which should be stripped from non-word characters • return: a string stripped from non-word characters