Introduktion til programmering Uge 39 Python I Learning Python, kap 4-7.
Plan Hvad er et Python program Udtryk Værdier og Datatyper Stand-up programmering Filer Øvelse 3
Fortolkning/compilering Python er et fortolket sprog, der kan afvikles interaktivt i IDLE eller ud fra en fil med programkoden Muliggør en hurtig måde at skrive programmer på, først interaktivt så som script Interpretant: Fortolker Repræsentamen Program Objekt Databehandlingsprocesser
Installering af Python http://www.python.org/ Jeg bruger Python 2.5.1 Idle er et interaktivt program til afvikling af Python programmer Findes i mappen idlelib under Lib under Python25.
Idle xx Jeres egne kommandoer Pythons prompt
Idle Denne menu bruger I til at lave en file der indeholder et python-program Husk at tilføje.py når I gemmer filen
Hvad er et Python program? En sekvens af repræsentationer Udtryk som repræsenterer en værdi De fleste værdier i Python er objekter Sætninger (statements) som udvirker databehandling. Sekvensen udføres i rækkefølge Rækkefølgen styres af kontrolstrukturer Gentagelse, selektion Sekvenser kan grupperes (klasser og funktioner: indkapsling)
Muslinge programmet while spand <> []: enmusling = spand[0] del spand[0] if enmusling == 0: gryde.append(enmusling ) else: affaldspose.append(enmusling ) Rækkefølge Gentagelse Selektion Spand, gryde og affaldspose repræsenterer lister af nuller og etter
Programmer Data Kode Udføres fra start til slut (hele sekvensen) Kan være i en ventetilstand Typisk for interaktive programmer. De bruger mest af tiden til at vente på brugerinput cpr = raw_input( Type a word: ) #venter til der tastes input ind Består af udtryk(data) og sætninger(kode) spand = [1,0,0,1,0,1,0,0] gryde = [] affaldspose = [] while spand <> []:
Reminder fra første forelæsning Computerens definerende bestanddele Aritmetisk-logisk enhed Kontrol enhed Hukommelse In- og Output Bus von Neumann-arkitektur Program og data er af samme slags Mest udbredte arkitektur nutildags
Program og data Den samme tekst kan opfattes som data og som program >>> command = 'print "Peter" Som data >>> exec command Peter Som program Det kender vi også fra naturlige sprog. Vi kan tale om det vi gør. Jeg beder dig om at komme Som data Kom nu! Som program
Værdier Det grundlæggende element i Python er værdier der tilhører bestemte typer Værdier er næsten altid objekter Eksempler på typer: Et tal eller en tekst (string) Nogle typer er indbyggede, andre er defineret af programmøren Tal og tekst er to grundlæggende indbyggede typer Vi refererer til værdier ved hjælp af navne (variable) Interpretant: Python fortolkeren Repræsentamen: navn Objekt: værdi/objekt
Værdier og typer >>> navn = 'peter >>> telefon = 86379790 >>> navn 'peter >>> telefon 86379790 >>> type(navn) <type 'str'> >>> type(telefon) <type 'int'> Type: tekst (string), markeret ved apostrofferne Type: heltal Vi kan checke hvilken type værdien er ved hjælp af type
Direkte og indirekte reference >>> id(navn) 20467584 >>> id(telefon) 18198252 >>> help(id) Vi får fat i navnets direkte reference ved hjælp af id Vi kan få hjælp til alle sprogelementer ved hjælp af help Help on built-in function id in module builtin :id(...) id(object) -> integer. Return the identity of an object. This is guaranteed to be unique among simultaneously existing objects. (Hint: it's the object's memory address.)
Direkte og indirekte reference >>> navn peter >>> id(navn) 20467584 navn 20467584 Interpretant: Python peter Representamen: navn Objekt: 20467584: Representamen Objekt: peter Interpretant: Python
Tildeling (assignment) Variable opstår ved at der bliver tildelt en værdi til dem = er tildelingsoperatoren Variable skal tildeles en værdi før de kan benyttes >>> navn = Peter >>> print navn (OK, navnet er oprettet) >>> print nytnavn (FEJL, nytnavn ikke tildelt en værdi) Traceback (most recent call last): File "<interactive input>", line 1, in? NameError: name 'nytnavn' is not defined
Operationer Værdierne manipuleres ved hjælp af operationer print udskriver værdien >>> navn = Peter >>> print navn Peter >>> navn Peter
Navne Først: bogstav eller understregning (_) Dernæst: et vilkårligt antal bogstaver, understregninger, eller tal. Rigtigt: builtin, navn, _navn_, navn1 Galt: 1peter = 'x' ^SyntaxError: invalid syntax Reserverede ord kan ikke benyttes: While, if, elif, print, Der er 29 i alt (se bogen side 137)
Tildeling igen Da variable er indirekte referencer kan to variable referere til den samme objekt Navnet refererer først til en lokation i lageret Lagerlokationen refererer til objektet >>> statsminister = 'fogh >>> venstreformand = statsminister Representamen: Venstreformand Representamen: Statsminister Objekt: 20826464 Representamen Objekt: Fogh
Ækvivalens og identitet >>> venstreformand = 'anders fogh rasmussen >>> statsminister = 'anders fogh rasmussen To forskellige objekter der har samme bogstaver og derfor er ækvivalente >>> venstreformand is statsminister False Is checker om de to objekter er identiske >>> venstreformand == statsminister True == checker om to objekter er ækvivalente, her: indeholder samme bogstaver >>> venstreformand = statsminister >>> venstreformand is statsminister True Gælder ikke for korte strenge!
Garbage collection Hvor mange navne refererer til objetket fogh? 3 3 >>> sys.getrefcount(statsminister) >>> sys.getrefcount(venstreformand) Vi kan slette statsminister s direkte reference uden at slette den indirekte 2 >>> del(statsminister) >>> statsminister Traceback (most recent call last): File "<interactive input>", line 1, in?nameerror: name 'statsminister' is not defined >>> sys.getrefcount(venstreformand) >>> venstreformand 'fogh Når ingen navne refererer til en værdi slettes den. Garbage collection
Dynamiske typer I nogle programmeringssprog skal man angive hvilken type en variabel skal have String x = Anders Fogh Rasmussen Det gælder ikke i Python. Her kan en variabel indeholde forskellige værdier >>> x = Anders Fogh Rasmussen >>> x = 12 Men objekterne har stadig en type! Stærk typet vs dynamisk typet sprog
Årsag Stærkt typede sprog har direkte reference. Tallet 12 fylder mindre end en tekst på 50 linjer. Der skal derfor reserveres mere plads til det første end til det sidste. Dynamisk typede sprog har alle samme slags direkte reference: et tal der angiver adressen i lageret på navnets værdi/objekt.
Typer De operationer der kan foretages på et objekt afhænger af hvilken type det er Polymorfi >>> Peter + Boegh Peter Boegh >>> 12 + 34 46 Det kender vi også fra de naturlige sprog Ole sad på stolen Ole kørte til Århus på 20 timer
Typer Det er muligt at tvinge en type til at være en anden type Eks. tvinge en tekst (string) til at være et tal (int) >>> x = 12 >>> y = int(x) >>> str(int('2')+int('3'))+' kroner 5 kroner >>> '2'+'3'+' kroner '23 kroner' Vi ændrer interpretanten - måden værdien fortolkes på
Typer Umulige ændringer giver en fejl >>> x = Morten >>> y = int(x) Det er ikke altid let at skelne mellem mulige og umulige ændringer >>> x = ['a','b','c'] >>> x ['a', 'b', 'c'] >>> y = str(x) >>> y ['a', 'b', 'c'] >>> y[0] '[ >>> x[0] 'a'
Datatyper er tolkninger af bitmønstre Interpretant: regler for tekstbehandling >>> x = 12 >>> y = int(x) Repræsentamen: x Objekt: 12 Interpretant: regler for talbehandling Repræsentamen: y Objekt: 12
Typer Simple typer Tekst (string, str), tal (integer, int ) Scalarer vs compound Scalarer = tal, tekst(string): består ikke af mindre selvstændige dele Compound = lister, tupler, dictionaries: består af mindre selvstændige dele Mutable vs immutable Mutable = lister, dictionaries: kan ændres Immutable = tal, tekst, tupler: kan ikke ændres
String Opfører sig lidt som en Compound-type Er immutabel Kan opfattes som en sekvens af bogstaver >>> navn = PETER Vi ser fra nu af bort fra den indirekte reference!
Indexering >>> navn = 'PETER >>> len(navn) 5 >>> navn[0] 'P >>> navn[len(navn)-1] 'R >>> navn[-1] 'R >>> navn[-2] 'E
Ændring af strenge Man kan ikke ændre bogstaverne ved strenge: >>> 'peter'[1] = 'a' Traceback (most recent call last): File "<pyshell#7>", line 1, in -toplevel- 'peter'[1] = 'a' TypeError: object does not support item assignment Det kan man godt ved lister >>> a = [1,2,3] >>> a[1] = 6 >>> a [1, 6, 3] Hvis man vil ændre på en streng må man bygge en nye af den gamle >>> a = 'peter' >>> b = a.replace('e','a',1) >>> a 'peter' >>> b 'pater'
Intervaller, slicing Navn[fra og med: til men ikke med] Navn = PETER >>> navn[0:3] 'PET >>> navn[:3] 'PET >>> navn[2:4] 'TE >>> navn[2:] 'TER >>> navn[:] 'PETER
Slicing >>> navn[:] 'PETER' >>> navn[::2] 'PTR >>> navn[::-1] 'RETEP'
String funktioner >>> navn = 'PETER >>> tal = '123 >>> navn.isalpha() True >>> tal.isalpha() False >>> tal.isdigit() True
Dot-notationen Alle værdier er objekter der tilhører en klasse (kommer senere!) Et objekt har egenskaber og metoder tilknyttet Help-funktionen giver en liste over klassens metoder Navn PETER Navn.isdigit() Navn.split() isalpha isdigit split
Help >>> help(str) Help on class str in module builtin : class str(basestring) str(object) -> string capitalize(...) S.capitalize() -> string Return a copy of the string S with only its first character capitalized. isalpha(...) S.isalpha() -> bool Return True if all characters in S are alphabetic and there is at least one character in S, False otherwise. isdigit(...) S.isdigit() -> bool Return True if all characters in S are digits and there is at least one character in S, False otherwise.
Stringfunktioner >>> opdeling = 'peter boegh andersen'.split(' ') >>> opdeling ['peter', 'boegh', 'andersen'] y.find(x) returnerer indexet for første forekomst af x in y. >>> andetord = 'peter boegh andersen'.find(' ') >>> andetord 5 >>> fornavn = 'peter boegh andersen'[:andetord] >>> fornavn 'peter efternavn = 'peter boegh andersen'[andetord:] >>> efternavn ' boegh andersen'
Værdisammenligninger a < b ; a > b ; a <= b ; a >= b ; a == b; a!= b ; a <> b Tal: numerisk sammenligning Tekst: alfabetisk sortering ( a < b < c < d...)
Boolean Efter George Boole Alt hvad er giver svaret True eller False Boolean-typen er ny i python 2.3 Før: 0 og 1 >>> a == b False >>> a < b... True
Sekvenser Containere, kan indeholde mange værdier String kan opfattes som en form for sekvens slicing, indexering kan kun indeholde tegn Andre sekvenser: lister, tupler, dictionaries
Lister Tom liste: L = [] >>> navn = ['peter','boegh','andersen'] >>> navn[0] 'peter >>> navn[1] 'boegh >>> navn[1:] ['boegh', 'andersen'] Indexering og slicing >>> person = [navn, 59] >>> person [['peter', 'boegh', 'andersen'], 59] Lister er heterogene containere der kan indeholde værdier af mange forskellige slags, også andre lister
Lister kan ændres >>> person [['peter', 'boegh', 'andersen'], 59] >>> person.remove(59) >>> person.append(60) Kan også gøres således: person[1] = 60 >>> person[1] 60 >>> person[0][1] 'boegh >>> del(person[0][1]) >>> person [['peter', 'andersen'], 60]
Også udtryk har tilknyttet værdier 'boegh ['peter', 'boegh', 'andersen [['peter', 'boegh', 'andersen'], 59] Person [0] [1]
Lister kan ændres >>> person.sort() >>> person [60, ['peter', 'boegh', 'andersen']] >>> person[1].sort() >>> person [60, ['andersen', 'boegh', 'peter']]
Tupler er (næsten) som lister, men er immutable (kan ikke ændres) navn = ( peter, boegh ) navn[1]= Olsen ikke tilladt TypeError: object does not support item assignment Tupel med et element: ( Peter,) >>> navn = ('peter') >>> navn 'peter >>> type(navn) <type 'str'> >>> navn = ('peter',) >>> type(navn) <type 'tuple'>
Dictionary/ordbog Associative map: afbilder nøgler på værdier Indexering efter nøgler, ikke efter position >>> ordbog = {} >>> ordbog['hest'] = 'horse >>> ordbog['ko'] = 'cow >>> ordbog {'ko': 'cow', 'hest': 'horse'} >>> ordbog['ko'] cow Meget anvendelig
Dictionary/ordbog >>> ordbog.keys() ['ko', 'hest'] >>> 'ko' in ordbog.keys() True >>> ordbog.values() ['cow', 'horse'] >>> ordbog.get('ko','findes ikke') 'cow >>> ordbog.get('so','findes ikke') 'findes ikke'
Dictionary Værdierne kan selv være en dictionary >>> medarbejderliste = {} >>> medarbejderliste['peter boegh andersen'] = {'telefon':86379790,'email':'pba@imv.au.dk'} >>> medarbejderliste {'peter boegh andersen': {'email': 'pba@imv.au.dk', 'telefon': 86379790} } >>> medarbejderliste['peter boegh andersen'] {'email': 'pba@imv.au.dk', 'telefon': 86379790} >>> medarbejderliste['peter boegh andersen']['email'] 'pba@imv.au.dk'
Dictionary dictionary Nøgle: Peter Boegh Andersen Værdi: dictionary Nøgle: email Værdi: pba@imv.au.dk Nøgle: telefon Værdi: 86379790
Stand-up programmering 1 rækker Lav din egen database med et select-kald Databasen: en liste af ordbøger tabel = kolonner [{'fornavn':'peter','efternavn':'andersen','adresse' :'Vestergade'}, {'fornavn':'karen','efternavn':'jensen','adresse':'o estergade'}, {'fornavn':'hans','efternavn':'karlsen','adresse':'v estergade'}]
Stand-up programmering 2 kolonnenavne = ['fornavn'] betingelse = {'adresse':'vestergade'} Skriv en algoritme der udskriver de ønskede kolonner i alle rækker hvor betingelsen er opfyldt Eks: Udskriv fornavne på alle der bor på vestergade. Problemløsning del og hersk: Opdel et problem i mindre problemer Forsæt indtil du når til små problemer du kan programmere dig ud af.
Løsning 1 tabel = [{'fornavn':'peter','efternavn':'andersen','adresse':'vestergade'},\ {'fornavn':'karen','efternavn':'jensen','adresse':'oestergade'},\ {'fornavn':'hans','efternavn':'karlsen','adresse':'vestergade'}] kolonnenavne = ['fornavn','efternavn']#de kolonner vi oensker at faa udskrevet betingelse = {'adresse':'vestergade', 'efternavn':'andersen'}#de betingelser en raekke skal opfylde #opgave: Skriv en algoritme der udskriver #1. de oenskede kolonner i #2. alle raekker hvor alle betingelser er opfyldt (en AND-betingelse) #generel loesning på AND-betingelsen #delproblem 2: alle raekker hvor alle betingelser er opfyldt resultat = [] #gennemloeb alle raekker i tabellen for raekke in tabel: #gaet paa at raekken er OK success = True #gennemloeb alle stikordord i betingelsen for stikord in betingelse.keys(): #hvis vaerdien af stikordet i betingelsen <> vaerdien af stikordet i raekken if betingelse[stikord]!= raekke[stikord]: #raekken var ikke OK alligevel success = False #hop ud af loekken break if success == True: #hvis raekken var OK tilfoej raekken til resultatet resultat.append(raekke)
Løsning 2 print 'Alle raekker der opfylder alle betingelserne' print '-------------------------------------------------------------------' print resultat #delproblem 1: de oenskede kolonner i resultatet for raekke in resultat: #gennemloeb alle raekker i resultatet for stikord in raekke.keys(): #gennemloeb alle stikord i raekken if not(stikord in kolonnenavne): #hvis stikordet ikke forekommer i listen over de oenskede kolonnenavne, fjern den raekke.pop(stikord) print print 'Alle alle de oenskede kolonner' print '-------------------------------------------------------------------' print resultat
Output Alle raekker der opfylder alle betingelserne ----------------------------------------------------------- [{'efternavn': 'Andersen', 'fornavn': 'Peter', 'adresse': 'Vestergade'}] Alle alle de oenskede kolonner ----------------------------------------------------------- [{'efternavn': 'Andersen', 'fornavn': 'Peter'}]
Input cpr = raw_input(' Skriv Cpr:') Skriv Cpr:434343434
Filer Filens navn: entekst.txt Filens indhold: Der var en gang en mand han boede i en spand og spanden var af ler nu kan jeg ikke mer >>> myfile = open('c:/python24/pythonfiles/38/entekst.txt','r') >>> myfile.readline() 'Der var en gang en mand\n >>> myfile.readline() 'han boede i en spand\n >>> myfile.readlines() ['og spanden var af ler\n', 'nu kan jeg ikke mer'] Den komplette sti ned til filen
Filer import sys filename = raw_input('indtast navn på file: ') myfile = open(filename,'r') aline = myfile.readline() nol = 0 now = 0 while aline <> '': nol += 1 thewords = aline.split(' ') now = now + len(thewords) aline = myfile.readline() print 'The number of lines is ' + str(nol) print 'The number of words is ' + str(now) Indtast navn på file: entekst.txt The number of lines is 1 The number of words is 5 >>> Hvis filen ligger i samme mappe som Pythonprogrammet behøver man ikke at angive file-stien
Fil-objekter repræsenterer en file på disken Representamen: myfile myfile File-objekt: Ikke persistent random access (RAM) interpretant: operativsyst emets filesystem Objekt: en file entekst.txt File: Persistent sekventielt lager: Harddisk, floppy disk, CD-rom
Metoder Open, close Mode: 'r : read 'w : write 'a : tilføje til slutningen Seek: flytter læse og skrivehovedet >>> myfile.readlines() ['og spanden var af ler\n', 'nu kan jeg ikke mer'] >>> myfile.readlines() [] >>> myfile.seek(0) >>> myfile.readlines() ['Der var en gang en mand\n', 'han boede i en spand\n', 'og spanden var af ler\n', 'nu kan jeg ikke mer']
Metoder Skrivning >>> myfile = open('c:/python24/pythonfiles/38/entekst.txt','w') >>> myfile.write('der var ikke nogen mand') >>> myfile.close() >>> myfile = open('c:/python24/pythonfiles/38/entekst.txt','r') >>> myfile.readlines() ['Der var ikke nogen mand']
Øvelse 3 Teori: værdier, tildelinger og sammenligninger, dynamiske typer, string, list, tupler, filer. Opgaven: string, list, slicing. Opgaven vedrører indtastning af informationer til systemet. Disse informationer vil typisk være strenge. Opgaven går ud på at fiske meningsfuld information ud af disse strenge og placere dem i lister som systemet senere kan bearbejde. Eksemplet er et varebestillingssystem hvor man skal kunne indtaste et vilkårligt antal varenumre, antal og datoer. Varenummer er et firecifret tal, antal er et trecifret tal og datoen et 8-cifret tal. Eksempel: 1000 003 31092008, 1001 010 09092008 Varenummer 1000 er bestilt til 31-09-2008 i et antal af 3; varenummer 1001 er bestilt til 09-09-2008 i et antal af 10.
Øvelse 3 Systemet skal omdanne den enkelte indtastning til en liste med følgende elementer: varenummer, antal, dag, måned, år. Systemet skal placeret denne liste som element i en overordnet liste (som da bliver en liste af lister), således at det husker alle de indtastede bestillinger. Systemet skal blive ved at indlæse bestillinger indtil brugeren taster end. Så skal det udskrive alle de indtastede bestillinger. Det kan f.eks. køre således: type order or "end":1000 003 31092008 type order or "end":1001 010 09092008 type order or "end":end [['1000', '003', '31', '09', '2008'], ['1001', '010', '09', '09', '2008']] >>> Vi har ikke haft kontrolstrukturer endnu, så I får lidt hjælp: order ='' listoflist = [] while order!= 'end': order = raw_input('type order or "end":') if order!= 'end': print listoflist Det er jeres opgave at udfylde korrekt. raw_input er en indbygget funktion der prompter brugeren for input, indlæser det og returnerer en tekst streng: cpr = raw_input('type order or "end":') Aflevering: der afleveres et korrekt pyton-program.
Frivillig opgave Ud fra de 3 nedenstående variable a,b,c skal du bygge følgende tekststreng, kun ved at bruge slicing og concatenation: Python is a great Tool for doing Text processing De 3 variable skal være en del af din kode. a = 'pro do is' b = 'taergcessingfor' c = 'PythonTextool'