Stap 6: Een ruimtemannetje (return)
Deze stap gebruikt return, uit Return.
spiegelrij doet twee dingen tegelijk: hij draait een regel om, en hij tekent.
Of het omdraaien goed gaat, zie je pas aan de tekening. Een functie die alleen
omdraait en het spiegelbeeld teruggeeft, kun je los testen met print. En wat
hij teruggeeft, kun je gebruiken op elke plek waar een tekst mag staan.
Zo ziet een functie eruit die een tekst teruggeeft:
def dubbel(regel):
return regel + regel
print(dubbel("#."))
Uitvoer:
#.#.
dubbel print zelf niets. Hij plakt de tekst twee keer aan elkaar en geeft
het resultaat terug, en print laat het zien. In plaats van printen kun je
het resultaat ook doorgeven aan een andere functie, zoals rij.
Opdracht: een ruimtemannetje
Plak je programma uit stap 5 in het veld. Ben je het kwijt, neem dan de oplossing van stap 5.
Schrijf een functie spiegel(regel) die het spiegelbeeld van regel
teruggeeft, en niets tekent. Test hem eerst los: print(spiegel("BYR")) moet
RYB geven.
Teken daarna dit ruimtemannetje, met in de loop over de lijst een aanroep van
rij met de regel en zijn spiegelbeeld aan elkaar. spiegelrij heb je dan
niet meer nodig. Kopieer de lijst naar je programma, en laat de vlinder
staan: die heb je in stap 7 weer nodig. De bovenste regel begint op
(-120, 80).
ruimtemannetje = [
"..G...",
"...G..",
"..GGGG",
".GG.GG",
"GGGGGG",
"G.GGGG",
"G.G...",
"...GG.",
]
# Plak hier je programma uit stap 5
Klik hier voor een tip.
Het opbouwen van het spiegelbeeld neem je over uit spiegelrij. Alleen tekent
spiegel niets: als de loop klaar is, geeft hij het spiegelbeeld terug. In de
loop over het ruimtemannetje plak je de regel en wat spiegel van die regel
teruggeeft aan elkaar, en dat geef je aan rij.
Klik hier voor de oplossing.
import turtle
def vakje(x, y, kleur):
turtle.penup()
turtle.goto(x, y)
turtle.fillcolor(kleur)
turtle.begin_fill()
for zijde in range(4):
turtle.forward(20)
turtle.left(90)
turtle.end_fill()
def rij(regel, x, y):
for teken in regel:
if teken != ".":
vakje(x, y, kleuren[teken])
x = x + 20
def spiegel(regel):
omgedraaid = ""
for teken in regel:
omgedraaid = teken + omgedraaid
return omgedraaid
kleuren = {"#": "black", "R": "red", "G": "green", "Y": "yellow", "B": "blue"}
vlinder = [
"....#..",
".....#.",
"BBB...#",
"BYYB..#",
"BYRYB.#",
"BYYYBB#",
".BBBBB#",
"...BBB#",
"..BYYB#",
".BYRYB#",
".BYYB.#",
"..BB...",
]
ruimtemannetje = [
"..G...",
"...G..",
"..GGGG",
".GG.GG",
"GGGGGG",
"G.GGGG",
"G.G...",
"...GG.",
]
print(spiegel("BYR"))
turtle.hideturtle()
y = 80
for regel in ruimtemannetje:
rij(regel + spiegel(regel), -120, y)
y = y - 20
spiegel geeft een tekst terug, dus regel + spiegel(regel) is ook een
tekst: de regel met zijn spiegelbeeld erachter. Die gaat in één keer naar
rij.
Er gaat iets mis
print(spiegel("BYR")) geeft B, en van het ruimtemannetje zie je alleen
de linkerhelft, met hier en daar één vakje ernaast.
Oorzaak: return omgedraaid springt even ver in als de regel erboven, en
staat dus in de loop. Een return stopt de functie meteen, al in de eerste
ronde, als omgedraaid pas één teken heeft.
Oplossing: laat return omgedraaid even ver inspringen als de for. Dan
komt hij pas aan de beurt als de loop klaar is.
def spiegel(regel):
omgedraaid = ""
for teken in regel:
omgedraaid = teken + omgedraaid
print(omgedraaid)
regel = "BYR"
print(regel + spiegel(regel))
TypeError: can only concatenate str (not "NoneType") to str
Oorzaak: spiegel print het spiegelbeeld, maar geeft het niet terug.
Een functie zonder return geeft None terug, en tekst plus None kan
Python niet aan elkaar plakken.
Oplossing: vervang print(omgedraaid) door return omgedraaid.
Kopieer je programma voordat je verdergaat: de editor bewaart het niet.
Door naar stap 7: groot en klein.