510 likes | 653 Views
Introduktion til programmering. Uge 39 Python I Learning Python, kap 4-7. Plan. Hvad er et Python program Udtryk Værdier og Datatyper Øvelse Lister og dictionarys Stand-up programmering Filer Øvelse . Fortolkning/compilering.
E N D
Introduktion til programmering Uge 39 Python I Learning Python, kap 4-7.
Plan • Hvad er et Python program • Udtryk • Værdier og Datatyper • Øvelse • Lister og dictionarys • Stand-up programmering • Filer • Øvelse
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
Installering af Python • http://www.python.org/
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) (søge-algoritme)
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 • 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 <> []: • … Data Kode
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 Type: tekst (string), markeret ved apostrofferne • >>> navn = 'peter’ • >>> telefon = 86379790 • >>> navn • 'peter‘ • >>> telefon • 86379790 • >>> type(navn) • <type 'str'> • >>> type(telefon) • <type 'int'> Type: heltal Vi kan checke hvilken type værdien er ved hjælp af ”type”
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
Variabelnavne • 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) • Java konvention ”bilFabrik” (variabel), ”BilFabrik” (klasse)
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’ • Objekt: • 20826464 • Representamen Objekt: ‘Fogh’ Representamen: ’Statsminister’
Referencer • Hvis vi ændrer den første variable har det ingen indflydelse på den anden som det vil have i C, vi opretter i stedet et nyt objekt og en ny reference • >>> statsminister = ’schlüter’ • Objekt: • 20826464 • Representamen Representamen: ’Venstreformand’ Objekt: ‘Fogh’ • Objekt: • 20826465 • Representamen Objekt: ‘schlüter’ Representamen: ’Statsminister’
Ækvivalens og identitet • >>> venstreformand = 'andersfoghrasmussen’ • >>> statsminister = 'andersfoghrasmussen’ • 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
Garbage collection • Hvor mange navne refererer til objetket ”fogh”? • >>> sys.getrefcount(statsminister) • 3 • >>> sys.getrefcount(venstreformand) • 3 • Vi kan slette ’statsminister’s direkte reference uden at slette den indirekte • >>> del(statsminister) • >>> statsminister • Traceback (most recent call last): File "<interactive input>", line 1, in ?NameError: name 'statsminister' is not defined • >>> sys.getrefcount(venstreformand) • 2 • >>> 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
Typer 1 • De operationer der kan foretages på et objekt afhænger af hvilken type det er • Polymorfi • >>> “Peter “ + “ bjerregaard” (sætter strengen sammen) • ’Peter bjerregaard’ • >>> 12 + 34 (lægger tallene sammen) • 46 • Operatorerne har altså forskellig betydning ud fra den kontekst de er i. Dette kaldes også operator overloading
Typer 2 casting • 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 3 • “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'] (liste) • >>> x • ['a', 'b', 'c'] • >>> y = str(x) (liste -> streng) • >>> y • “['a', 'b', 'c']“ • >>> y[0] (nu er det strengen vi tager index 0 på og ikke listen) • '[‘ • >>> x[0] (her får vi værdien fra listen) • 'a'
Typer 4 • 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] (vær opmærksomme på dette) • 'R’ • >>> navn[-1] • 'R’ • >>> navn[-2] • 'E’ >>>navn[len(navn)]Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> a[len(a)] IndexError: string index out of range
Æ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: objectdoes 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 ny af den gamle • >>> a = 'peter' • >>> b = a.replace('e','a',1) erstat kun den førsteforekomst • >>> a • 'peter' • >>> b • 'pater‘ • Eller…. • >>> a = a.replace(‘e’, ‘a’, 1) • >>> a • ‘pater’ #vi har dog ogsåmistetreferencentilvoresgamleinstansaf a
Intervaller, ’slicing’ • Navn[fra og med: til men ikke med] • >>> navn[0:3] • 'PET’ • >>> navn[:3] • 'PET’ • >>> navn[2:4] • 'TE’ • >>> navn[2:] • 'TER’ • >>> navn[:] • 'PETER’
Slicing • >>> navn[:] (laver en kopi) • 'PETER' • >>> navn[::2] • 'PTR’ • >>> navn[::-1] • 'RETEP'
String funktioner • >>> navn = 'PETER’ • >>> tal = '123’ • >>> navn.isalpha() • True • >>> tal.isalpha() • False • >>> tal.isdigit() • True • Navn.__getslice__(2, 4) <==> navn[2:4]
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 • >>>help(str) Navn PETER isalpha Navn.isdigit() isdigit Navn.split() split
Help • >>> help(str) • Help on class str in module __builtin__: • class str(basestring) • | str(object) -> string (laver objektetomtil en streng) • … • | 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 = 'peterbjerregaardvahlstrup'.split(' ') • >>> opdeling • ['peter', ’bjerregaard', ’vahlstrup'] • y.find(x) returnerer indexet for første forekomst af x in y. • >>> andetord = peterbjerregaardvahlstrup'.find(' ') • >>> andetord • 5 • >>> fornavn = 'peterbjerregaardvahlstrup'[0:andetord] • >>> fornavn • 'peter’ • efternavn = peterbjerregaardvahlstrup'[andetord:] • >>> efternavn • ' bjerregaardvahlstrup'
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...)
Opgave 1 + 2 • Løs opgave 1 og 2 • Opgave 1 omhandler slicing af tekststrenge og concatenering • Opgave 2 omhandler indeksering i lister og dictionarys samt concatenering
Boolean • Efter George Boole • Alt hvad kan sammenlignes 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 (kan indeholde alt)
Lister • Tom liste: L = [] • >>> navn = ['peter',’bjerregaard',’vahlstrup'] • >>> navn[0] • 'peter’ • >>> navn[1] • ’bjerregaard’ • >>> navn[1:] • [’bjerregaard', ’vahlstrup'] • >>> person = [navn, 59] • >>> person • [['peter', ’bjerregaard', ’vahlstrup'], 59] Indexering og slicing Lister er heterogene containere der kan indeholde værdier af mange forskellige slags, også andre lister.MEN PAS PÅ MED DET!
Lister kan ændres 1 • >>> person • [['peter', ’bjerregaard', ’vahlstrup'], 59] • >>> person.remove(59) • >>> person.append(60) • Kan også gøres således: • person[1] = 60 • >>> person[1] • 60 • >>> person[0][1] • ’bjerregaard’ • >>> del(person[0][1]) • >>> person • [['peter', ‘vahlstrup'], 60]
Lister kan ændres 2 • >>> person.sort() • >>> person • [60, ['peter', ’bjerregaard', ’vahlstrup']] • >>> person[1].sort() • >>> person • [60, [’bjerregaard', 'peter’, 'vahlstrup']]
Tupler • er (næsten) som lister, men er immutable (kan ikke ændres) • Kan derfor bruges som nøgler i et dictionary • navn = (”peter”, “vahlstrup”) • 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',), (1234, ) (hvis ikke tror den det er et tal) • >>> type(navn) • <type 'tuple'>
Dictionary/ordbog 1 • Associative map: afbilder nøgler på værdier • Indexering efter nøgler, ikke efter position • >>> ordbog = {} • >>> ordbog['hest'] = 'horse’ (nøgle:værdi) • >>> ordbog['ko'] = 'cow’ • >>> ordbog • {'ko': 'cow', 'hest': 'horse'} • >>> ordbog['ko'] • ’cow’ • Meget anvendelig
Dictionary/ordbog 2 • >>> ordbog.keys() (returnerer en liste) • ['ko', 'hest'] • >>> 'ko' in ordbog.keys() • True • >>> ordbog.values() • ['cow', 'horse'] • >>> ordbog.get('ko','findes ikke') • 'cow’ • >>> ordbog.get('so','findes ikke') • 'findes ikke' Alternativ til ordbog[”ko”] Hvad returneres hvis nøglen ikke findes
Dictionary 3 • Værdierne kan selv være en dictionary • >>> medarbejderliste = {} • >>> medarbejderliste['petervahlstrup'] = {'telefon':86196901,'email':'pbvahlst@imv.au.dk'} • >>> medarbejderliste • {'petervahlstrup ':{'email': 'pbvahlst@imv.au.dk', 'telefon': 86196901} • >>> medarbejderliste['petervahlstrup'] • {'email': 'pbvahlst@imv.au.dk', 'telefon': 86379790} • >>> medarbejderliste['petervahlstrup']['email'] • 'pba@imv.au.dk'
Dictionary 4 dictionary Værdi: dictionary Nøgle: Peter Boegh Andersen Nøgle: email Værdi: pba@imv.au.dk Nøgle: telefon Værdi: 86379790
Stand-up programmering 1 • Lav din egen database med et select-kald • Databasen: en liste af ordbøger • tabel = • [{'fornavn':'Peter','efternavn':'Andersen','adresse':'Vestergade'}, • {'fornavn':'Karen','efternavn':'Jensen','adresse':'Oestergade'}, • {'fornavn':'Hans','efternavn':'Karlsen','adresse':'Vestergade'}] kolonner rækker
Stand-up programmering 2 • kolonneNavne = ['fornavn'] • betingelse = {'adresse':'Vestergade'} • Skriv en algoritme der udskriver de ønskede kolonner ialle rækker hvor betingelsen er opfyldt (det er her vi starter) • 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.
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 – hvad kan vi bruge det til? • name = raw_input("name of file: ") • myFile= open(name, "r") • lines = myFile.readlines() • myFile.close() • outList= [] • for l in lines: • if "Slum_x" in l: • outList.append("-"*10+l[:-1]+10*"-"+"\n") • elif "Ástríður" in l: • outList.append("*"*10+l[:-1]+10*"*"+"\n") • else: • outList.append("\t\t"+l+"\n\n) (\t og \n erescapedekarakterer) • myFile = open("chatoutput.txt", "w") • for l in outList: • myFile.write(l) • myFile.close() Indlæse fil, formatere indholdetog udskrive det formaterede indhold igen til en ny fil
Metoder • Open, close • Mode: • 'r’: read • 'w’: write • 'a’: tilføje til slutningen (append) • 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']