Inleiding Programmeren 2 Gertjan van Noord en Leonie Bosveld December 19, 2016
Vandaag Naar aanleiding van de opdrachten Zelle hoofdstuk 11
Boolean variabelen: niet checken met == Fout: if clicked == True : gohome () Goed: if clicked : gohome ()
Boolean variabelen: niet checken met == Fout: if clicked == False : gowork () Goed: if not clicked : gowork ()
While loop en break Fout: clicked = False while not clicked : doit () if buttonclicked (): clicked = True Goed: while True : doit () if buttonclicked (): break
Simulatie als de kansen niet gelijk zijn: Goed p1 = 0.23132 # probability of event e1 p2 = 0.32122 # e2 p3 = 0.44746 # e3 r = random. random () if r < p1: return ("e1") if r < p1 + p2: return ("e2") else : return ("e3")
Simulatie als de kansen niet gelijk zijn: Fout p1 = 0.23132 # probability of event e1 p2 = 0.32122 # e2 p3 = 0.44746 # e3 if random. random () < p1: return ("e1") if random. random () < p1 + p2: return ("e2") else : return ("e3")
If statements Fout: if x < 0: print (" negative!") if x > 0: print (" positive!") if x == 0: print (" zero!") Goed: if x < 0: print (" negative!") elif x > 0: print (" positive!") else : print (" zero!")
Teveel variabelen Fout: def convert ( celsius ): fahrenheit = 9/5 * celsius + 32 return fahrenheit Goed: def convert ( celsius ): return 9/5 * celsius + 32
En verder het maken van een mooiere interface mag niet ten koste gaan van de overzichtelijkheid van je code random walk: netjes afsluiten
Hoofdstuk 11
Lijsten In andere talen: array Python lijsten zijn bijzonder: dynamisch: je hoeft niet te zeggen hoe lang een lijst is heterogeneous: je kunt verschillende soorten data in een lijst mixen mutable: je mag elementen veranderen
Wat kun je met lijsten concatenatie repetitie indexing lengte slicing iteratie lidmaatschaptest: if el in list:
Nog meer methoden voor lijsten lst.append(x) lst.sort() lst.sort(key=fun) lst.reverse() lst.index(x) lst.insert(i,x) lst.count(x) lst.remove(x) lst.pop() lst.pop(i)
>>> lst =[3,2,1,2,3,4] >>> lst. reverse () >>> lst [4, 3, 2, 1, 2, 3] >>> lst. sort () >>> lst [1, 2, 2, 3, 3, 4] >>> lst. index (3) 3 Nog meer methoden voor lijsten
>>> lst [1, 2, 2, 3, 3, 4] >>> lst. insert (5,0) >>> lst [1, 2, 2, 3, 3, 0, 4] >>> lst. count (2) 2 >>> lst. count (10) 0 >>> lst. remove (0) >>> lst [1, 2, 2, 3, 3, 4] Nog meer methoden voor lijsten
Sorteren lst = [( jan,3), ( piet,7),( anja,8)] >>> lst. sort () >>> lst [( anja, 8), ( jan, 3), ( piet, 7)]
Sorteren lst = [( jan,3), ( piet,7),( anja,8)] >>> lst. sort () >>> lst [( anja, 8), ( jan, 3), ( piet, 7)] >>> def arg2 ( pair ):... return pair [1]... >>> lst. sort ( key = arg2 ) >>> lst [( jan, 3), ( piet, 7), ( anja, 8)]
Sorteren >>> lst [( jan, 3), ( piet, 7), ( anja, 8)] >>> lst. sort ( key =arg2, reverse = True ) >>> lst [( anja, 8), ( piet, 7), ( jan, 3)]
Sorteren methode van lijsten: sort() alleen voor lijsten vervangt de huidige lijst door de gesorteerde built-in: sorted() voor elke data-structuur waar je over kunt itereren resultaat is een nieuwe lijst
Lijsten en dictionaries Lijsten zijn dus erg flexibel Erg handig om te gebruiken Maar: niet altijd de beste keus
Lijsten en dictionaries Lijsten zijn dus erg flexibel Erg handig om te gebruiken Maar: niet altijd de beste keus def lookup_word (w): """ for a given word w, find its part - of - speech """ words = [( de, det ),( het, det ), ( ik, pron ),( boek, noun )] for (word, tag ) in words : if w == word : return tag Python moet hier de hele lijst doorlopen om te controleren of het woord in de lijst voor komt. Dictionaries: een data-structuur waarbij je in 1 stap antwoord krijgt!
Dictionaries Belangrijk! Datastructuur waarmee je een waarde opzoekt voor een gegeven key. In andere talen wordt dit soms een hash of associatief array genoemd Opzoeken van een key is efficient
Dictionaries >>> mydict = { slaapt : ww, ik : pron, gisteren : bijwoord } >>> mydict [ ik ] pron >>> mydict [ jij ] = pron >>> mydict { ik : pron, gisteren : bijwoord, slaapt : ww, jij : pron } >>> mydict [ ik ] = pron1 >>> mydict { ik : pron1, gisteren : bijwoord, slaapt : ww, jij : pron }
Dictionaries Vaak gemaakt door 1 voor 1 de elementen toe te voegen Bijvoorbeeld: passwd = {} for line in sys. stdin : line = line. rstrip () user, pass = line. split () passwd [ user ] = pass
Dictionaries if mykey in mydict: mydict.keys() mydict.values() mydict.get(key,default) del mydict[key] mydict.clear() for el in mydict:
Dictionaries >>> mydict { ik : pron1, gisteren : bijwoord, slaapt : ww, jij : pron } >>> for key in mydict. keys ():... print ( key )... ik gisteren slaapt jij >>> for key in mydict. keys ():... print ( mydict [ key ])... pron1 bijwoord ww pron
Dictionaries: woordenteller mydict = {} for line in sys. stdin : words = line. split () for word in words : if word in mydict : mydict [ word ]= mydict [ word ]+1 else : mydict [ word ]=1
Dictionaries: woordenteller mydict = {} for line in sys. stdin : words = line. split () for word in words : mydict [ word ]= mydict. get (word,0)+1
Opdracht 1 deadline 8 januari Zelle hoofdstuk 11, opdracht 6. Er zijn betere manieren om dit te doen, maar voor deze opdracht volstaat de volgende aanpak. Deleer steeds een random element uit de bestaande lijst, en voeg die toe aan een nieuwe lijst, net zo lang tot de bestaande lijst leeg is. Zorg voor een main functie die als test een random shuffle van een lijst van afwisselend nullen en enen naar standard output schrijft, waarbij de lengte van de lijst gegeven wordt door het eerste command-line argument. Als n bijvoorbeeld 5 is, dan moet je een random shuffle van de lijst [0,1,0,1,0] genereren. Als n 2 is, moet je een random shuffle maken van de lijst [0,1]../random_shuffle 5 [0, 1, 0, 0, 1]./random_shuffle 2 [1,0]
Opdracht 2 deadline 8 januari Schrijf een programma dat een tekst van standard input leest en vervolgens de frequentie bijhoudt van alle trigrammen (sequenties van drie woorden) in de tekst. Alle trigrammen met hun frequentie moeten naar standard output worden geschreven, in volgorde van frequentie. Besteed geen aandacht aan punctuation. De dictionary die je nodig hebt, heeft als keys steeds een trigram, wat je in Python het beste als tuple van de drie woorden kan representeren. Een trigram telt alleen mee als de woorden op dezelfde regel staan. We gaan er bij deze opdracht van uit dat de tekst al getokenizeerd is: de leestekens zijn al gescheiden door spaties van de woorden. We beschouwen die leestekens zelf ook als woorden. Een voorbeeldbestand is: /net/corpora/eindhoven/cdb/cdb.zinnen. cat /net/corpora/eindhoven/cdb/cdb.zinnen./ex2.py head -n 5, dat de 74, die in 44 een van de 42, die de 40, dat het 39
Opdracht 3 BONUS deadline 8 januari Maximaal 5 punten (extra) Schrijf een programma dat een tekst van standard input leest en dat vervolgens alle woorden die voorkomen in de tekst op een bepaalde manier in een data-structuur opslaat. Je moet een geschikte data-structuur kiezen op basis van het volgende. Na het inlezen van de tekst moet een grafische interface worden gestart waarbij de gebruiker steeds een woord intypt (in de interface), en waarbij je dan alle contexten laat zien waarin dat woord is gebruikt in de tekst. De context bestaat steeds uit de twee woorden links en twee woorden rechts. Indien een woord meerdere keren in dezelfde context voorkomt moet je die context maar n keer op het scherm tonen, maar daarbij geef je dan wel aan hoevaak deze context voorkwam. De interactie stopt nadat de gebruiken op een quit button heeft geklikt.
Opdracht 3 voorbeeld Met bestand /net/corpora/eindhoven/cdb/cdb.zinnen en als zoekterm Tweede moet je een overzicht zoals dit krijgen: in de Tweede Kamer, 2 In de Tweede Kamer is 2 aan de Tweede Kamer uitgebrachte 1 dat de Tweede Kamer in 1 hebben de Tweede Kamerleden Schuring 1 in de Tweede Kamer. 1 in de Tweede Kamer aanwezige 1 in de Tweede Kamer drs. 1 in de Tweede Kamer medegedeeld 1 in de Tweede Kamer niet 1 in de Tweede Kamer voorstellen 1 in de Tweede Kamer wordt 1 In de Tweede Wereldoorlog werden 1 naar de Tweede Kamer hebben 1 op het Tweede Vaticaanse Concilie 1 sinds de Tweede Wereldoorlog heeft 1 tot de Tweede Wereldoorlog, 1 uit de Tweede Wereldoorlog zijn 1 van de Tweede Helmerstraat en 1 van de Tweede Kamer, 1 van de Tweede Kamer. 1 van de Tweede Kamer nog 1