Turtle commands, and the objects, dictionaries and classes from Objects with turtles.
Print a cheat sheet (the whole course or one unit, with a picture of what each command draws)
forward(100)
Example
forward(100)
Move the turtle forward. The number is how many steps.

id: forward
backward(100)
Example
backward(100)
Move the turtle backward without turning.

id: backward
right(90)
Example
forward(60)
right(90)
forward(60)
Turn clockwise by this many degrees.

id: right
left(90)
Example
forward(60)
left(90)
forward(60)
Turn anticlockwise by this many degrees.

id: left
goto(0, 0)
Example
goto(80, 60)
Jump to a position. (0, 0) is the centre; x goes right, y goes up.

id: goto
setheading(0)
Example
setheading(90)
forward(60)
Face a direction. 0 is right, 90 is up, 180 is left.

id: setheading
home()
Example
forward(80)
left(90)
forward(40)
home()
Go back to the centre, facing right.

id: home
penup()
Example
forward(40)
penup()
forward(40)
pendown()
forward(40)
Lift the pen so moving does not draw.

id: penup
pendown()
Example
forward(40)
penup()
forward(40)
pendown()
forward(40)
Put the pen down so moving draws again.

id: pendown
pensize(5)
Example
pensize(1)
forward(50)
pensize(8)
forward(50)
Set how thick the line is.

id: pensize
pencolor("red")
Example
pencolor("red")
forward(100)
Set the line colour, using a colour name.

id: pencolor
dot(20)
Example
dot(30)
hideturtle()
Draw a filled dot of this size.

id: dot
write("Hello")
Example
write("Hello", False, "left", ("Arial", 20, "normal"))
hideturtle()
Write text at the turtle's position.

id: write
fillcolor("blue")
Example
fillcolor("blue")
begin_fill()
circle(40)
end_fill()
Choose the colour to fill shapes with.

id: fillcolor
begin_fill()
end_fill()
Example
fillcolor("orange")
begin_fill()
for i in range(4):
forward(60)
right(90)
end_fill()
Everything drawn between these two lines is filled in.

id: begin-fill-end-fill
bgcolor("lightblue")
Example
bgcolor("lightblue")
forward(80)
Set the background colour.

id: bgcolor
hideturtle()
Example
forward(80)
hideturtle()
Hide the turtle so only the drawing shows.

id: hideturtle
speed(10)
How fast the turtle moves, from 1 (slow) to 10 (fast).
id: speed
clear()
Wipe the drawing.
id: clear
circle(50)
Example
circle(50)
Draw a circle with this radius.

id: circle
for i in range(4):
forward(100)
right(90)
Example
for i in range(4):
forward(100)
right(90)
Draw a square by repeating forward and right four times.

id: square-loop
for i in range(4):
pass
Example
for i in range(5):
forward(15)
penup()
forward(10)
pendown()
Repeat the indented lines this many times.

id: for-loop
while True:
pass
Example
r = 10
while r < 60:
circle(r)
r = r + 15
Repeat the indented lines for as long as the condition is true.

id: while-loop
name = input("What is your name? ")
print("Hello, " + name)
Example
name = input("What is your name? ")
print("Hello, " + name)
Ask a question, store the typed answer, and use it in a reply.

id: ask-and-reply
text = input("How many? ")
if text.isdigit():
number = int(text)
pass
else:
print("Please type a number.")
Example
text = input("How many tickets? ")
if text.isdigit():
print("That will be $" + str(int(text) * 12) + ".")
else:
print("Please type a number.")
Check typed text with isdigit before turning it into a number.

id: check-then-convert
total = 0
while total < 10:
total += int(input("Add: "))
Example
total = 0
while total < 10:
total += int(input("Add: "))
print("Total: " + str(total))
print("Done")
Start the total at 0 once, then add to it on every pass.
id: running-total
while True:
choice = input("1 add, 2 quit: ")
if choice == "1":
pass
elif choice == "2":
break
else:
print("Please choose 1 or 2.")
Example
total = 0
while True:
choice = input("1 add $5, 2 pay: ")
if choice == "1":
total += 5
elif choice == "2":
break
else:
print("Please choose 1 or 2.")
print("Pay $" + str(total))
A menu that keeps showing until a break runs.
id: menu-loop
if x > 0:
pass
else:
pass
Example
for x in [-90, -30, 30, 90]:
penup()
goto(x, 0)
if x > 0:
dot(30, "red")
else:
dot(30, "blue")
hideturtle()
Do one thing or the other, depending on a condition.

id: if-else
for i in range(8):
if i % 2 == 0:
pass
else:
pass
Example
for i in range(8):
if i % 2 == 0:
pencolor("red")
else:
pencolor("blue")
pensize(6)
forward(30)
right(45)
i % 2 == 0 is true on every second pass.

id: every-other
size = 50
Example
length = 120
forward(length)
left(90)
forward(length / 2)
Give a value a name, so you can reuse and change it.

id: variable
sides = 5
for i in range(sides):
forward(60)
right(360 / sides)
Example
sides = 6
for i in range(sides):
forward(60)
right(360 / sides)
Name the number of sides once; the turn is worked out from it.

id: named-turn
for i in range(20):
forward(i * 5)
right(90)
Example
for i in range(30):
forward(i * 5)
right(90)
Use the counter i to make each pass different.

id: counter-step
size = 5
for i in range(20):
forward(size)
right(90)
size = size + 5
Example
size = 5
for i in range(30):
forward(size)
right(90)
size = size + 5
Change a value every pass: read the old one, store a new one.

id: grow-value
colours = ["red", "blue", "green"]
Keep many values in order under one name. The first item is place 0.
id: list
for c in colours:
pass
Example
pensize(6)
for c in ["red", "blue", "green"]:
pencolor(c)
forward(40)
Work through a list, one item at a time.

id: for-each-item
def shape():
pass
shape()
Example
def zigzag():
left(45)
forward(30)
right(90)
forward(30)
left(45)
zigzag()
zigzag()
zigzag()
Name a group of steps, then run it by calling its name.

id: def-function
print("Hello")
Show text or a value in the output box.
id: print
import random
n = random.randint(1, 10)
Pick a random whole number between two values.
id: random-number
def stamp(x, y):
goto(x, y)
dot(20)
onscreenclick(stamp)
listen()
mainloop()
Example
def stamp(x, y):
goto(x, y)
dot(20)
penup()
stamp(-60, 30)
stamp(50, -20)
hideturtle()
Run a function every time the picture is clicked. It receives the click position.

id: onscreenclick
def go_up():
forward(20)
onkey(go_up, "Up")
listen()
mainloop()
Example
def go_up():
forward(20)
go_up()
go_up()
go_up()
Run a function every time a key is pressed. Click the picture first so it receives keys.

id: onkey
def tick():
forward(5)
ontimer(tick, 50)
tick()
mainloop()
Run a function again after a number of milliseconds. A function can start its own timer.
id: ontimer
n = numinput("Title", "How many?")
Ask for a number in a pop-up. The answer is None if the pop-up is cancelled.
id: numinput
name = textinput("Title", "Your name?")
Ask for text in a pop-up.
id: textinput
name = input("What is your name? ")
Show a question in the console, wait for an answer, and store what was typed. It is always text.
id: input
"Hello, " + name
Join pieces of text into one with +. Spaces only appear where they are inside the quotes.
id: join-text
str(score)
Turn a number into text, so it can be joined: "Score: " + str(score).
id: str
int(text)
Turn text made of digits, such as "12", into a whole number you can calculate with.
id: int
text.isdigit()
True if the text is all digits (0 to 9) and not empty, so int() will work on it.
id: isdigit
total += 1
Add to a variable: total += 5 is short for total = total + 5.
id: add-to
break
Leave the loop straight away; the program carries on after it.
id: break
star = Turtle()
star.shape("circle")
star.forward(50)
Make another turtle with its own name. Put the name and a dot in front of a command to give it to that turtle.
id: new-turtle
star = {"speed": 5, "points": 1}
Values stored under names (keys). One dictionary can hold everything about one thing.
id: dictionary
star["speed"]
The value stored under that key. The key goes in quotes. Assign to it to change it: star["speed"] = 8.
id: dictionary-value
class Star:
def __init__(self, x):
self.speed = 5
s = Star(100)
A new kind of object. __init__ runs when one is made; self.name = value stores a value in that object.
id: class
def move(self):
self.turtle.forward(self.speed)
A function inside a class. Call it on one object: star.move(). self is that object.
id: method
command = command.strip().lower()
strip() removes spaces at the ends; lower() and upper() change the capitals. Each gives back new text.
id: strip-and-lower
words = command.split()
Cut text into a list of words at the spaces: "go north".split() is ["go", "north"].
id: split
if item in bag:
pass
True if the item is in the list (or the key is in the dictionary, or the letters are in the text).
id: in
", ".join(bag)
Join a list of texts into one, with the text in quotes between each: "lamp, key".
id: join
bag.remove("lamp")
Take an item out of a list. It stops with a ValueError if the item is not there, so check with in first.
id: remove-from-a-list
items.sort()
Put a list in order (A to Z, or smallest first). It changes the list itself.
id: sort
try:
n = int(text)
except ValueError:
print("That is not a number.")
Run lines that might fail. If the named error happens, the except lines run instead of the program stopping.
id: try-and-except
with open("save.txt", "w") as f:
f.write(text)
"w" makes the file, or empties it first if it is already there, then writes. with closes the file at the end.
id: write-a-file
with open("save.txt") as f:
text = f.read()
Opens the file to read and gives you all of it as one piece of text.
id: read-a-file
import json
with open("game.json", "w") as f:
json.dump(game, f)
Writes a dictionary or list to a file as JSON text.
id: save-with-json
import json
with open("game.json") as f:
game = json.load(f)
Reads JSON text back into the dictionary or list that was saved.
id: load-with-json
try:
with open("save.txt") as f:
text = f.read()
except FileNotFoundError:
print("There is no save yet.")
The first time, there is no file: catch FileNotFoundError instead of stopping.
id: a-missing-file
import csv
with open("music.csv") as f:
rows = list(csv.DictReader(f))
Each row of the file becomes a dictionary, keyed by the column names in the first line. Every value is text.
id: read-a-csv
counts = {}
for row in rows:
key = row["genre"]
if key in counts:
counts[key] = counts[key] + 1
else:
counts[key] = 1
One count for each different value: add 1 if the key is there already, or start it at 1.
id: count-with-a-dictionary
print(label.ljust(12) + "#" * n)
"#" * 5 is #####. ljust pads the label to the same width, so the bars line up.
id: a-text-bar
assert clean_hours("5") == 5
A test case: nothing happens if it is true; the program stops with AssertionError if it is not.
id: test-with-assert
import pandas as pd
songs = pd.read_csv("music.csv")
Reads the whole file into a table (a DataFrame). Numbers stay numbers.
id: read-a-csv-with-pandas
rows = songs[songs["genre"] == genre]
Keeps the rows where the test is true, as a smaller table.
id: filter-a-table
import gradio as gr
def answer(choice):
return "You chose " + choice
gr.Interface(fn=answer, inputs=gr.Dropdown(["pop", "rock"]), outputs="text").launch()
Gradio calls your function with what was chosen, and shows what it returns.
id: an-app-with-gradio
{"q": "What is 7 x 8?", "choices": ["54", "56", "64"], "answer": "56"}
inputs.append(gr.Radio(q["choices"], label=q["q"]))
A question as a dictionary, and a Radio input made from it: the student picks one of the choices, and the function gets that text.
id: a-quiz-question
import requests
try:
reply = requests.get("https://api.open-meteo.com/v1/forecast", params={"latitude": -35.28, "longitude": 149.13, "daily": "temperature_2m_max"}, timeout=10).json()
except requests.RequestException:
print("No connection")
Asks an API at that address (params become the ?query string) and turns the JSON reply into dictionaries and lists. Plan for no connection.
id: ask-an-api
@app.route("/about")
def about():
return "<h1>About</h1>"
Joins an address to a function. What the function returns is the page.
id: a-flask-route
PAGE = """<ul>
{% for m in members %}
<li>{{ m["name"] }}</li>
{% endfor %}
</ul>"""
return render_template_string(PAGE, members=members)
A template is HTML with gaps: {{ }} shows a value, {% for %} repeats a part for each item.
id: a-page-from-a-template
@app.route("/group/<name>")
def group(name):
return "You asked for + name
<name> matches any word in that place of the address, and is passed to the function.
id: an-address-with-a-part-that-changes
@app.route("/join", methods=["POST"])
def join():
name = request.form["name"].strip()
A form with method='post' sends each box that has a name='...' attribute. request.form looks them up by that name.
id: read-a-form
return redirect("/")
Sends the browser on to another address, such as back home after a form.
id: go-to-another-page
with open("members.csv", "a", newline="") as f:
csv.writer(f).writerow([name, group])
"a" adds to the end of the file instead of emptying it. Each list becomes one row.
id: add-a-row-to-a-csv
@app.route("/api/members")
def api_members():
return {"members": members}
Return a dictionary and Flask sends it as JSON, for other programs to read.
id: send-json
@api.get("/year")
def year(y: int):
return {"next": y + 1}
The type after each parameter (int, str, float) is checked: a wrong value gets an error reply (422) before your code runs.
id: a-fastapi-route
random.seed(1)
random.shuffle(penguins)
train = penguins[:250]
test = penguins[250:]
Shuffle, then keep some examples back. Train on one part; test only on the other.
id: test-a-model
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=1)
model = KNeighborsClassifier(n_neighbors=1)
model.fit(X_train, y_train)
print(model.score(X_test, y_test))
fit learns from the training examples; score tests on the held-back ones (1.0 is 100%).
id: train-and-score-a-model
mystery = pd.DataFrame([[47.0, 215.0]], columns=X.columns)
print(model.predict(mystery)[0])
The new example needs the same columns, in the same order, as the training data.
id: predict-with-a-model