Python 挑战版 · Day 4

函数:给一组动作起名字

函数不是抽象定义,而是整理代码的办法。先感到复制房子很麻烦,再用 def 把动作打包。

节奏分配(45 分钟)

01

先制造痛感

回看 Day 3 房子代码,问:画 3 栋要复制几次?改几处坐标?

02

发明一个新动作

把“画墙”放进 draw_wall(),理解定义和调用是两件事。

03

拆成小函数

把墙、屋顶、门、窗分别起名字。

04

组合成 draw_house()

一个房子由多个小动作组成,函数可以调用函数。

05

反复调用造村庄

移动到不同位置,再调用 draw_house()。

教师话术

"函数不是新魔法,它只是给一组动作起名字。"

"注意:定义了函数,不代表它会执行。叫它一声,它才出来干活。"

"draw_house() 里面可以调用 draw_wall()、draw_roof(),动作可以组合动作。"

"如果想多画一座房子,不复制整段代码,只再调用一次 draw_house()。"

函数怎么理解

def draw_wall():

定义一个叫 draw_wall 的动作

缩进代码

属于这个动作里面的步骤

draw_wall()

调用动作,真正开始执行

draw_house()

把多个小动作组合成大动作

课堂代码

第一步:发明一个新动作

重点看两件事:冒号和缩进;定义后必须调用。

python
import turtle
 
t = turtle.Turtle()
t.speed(6)
t.pensize(2)
 
def draw_wall():
    t.fillcolor("lightyellow")
    t.begin_fill()
    for i in range(4):
        t.forward(100)
        t.left(90)
    t.end_fill()
 
# 定义函数只是让 Python 记住这个动作
# 真正执行,要叫它出来:
draw_wall()
 
turtle.done()

第二步:组合成 draw_house()

这段表达结构:房子由四个小动作组成。

python
def draw_house():
    # 把画房子的步骤装进一个函数
    draw_wall()
    draw_roof()
    draw_door()
    draw_window()
 
draw_house()

完整基线:小村庄

python
import turtle
 
t = turtle.Turtle()
t.speed(6)
t.pensize(2)
 
def draw_wall():
    t.fillcolor("lightyellow")
    t.begin_fill()
    for i in range(4):
        t.forward(100)
        t.left(90)
    t.end_fill()
 
def draw_roof():
    t.penup()
    t.setheading(90)
    t.forward(100)
    t.setheading(0)
    t.pendown()
 
    t.fillcolor("tomato")
    t.begin_fill()
    for i in range(3):
        t.forward(100)
        t.left(120)
    t.end_fill()
 
    t.penup()
    t.setheading(270)
    t.forward(100)
    t.setheading(0)
    t.pendown()
 
def draw_door():
    t.penup()
    t.forward(20)
    t.pendown()
 
    t.fillcolor("sienna")
    t.begin_fill()
    t.forward(25)
    t.left(90)
    t.forward(40)
    t.left(90)
    t.forward(25)
    t.left(90)
    t.forward(40)
    t.left(90)
    t.end_fill()
 
    t.penup()
    t.setheading(180)
    t.forward(20)
    t.setheading(0)
    t.pendown()
 
def draw_window():
    t.penup()
    t.forward(65)
    t.left(90)
    t.forward(50)
    t.right(90)
    t.pendown()
 
    t.fillcolor("lightblue")
    t.begin_fill()
    for i in range(4):
        t.forward(20)
        t.left(90)
    t.end_fill()
 
    t.penup()
    t.setheading(270)
    t.forward(50)
    t.setheading(180)
    t.forward(65)
    t.setheading(0)
    t.pendown()
 
def draw_house():
    draw_wall()
    draw_roof()
    draw_door()
    draw_window()
 
# 移动到不同位置,反复调用同一个动作
t.penup()
t.goto(-170, 0)
t.pendown()
draw_house()
 
t.penup()
t.goto(20, 0)
t.pendown()
draw_house()
 
t.penup()
t.goto(170, 0)
t.pendown()
draw_house()
 
t.hideturtle()
turtle.done()

扩展挑战

最后 8 分钟

基础再调用一次 draw_house();进阶写 draw_sun();挑战写 draw_chimney() 并放进 draw_house()

python
def draw_sun():
    t.penup()
    t.goto(220, 170)
    t.pendown()
 
    t.fillcolor("gold")
    t.begin_fill()
    t.circle(30)
    t.end_fill()
 
# 记得调用,太阳才会出现
draw_sun()

完成标准

能区分“定义函数”和“调用函数”。

能说出 def 是给一组动作起名字。

能把 draw_wall、draw_roof 等小动作组合成 draw_house。

能通过多次调用 draw_house() 画出多个房子。

本节不讲 return。只要学生理解“定义动作”和“叫出动作”,就达标。

做完之后

收尾只问:能不能让每座房子大小、颜色都不一样?下一阶段可以把变化交给参数和变量。