Les 7
Heb je de moeilijke opdracht uit Les 6 gemaakt?
Het eerste gedeelte was niet zo heel moeilijk, denk ik. Je moest de computer laten vragen tot hoever hij de tafel moest uitrekenen. Ik had het zo opgeschreven:
totenmet = input('Tot hoever? Tot en met ')
Hier mag degene die het programma gebruikt dus typen tot hoever de tafel moet gaan, en dat wordt dan in de variabele totenmet
gestopt.
Daarna moest je ervoor zorgen dat de computer de tafel ook inderdaad tot daar ging uitrekenen. Misschien had je je zoiets gedaan:
for i in range(1, totenmet):
Maar als je het programma dan uitvoert gaat het net niet helemaal goed:
Welke tafel wil je zien? De tafel van 5 Tot hoever? Tot en met 3 De tafel van 5 1 x 5 = 5 2 x 5 = 10
Ik vroeg toch tot en met drie?
Weet je nog dat range(1, 11)
tot en met tien telt? range()
maakt altijd een lijstje tot, maar niet tot en met het laatste getal. Als je dat getal erbij wil hebben moet je aan range()
dus 1
meer meegeven.
Je kan het op een paar verschillende manieren oplossen. Hier laat ik er een paar zien.
Oplossing 1.
getal = input('Welke tafel wil je zien? De tafel van ') totenmet = input('Tot hoever? Tot en met ') print 'De tafel van', getal for i in range(1, totenmet + 1): print i, 'x', getal, '=', i * getalIn deze oplossing heb ik een trucje gedaan mat range. Ik zeg tegen range niet: ‘maak een lijstje tot
totenmet
‘, maar ik vraag: ‘Kun je een lijstje maken tot eentje hoger dantotenmet
.’ En dat is precies goed: Als de gebruiker bijvoorbeeld10
heeft getypt, gaatrange()
to11
, en dat betekent dat hij stop bij…10
!
Oplossing 2.
getal = input('Welke tafel wil je zien? De tafel van ') totenmet = input('Tot hoever? Tot en met ') tot = totenmet + 1 print 'De tafel van', getal for i in range(1, tot): print i, 'x', getal, '=', i * getalIn deze oplossing hebben we twee variabelen voor de range:
totenmet
is wat we aan de gebruiker vragen, en dan maken wetot
, en die geven we de waardetotenmet + 1
. Dus alstotenmet
10
is, wordttot
vanzelluf elluf. En daarna gebruiken wetot
in de haakjes bijrange()
.
Oplossing 3.
getal = input('Welke tafel wil je zien? De tafel van ') tot = input('Tot hoever? Tot en met ') + 1 print 'De tafel van', getal for i in range(1, tot): print i, 'x', getal, '=', i * getalBij deze oplossing moet je heeeeel goed kijken wat ik heb gedaan. Zie je het?
Er staat
tot = input('Tot hoever? Tot en met ') + 1
Dus de computer denkt: ‘Even vragen wat de gebruiker wil. Aaah, daar is het: 10. Nu doen we dat + 1, dus 11. En dan stoppen we het in het doosje
tot
. En inrange()
gebruiken wetot
, niettotenmet
.
Oplossing 4.
getal = input('Welke tafel wil je zien? De tafel van ') totenmet = input('Tot hoever? Tot en met ') print 'De tafel van', getal for i in range(1, totenmet): print i, 'x', getal, '=', i * getal print totenmet, 'x', getal, '=', totenmet * getalDeze oplossing is een beetje dom. We laten de
for
-lus gewoon te vroeg eindigen, en dan schrijven we er nog een regel achteraan om de laatste som te maken.Zie je overigens dat die extra regel niet meer naar binnen staat? Zo ziet de computer dat die niet meer bij de
for
-lus hoort. Want anders wordt-ie ook 10 keer gedaan. Of 23 keer. Of 1000 keer.
Oplossing 5.
getal = input('Welke tafel wil je zien? De tafel van ') tot = input('Tot hoever? Wil je alsjeblieft 1 meer typen dan hoever je eigenlijk wil, dus als je tot en met tien wil type je elf. Tot ') print 'De tafel van', getal for i in range(1, tot): print i, 'x', getal, '=', i * getalDe laatste oplossing is eigenlijk niet echt een oplossing: we vragen gewoon aan de gebruiker om het op te lossen. Het werkt wel, natuurlijk, maar het is leuker om de computer het werk te laten doen, in plaats van de gebruiker.
Ik vind oplossing 1 eigenlijk het beste. Wat vind jij? En welke oplossing had jij bedacht?
Zoveel zielen, zoveel gedachten
Zoveel zielen, zoveel gedachten. Dat betekent: verschillende mensen denken verschillende dingen. En zo is het ook vaak met programmeurs: verschillende programmeurs bedenken verschillende oplossingen voor hetzelfde probleem. Dat maakt het best wel een beetje ingewikkeld, want als je het programma van een andere programmeur leest moet je dus begrijpen wat hij of zij bedacht had. Dat zag je wel bij alle programmaatjes hierboven: ik moest een heleboel uitleggen om je te laten begrijpen hoe ik het had gedaan.
Het belangrijkste is om te onthouden: een goede programmeur is een luie programmeur. Ze zeggen ook wel: Alles Lekker Lui Eenmaal Schrijven. Dat is het omgekeerde van Nodeloos Iets Eigenlijk Tweemaal Schrijven. In de vierde oplossing hadden we de print
-regel eigenlijk twee keer geschreven; da’s niet zo goed. En voor we de for
-lus kenden schreven we die regel zelfs tien keer. Maar vanaf nu gaan we Alles Lekker Lui Eenmaal Schrijven.
De afkorting van Alles Lekker Lui Eenmaal Schrijven is A.L.L.E.S. De afkorting van Nodeloos Iets Eigenlijk Tweemaal Schrijven is N.I.E.T.S. Als je programmeert is A.L.L.E.S. beter dan N.I.E.T.S.
Opdrachten
Hieronder volgen een paar programmaatjes die een beetje N.I.E.T.S. zijn. Niet zo goed dus. Kun je ze verbeteren zodat ze A.L.L.E.S. zijn?
Start cmd
maar, en type notepad alles.py
. Je kunt alle programmaatjes achter elkaar typen; de computer doet ze dan allemaal achter elkaar. Voor deze oefeningen is dat prima!
print 'aapje' print 'aapje' print 'aapje' print 'aapje' print 'oooooolifantje' print 'Altijd is kortjakje ziek' print 'midden in de week maar zondag niet' print 'Zondag gaat zij naar de kerk' print 'met een boek vol zilverwerk' print 'Altijd is kortjakje ziek' print 'midden in de week maar zondag niet' getal = 4 print 'Tel er veertig bij op' print getal + 40 print 'Trek er twintig af' print getal + 40 - 20 print 'Doe er weer zeven bij' print getal + 40 - 20 + 7
Voer je ze ook even uit, met python alles.py
? Dan kun je zien of het ook echt werkt, wat je hebt bedacht!
Wat heb je geleerd?
Dit was wel weer een moeilijke les. Maar je hebt een paar heel belangrijke dingen geleerd.
- Je programma kan nu vragen welke tafel je wilt laten zien, maar ook tot hoever.
- De computer kan rekenen met variabelen op allerlei plekken, bijvoorbeeld in
range(1, totenmet + 1)
. - Je kan nieuwe variabelen maken met behulp van oude variabelen, bijvoorbeeld
tot = totenmet + 1
. - Het is leuker om de computer slim te laten zijn dan de gebruiker.
- De regels die naar binnen staan horen bij de
for
-lus. De regels die weer gewoon staan horen er niet meer bij. - Soms zijn er een heleboel oplossingen voor hetzelfde probleem.
- A.L.L.E.S. is beter dan N.I.E.T.S.
Tot de volgende keer maar weer!
Dion
beste dion ik gebruik http://www.codeacedemy.com dat werkt ook goed
Beste Dion.
Bij de eerste opdracht heb ik om oooooolifantje te krijgen dit geschreven; print ‘o’*6,’lifantje’, ik krijg dan alleen oooooo lifantje, dus een spatie tussen de o en de l. Ik kan nergens meer een spatie vinden. Heb jij een idee hoe ik dit kan verhelpen?
Wat goed dat je ook de o’s van olifantje niet gewoon typt! Dat had ik nog niet eens bedacht.
De truc om een string te vermenigvuldigen zorgt ervoor dat je 6 o’s krijgt. Maar wist je dat je strings ook kan optellen? Daarmee kan je het oplossen.
Succes,
Dion
Graag deel ik mijn oplossing zodat je deze kan beoordelen of het logisch is. Daarnaast ben ik benieuwd naar andere gedachtengangen. Kan ik mijn oplossing hier delen?
Ik heb geprobeerd om tussen ‘aapje’ en volgende ‘aapje’ er een enter tussen te krijgen maar dat lukte niet. weet jij een manier?
beste Dion
bij opdracht 2 heb ik eerst Kortjakje in een tekstbestand geschreven
en daarna dit ingevuld in alles.py:
Kortjakje = open(“kortjakje.txt”, “r”)
for i in Kortjakje:
print(i)
maar dan krijg ik:
altijd is kortjakje ziek
midden in de week maar zondags niet
zondags gaat zij naar de kerk
met een boek vol zilverwerk
altijd is kortjakje ziek
midden in de week maar zondags niet
🙂 Dat is een leuke oplossing, en je maakt ook nog gebruik van een lus!
print
gaat altijd naar de volgende regel, maar in je tekstbestand staat ook een regelovergang, vandaar dat-ie twee keer naar de volgende regel gaat.als je de print-regels zo maakt:
print i,
… dan zal
print
geen regelovergang doen. En dan gaat het dus precies goed…Beste dion
Als ik mijn bestand voor de tafels uit opdracht 6 doe:
getal = input(‘Welke tafel wil je zien? De tafel van: ‘)
for i in range(1, 11):
print(i ,’x’, getal, ‘=’,i * getal)
krijg ik als output
1×1 = 1
2×1 = 11
3×1 = 111
4×1 = 1111
5×1 = 11111
etc….
Dus bij deze les met als codering:
getal = input(‘Welke tafel wil je zien? De tafel van ‘)
totenmet = input(‘Tot hoever? Tot en met ‘)
tot = totenmet + 1
print(‘De tafel van’, getal)
for i in range(1, tot):
print(i, ‘x’, getal, ‘=’, i * getal)
ik na Tot hoever? tot en met ….
Traceback \:
File “C:\Users\Lex\print.py”, lane 3 in
tot = totenmen + 1
TypeError: Can’t convert ‘int’ object to str implicity
Dit komt denk ik omdat hij de input als een string leest en ze daarom bij elkaar optelt of zegt niet +1 te kunnen doen maar hoe los ik dit op?
Daarnaast liep ik bij les 1 ook al tegen het probleem aan dat ik bij elke print haakjes moet zetten en dan typen anders krijg ik “SyntaxError: Missing parentheses in call to ‘print’ ”
Ik weet dus niet hoe ik dit moet oplossen zou jij mij mischien verder kunnen helpen?
Vriendelijke groet,
lex
Ik denk dat je Python 3 hebt geïnstalleerd in plaats van Python 2.7. Er zijn wat verschillen tussen Python 2 en 3, met name hoe het
print
-commando werkt en… hoeinput()
werkt!De makkelijkste oplossing voor nu is om overal waar in de voorbeelden
input("blabla")
staat, dit te vervangen dooreval(input("blabla"))
. Let op de haakjes!Je kunt natuurlijk ook Python 2.7 installeren…
Succes,
Dion
Klopt. String converteren naar int: tot = int(totenmet) + 1
Dan werkt het wel.
getal=input(‘welke tafel wil je zien? de tafel van ‘)
print ‘wat een rot tafel ‘
for i in range(1, input(‘en tot hoe ver ‘)+1):
print i, ‘x’,getal, ‘=’, i*getal
for f in range(1, 5):
print ‘aapje’
print 6* ‘o’ + ‘lifantje’
a=’altijd is kortjakje ziek’
b=’midden in de week maar zondag niet’
print a
print b
print ‘zondag gaat zij naar de kerk’
print ‘met een boek vol zilverwerk’
print a
print b
getal=input(‘voer een getal in ‘)
print ‘nu tellen we er 27 bij en dan wordt het’, getal+27
volgens mij kan dat van kortjakje nog korter, maar hoe kan ik print a en print b samenvoegen?
of deze kan ook
getal = input (‘Welke tafel wil je zien? De tafel van ‘)
for i in range(1,input(‘Tot hoever? ‘)+1):
print i, ‘x’,getal, ‘=’, i * getal
getal = input (‘Welke tafel wil je zien? De tafel van ‘)
for i in range(1,input(‘Tot hoever? ‘)+1):
print i, ‘x’,getal, ‘=’, i * getal
Hoi Dion, moet bij de opdracht print aapje het woord aapje 4 x achter elkaar geschreven worden of onder elkaar.
Dit is mijn code: print 4 * ‘aapje’ + ‘oooolifantje’ of kan de code nog korter?