一、课程介绍

本节课将学习函数参数,认识函数的形参与实参以及函数可以有多个参数的知识,最终实现绘制不同层数、颜色的蜘蛛网。

A028 《蜘蛛结网》编程 源码_形参与实参

二、重难点解析

A028 《蜘蛛结网》编程 源码_多个参数_02函数参数

函数括号里的内容,我们一般叫做参数。

def go(length):
    p.forward(length)

比如在 go() 函数括号里的是参数 length。 参数是可以在函数里使用的,可以用 length 代替 forward() 方法里的距离数字。

在定义函数时,参数还没有被赋值,它还没有具体的数值。

直到我们调用函数时,写入一个具体的数值,比如 60。

# 调用函数:传递实参
go(60)

此时这个数值 60 就会传给 go() 函数的参数 length。

def go(length):
    p.forward(length)
    
# 调用函数:传递实参
go(60)

运行后,函数里的 forward(length) 就是 forward(60)。 多次调用函数时,可以传入不同的参数。

# 调用函数:传递实参
go(60)
go(120)

A028 《蜘蛛结网》编程 源码_函数 参数_03形参与实参

函数后边括号里的内容都是参数,所以不只是length,调用函数时的 60、120 也都是参数。

def go(length):
    p.forward(length)
    
# 调用函数:传递实参
go(60)
go(120)

只不过,定义函数时的 length 叫做形式参数,简称形参。 而调用函数时的参数是有具体的数值,例如 60、120,所以叫做实际参数。

A028 《蜘蛛结网》编程 源码_多个参数_04多个参数

函数可以定义多个参数,只要参数间用英文逗号隔开就可以。

A028 《蜘蛛结网》编程 源码_函数 参数_05

可以给每个参数赋予不同的作用,比如代表大小、代表颜色、代表角度等等,然后就根据作用在函数里面对应的位置使用这些形参。

def go(length, color):
    p.pencolor(color)
    p.forward(length)

定义的函数设置了多个形参,调用的时候也要传入相对应的实参。

注意,调用函数时,实参的“顺序”和“个数”,需要跟定义函数时的形参一样。否则,定义的函数就无法正确接收调用时传递的数据!

A028 《蜘蛛结网》编程 源码_多个参数_06

代码示例:

def go(length, color):
    p.pencolor(color)
    p.forward(length)

go(200, 'red')

三、单词卡

forest [ˈfɔːrɪst] 森林

spider [ˈspaɪdər] 蜘蛛

四、小试牛刀

4.1 源码操作

编写代码,实现一个函数 rectangle,可以任意画出不同大小和内部颜色的长方形,代码实现的效果可参考下图。

A028 《蜘蛛结网》编程 源码_形参与实参_07

提示:

1、定义函数时,分别设置表示边长和颜色的参数;调用函数时,直接输入边长对应的数字和颜色对应的英文单词。

2、注意长方形中长和宽的边长不一样。

3、最终调用函数时,长方形边长和颜色可以自行选择。

import turtle
p = turtle.Pen()

def rectangle(length1, length2, color):
    p.begin_fill()
    p.fillcolor(color)
    for i in range(2):
        p.forward(length1)
        p.left(90)
        p.forward(length2)
        p.left(90)
    p.end_fill()
    
rectangle(200, 100,'red')

p.ht()
turtle.done()

4.2 源码操作

请用用 for 循环画出五角星,并把画五角星的代码包装成可以任意改变五角星大小的函数,然后结合函数、for循环、列表完成图1的最终效果。

A028 《蜘蛛结网》编程 源码_多个参数_08

提示:

1、画五角星的每一个角(共5个)需要先左转 72 度画线后再右转 144 度画线;

2、颜色列表可以自由选择数量和具体颜色,有多少个颜色就会叠加多少个五角星;

3、假设叠加 4 个五角星,画第一个五角星的起点坐标是 (0, 0),画第二个五角星的起点坐标是 (1, 1),画第三个五角星的起点坐标是 (2, 2),画第四个五角星的起点坐标是 (3, 3);

4、新的五角星会比上一个五角星的大小少 i*2。

import turtle
p = turtle.Pen()

# 绘制五角星
def star(length):
    for i in range(5):
        # 画出一个角
        p.left(72)
        p.forward(length)
        p.right(144)
        p.forward(length)
        
# 绘制多个彩色五角星
colors = ['red', 'yellow', 'purple', 'pink', 'green']
for i in range(len(colors)):
    color = colors[i]
    p.pensize(10)
    p.pencolor(color)
    p.penup()
    p.goto(i, i) # 画笔向右上方移动
    p.pendown()
    star(100-i*2)

p.ht()
turtle.done()

五、扩展创作

A028 《蜘蛛结网》编程 源码_函数 参数_09

import turtle
p = turtle.Pen()
turtle.bgpic('forest.gif')
p.speed(0)
turtle.addshape('spider.gif')
p.shape('spider.gif')
p.pencolor('white')
def web(length,color):
    p.pencolor(color)
    for i in range(6):
        for i in range(3):
            p.forward(length)
            p.left(120)
        p.left(60)

web(60,'red')
web(120,'yellow')
web(180,'orange')
web(240,'skyblue')
web(300,'pink')
turtle.done()

六、大开脑洞

2024独特定制窗花!

A028 《蜘蛛结网》编程 源码_形参与实参_10

import turtle
turtle.bgpic('window.gif')
p = turtle.Pen()
p.pensize(5)

def a(length,color):
    p.pencolor(color)
    for i in range(3):
        p.forward(length)
        p.left(120)

def b(length,color):
    p.pencolor(color)
    for i in range(4):
        p.forward(length)
        p.left(90)

for i in range(4):
    a(50,'red1')
    a(100,'red2')
    b(50,'red3')
    b(100,'red3')
    p.right(90)
    
turtle.done()