729G04 Programmering och diskret matematik729G04/lectures/python4-ht2015.pdf · ⁃ Lista: [1, 2,...

Preview:

Citation preview

729G04 Programmering ochdiskret matematikFöreläsning 4

Turtle Graphics

LOGO⁃ LOGO:programmeringsspråkföranvändninginomundervisning1967avPapertochFeurzeig

⁃ SpråketärsläktmedLISP,mensom"utenhet"hademanbl.a.möjlighetattstyraensköldpadda.

⁃ Sköldpaddanhadeävenen"penna"somdenkundehöjaochsänka.

The robot

Trådlös variant

Modern variant

Valiant Technology Ltd.

Turtle Graphics⁃ AttritamedhjälpavensköldpaddasommanstyrmedhjälpavkommandonbrukarmankallaförTurtleGraphics.

⁃ Mansersköldpaddanuppifrånochkangedenkommandon

⁃ PythonharenmodulsomlåterosshållapåmedTurtleGraphics.

Kommandon man kan ge till sköldpaddan⁃ Gå frammåt

⁃ Backa⁃ Sväng vänster⁃ Sväng höger⁃ Dra upp pennan

⁃ Sätt ner pennan

http://el.media.mit.edu/logo-foundation/logo/turtle.html

Pythons turtle-modul

Förflyttning av sköldpaddan⁃ fd(avstånd):flyttasköldpaddanframmåtettvisstavstånd

⁃ bk(avstånd):flyttasköldpaddanbakåtettvisstavstånd⁃ lt(grader):svängvänsterettvisstantalgrader⁃ rt(grader):svänghögerettvisstantalgrader

En fyrkantimport turtle

screen = turtle.Screen()screen.setup(width=600, height=600)turtle.mode("logo")turtle.showturtle()

turtle.fd(100)turtle.rt(90)turtle.fd(100)turtle.rt(90)turtle.fd(100)turtle.rt(90)turtle.fd(100)

importera modulen

skapa en ritytasätt storleken på ritytananvänd LOGO-standard för riktningvisa sköldpaddan

gå framåt 100 stegsväng höger 90 gradergå framåt 100 stegsväng höger 90 gradergå framåt 100 stegsväng höger 90 gradergå framåt 100 steg

En fyrkant

framåt

En fyrkant

vänster

En fyrkant

framåt

En fyrkant

vänster

En fyrkant

framåt

En fyrkant

vänster

En fyrkant

framåt

En fyrkant

Demo av pennan, förflyttning, position och riktning

Olika sätt att importera modulerimport turtle

screen = turtle.Screen()turtle.showturtle()

turtle.fd(100)turtle.rt(90)turtle.fd(100)turtle.rt(90)turtle.fd(100)turtle.rt(90)turtle.fd(100)

from turtle import *

screen = Screen()showturtle()

fd(100)rt(90)fd(100)rt(90)fd(100)rt(90)fd(100)

Kan vi stoppa in detta i en loop?

Kan vi få sköldpaddan att röra sig slumpmässigt?

Sköldpaddan ritar på ritytan med en penna⁃ Sköldpaddan har enpenna som kan höjas och sänkas.

⁃ Denär nere från början.

⁃ pd():sätt ner pennan

⁃ pu():dra upp pennan

Koordinatsystem och riktning

(0, 0)

(-, +) (+, +)

(+, -)(-, -)

Sköldpaddan och koordinater⁃ pos() returnerar entupel (x, y) där x och y är flyttal

⁃ setpos(x, y) flyttar sköldpaddan tillpositionen(x, y) där x och y är flyttal.

⁃ OBS! setpos() "teleporterar"inte sköldpaddan,dvs attompennan är nere kommer det att bli ett streck.

Ja, tupler finns i Python också...⁃ Lista:[1, 2, 3]⁃ Tupel:(1, 2, 3)⁃ Denstora skillnaden mellan listor och tupler i Pythonäratt maninte kan ändra på entupel.

⁃ Datatyper sommaninte kan ändra värdet på kallas"immutable"

⁃ Datatyper mankan ändra värde på kallas "mutable"

Tupel-exempel

Går inte att ändra på en tupel

>>> a = [1, 2, 3]>>> b = (1, 2, 3)>>> a[0] = 4>>> b[0] = 4Traceback (most recent call last):

File "<stdin>", line 1, in <module>TypeError: 'tuple' object does not support item assignment>>>

Riktning

Riktning i världen

90°0°

90°

mode("standard") mode("logo")

Sköldpaddan vet vilken riktning den tittar åt⁃ mode("logo")

⁃ 0˚är norrut⁃ 90˚graderär österut⁃ gradantalet ökar medurs

⁃ heading() returnerar ett flyttal som berättar gradantalethosdenriktning manstår åt

⁃ seth(d) där d är ett flyttal,ställer insköldpaddansriktning

Cirkelrörelse

Exempel på anrop till circle()

circle(40) circle(-40) circle(40, 90) circle(40, 180, 4)

Cirkelrörelse⁃ circle() kan taett tilltre argument

⁃ circle(40) flyttar sköldpaddan moturs i encirkel medradien 40

⁃ circle(-40) ger enrörelse i medurs riktning

⁃ circle(40, 90) avbryter rörelsen efter 90grader

⁃ circle(40, 90, 2) säger att sköldpaddan kommerdela upp rörelsen i två raksträckor.

Refaktoriseringatt skriva omkod för att göra denbättre utan att ändra pådess beteende

Exempel och refaktorisering⁃ Någraexempelpåvadmankangöramedturtle-modulensamtgenomgångavrefaktoriseringgenomgeneraliseringochinkapsling

⁃ Inkapsling:Attkapslainensekvensavuttryckochsatserienfunktion

⁃ Generalisering:Attgöraenfunktionmergenerellgenomattspecificerabeteendenmedhjälpavparametrar/argument

Refaktorisering (refactoring)⁃ Förbättringavkoddockmedbibehållenfunktionalitet.

⁃ Förbättringenkanavseunderhåll

lättlästhet

⁃ Inteattförväxlamedoptimeringsomharmedförbättringavprestandaattgöra.Bådakandockinträffasamtigt.Optimeringkommerpånästaföreläsning.

Exempel på refaktoriseringdef get_number_of_children(name):

if name == "Ada":return 1

elif name == "Bean":return 3

elif name == "Cecil":return 1

elif name == "Dan":return 2

elif name == "Eliza":return 2

elif name == "Frodo":return 0

elif name == "Garfield":return 0

def get_number_of_children(name):if name in ["Frodo", "Garfield"]:

return 0elif name in ["Ada", "Cecil"]:

return 1elif name in ["Dan", "Eliza"]:

return 2elif name in ["Bean"]:

return 3

När ska man refaktorisera?⁃ När koden luktar illa - exempel på dålig lukt:

redundantkod,t.ex.kod som upprepas eller kod som inte görnågot

långa funktioner

väldigtmånga parametrar skickas tillenfunktion

enfunktion som gör för lite

variabelnamn eller funktionsnamnsom harmissvisande namn

komplexavilkor i koden

Olika sätt att refaktorisera⁃ Hitta loopar⁃ Kapsla in(bryt ut tillfunktioner)⁃ Generalisera (gör koden mer generell,ofta funktioner)

Bryta ut en funktion / inkapslingprint "Hi Ben!"print "I am happy!"

# Inkapsling: Att kapsla in en sekvens av # uttryck och satser i en funktion.

def greet_ben():print "Hi Ben!"print "I am happy!"

Varför är detta bra? Återanvändning!

def greet_ben():print "Hi Ben!"print "I am happy!"

greet_ben()greet_ben()

Generalisering av funktion⁃ Att gå från enfunktion som utför enspecifik uppgift,tillenfunktion som är mer flexibel medavseende på beteendegenom att införa parametrar

Generaliseringdef greet_ben():

print "Hi Ben!"print "I am happy!"

# Vi gör funktionen mer generell så# att den kan hälsa på vilket namn som helst

def greet(name):print("Hi " + name + "!")print("I am happy!")

Sick sack

⁃ Vivill producera ovanstående mönster.

⁃ Kom ihåg:programmering är eniterativ aktivitet!Vigör ett stegi taget.

Vi provar att refaktoriserahttps://www.ida.liu.se/codela/as/729g04d/sicksack

Sick sackfrom turtle import *

screen = Screen()mode("logo")

fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)

fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)

fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)

Sick sack – vi ser en loopfrom turtle import *

screen = Screen()mode("logo")

fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)

fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)

fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)

for i in range(3):fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)

Sick sack – inkapslingfor i in range(3):

fd(100)rt(90)fd(10)rt(90)fd(100)lt(90)fd(10)lt(90)

# Vi hittar delar av koden vi kan göra om # till funktioner

def make_right_l():fd(100)rt(90)fd(10)rt(90)

def make_left_l():fd(100)lt(90)fd(10)lt(90)

for i in range(3):make_right_l()make_left_l()

Sick sack – inkapsling och generaliseringdef make_right_l():

fd(100)rt(90)fd(10)rt(90)

def make_left_l():fd(100)lt(90)fd(10)lt(90)

for i in range(3):make_right_l()make_left_l()

# Vi kapslar in loopen och generaliserar# den på samma gång

def make_right_l():fd(100)rt(90)fd(10)rt(90)

def make_left_l():fd(100)lt(90)fd(10)lt(90)

def zig_zag(n):for i in range(n):

make_right_l()make_left_l()

zig_zag(3)

Sick sack – inkapsling och generalisering# Vi kapslar in loopen och generaliserar# den på samma gång

def make_right_l():fd(100)rt(90)fd(10)rt(90)

def make_left_l():fd(100)lt(90)fd(10)lt(90)

def zig_zag(n):for i in range(n):

make_right_l()make_left_l()

zig_zag(3)

# Vi skapar en funktion som ritar ut tv� segment med en b�j

def two_segments(angle, segment1, segment2):fd(segment1)rt(angle)fd(segment2)rt(angle)

def make_right_l():two_segments(90, 100, 10)

def make_left_l():two_segments(-90, 100, 10)

def zig_zag(n):for i in range(n):

make_right_l()make_left_l()

zig_zag(3)

Uppgift: Stjärnan

⁃ Vivillritaensånhärfigur⁃ Hur?Delauppproblemet,hittamönster,görsammasakfleragånger?

Rita en stjärna

def draw_line_and_return():"""Rita ett streck p� 50 enheter och �terv�nd till

startpositionen."""fd(50)bk(50)

def draw_star():"""Rita ut en stj�rna med fem armar"""for line in range(5):

draw_line_and_return()rt(360.0/5)

draw_star()

Debugga med spårutskrifter

Att hitta vad som går fel⁃ skrivutvärdenpåvariablerpålämpligtställeikoden

⁃ print("x:",x)

Med spårutskrifter

def draw_line_and_return(length):"""Rita ett streck och �terv�nd till startpositionen."""# Spr�rutskriftprint("Drawing line, length:", length)fd(length)bk(length)

def draw_star(points, length):"""Rita ut en stj�rna med fem armar"""for line in range(points):

# Skriv ut vilket streck vi ligger p� print("line:", line)draw_line_and_return(length)rt(360.0/points)

Visualisering av nästlad loop

Stjärna med stjärnor

Stjärna med stjärnor

Labb 4⁃ Tillämpningavfunktioner,looparochsköldpaddor

⁃ Labb4-8görsipar⁃ Anmälertillnyapargrupperhttps://www.ida.liu.se/webreg/729G04-2014/PARLABB

Angry Turtles

Angry Turtles⁃ Fåglarharstulitsköldpaddornasäggochsköldpaddornahämnasgenomattskjutaivägsigsjälvapåenmåltavla.

⁃ Användarengerstyrkaochvinkel⁃ Speletritaruthursköldpaddanflygerivägochkollaromsköldpaddanträffarmålet.

Exempel

Angry Turtles - innan spelet kan börja⁃ Innanvispeletkanbörjamåstevigöraföljande

Ställainritytan

Bestämmavarmåltavlanskavara

Ritautmåltavlan

Placerasköldpaddanistartposition

Angry Turtles - själva spelet⁃ Spelarenbörjarmedt.ex.1000poäng⁃ Spelloop

Frågaanvändarenparametrar:styrkaochevvinkel- användinput()Förflyttasköldpaddanliteitaget(loop)⁃ förflyttningenbaseraspåangivenstyrka(ochevvinkel)⁃ avbrytloopen(break)närsköldpaddannuddatmarken(ellerärundermarken),dvskollaomy<=0.

Kollaavståndettillmåltavlan⁃ Omsköldpaddanärtillräckligt näramåltavlan- berättadet,visapoängochfrågaomspelarenvillspelaigen.

⁃ Omsköldpaddan varförlångtifrånmåltavlan- berättadetochdraifrånpoäng

Recommended