'Shorten a Python turtle program for a house

Below is my turtle program for drawing a yellow house. I can't figure out a way to create a for loop in order to keep the turtle program short. Does anyone have any idea on how to create a loop for the program below?

import turtle
import math
def yellowHouse () :
  wn=turtle.Screen()
  wn.title("Yellow House")
  wn.bgcolor("Blue")
  #sideLength = 200
  house=turtle.Turtle()
  Diagonal_length= 0.5*math.sqrt(2 *(200 ** 2 ))
  house.pensize(5)
  house.speed(4.6)
  house.color("Yellow")
  house.left(90)
  house.forward(200)
  house.right (135)
  house.forward(Diagonal_length)
  house.right(90)
  house.forward(Diagonal_length)
  house.left(135)
  house.forward(200)
  house.left(135)
  house.forward(Diagonal_length)
  house.right(90)
  house.forward(Diagonal_length)
  house.left(135)
  house.forward(200)
  house.right(135)
  house.forward(Diagonal_length)
  house.right(90)
  house.forward(Diagonal_length)
  house.right(45)
  house.forward(200)
  house.left(90)
  wn.mainloop()
yellowHouse ()


Solution 1:[1]

Since you're building the house out of one shape repeated, I'd opt for stamping over drawing:

from turtle import Turtle, Screen

def yellowHouse(side_length):
    wn.register_shape("brick", ((0, 0), (-0.5, -0.5), (0.5, -0.5)))
    house = Turtle('brick', visible=False)
    house.shapesize(stretch_wid=side_length, outline=5)
    house.color("yellow", wn.bgcolor())
    house.penup()

    for angle in range(360, 0, -90):
        house.setheading(angle)
        house.stamp()

    house.forward(side_length)
    house.stamp()

wn = Screen()
wn.title("Yellow House")
wn.bgcolor("blue")

yellowHouse(200)

wn.exitonclick()

This solution prints the house in the center of the screen. You pass in the size of the house you want. (And it's about 1/3 less code.)

Solution 2:[2]

Creating a loop is a good way to make the program code short, you can achieve that in many ways, in your example:

Method 1

use loop to draw the square, then draw the diagonal cross lines and the top

import turtle
def yellowHouse() :
  wn=turtle.Screen()
  wn.title("Yellow House")
  wn.bgcolor("Blue")
  house=turtle.Turtle()
  house.pensize(5)
  house.speed(4.6)
  house.color("Yellow")
  side = 200
  diag = (2*(side**2))**0.5
  ang = 90
  for i in range(4):
    house.fd(side)
    house.lt(ang)
  house.lt(ang/2)
  moves = [(diag,ang),(diag/2,ang),(diag/2,ang),(diag,ang)]
  for (move,turn) in moves:
    house.fd(move)
    house.lt(turn)
  wn.mainloop()

yellowHouse()

Method 2

use loop through array of steps to draw the whole shape

import turtle
def yellowHouse() :
  wn=turtle.Screen()
  wn.title("Yellow House")
  wn.bgcolor("Blue")
  house=turtle.Turtle()
  house.pensize(5)
  house.speed(4.6)
  house.color("Yellow")
  side = 200
  diag = (2*(side**2))**0.5
  ang = 90
  moves = [(side,ang),(side,ang),(side,ang),(side,ang),
          (0,ang/2),(diag,ang),(diag/2,ang),(diag/2,ang),(diag,ang)]
  for (move,turn) in moves:
    house.fd(move)
    house.lt(turn)
  wn.mainloop()

yellowHouse()

Notice we didn't need to import math, since we only need sqrt() to calculate the square root which we can achieve using the ** exponent operator sqrt(x) is same as x**0.5

Solution 3:[3]

here is your code with forloop, you have to maintain event and event value index only..

import turtle
import math
def yellowHouse() :
  wn=turtle.Screen()
  wn.title("Yellow House")
  wn.bgcolor("Blue")
  #sideLength = 200
  house=turtle.Turtle()
  Diagonal_length= 0.5*math.sqrt(2 *(200 ** 2 ))
  event = ["pensize","speed","color","left","forward","right","forward","right","forward","left","forward","left","forward","right","forward","left","forward","right","forward","right","forward","right","forward","left"]
  event_val = [5,4.6,"Yellow",90,200,135,Diagonal_length,90,Diagonal_length,135,200,135,Diagonal_length,90,Diagonal_length,135,200,135,Diagonal_length,90,Diagonal_length,45,200,90]
  event_zip = zip(event, event_val)
  for i,j in event_zip:
    if type(j).__name__ == "str":
        eval("house.{}('{}')".format(i,j))
    else:
        eval("house.{}({})".format(i,j))
yellowHouse()

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 cdlane
Solution 2 MuhammadOsta
Solution 3