上一个教程中,瓦力博士带大家学习了函数的使用。例如,line_without_moving 函数,可以让海龟先画出一条线段,然后再回来起点。1
2
3def line_without_moving():
turtle.forward(100)
turtle.backward(100)
但是,这个函数还是有一些局限性的。譬如,海龟所画线段的长度是固定的,这样就显得不够灵活。那么有什么办法,让函数变得更灵活一些呢?答案就是使用参数。1
2
3def line_without_moving(length):
turtle.forward(length)
turtle.backward(length)
对比前后 2 段代码,新版的 line_without_moving 在函数声明的地方(第 1 行),在小括号里面写上了 length;又将函数体中(第 2, 3 行)的数字 100 替换成 length。这里的 length 就称为函数的参数,我们在函数调用时,可以向函数参数传递不同的值,这样函数体中用到 length 参数的地方,也就间接地用到我们提供的值啦。
1 | import turtle |
运行上面这段画十字型的代码,我们看到构成十字型的 4 条线段长短不一。这是因为我们在调用 line_without_moving 函数时,使用了不同的参数(第 9, 11, 13, 15 行)。
关于函数参数,瓦力博士要提醒大家的是,函数参数只能在本函数内部(即本函数体中)使用。函数之外,函数参数就无效了。例如,函数 line_without_moving 的参数 length 就只能在 line_without_moving 函数中使用,你不能在其他的地方使用它。
还记得上个教程中,瓦力博士给大家留的那个画蜂巢的作业吗?聪明的你,是不是已经画出来了呢?
下面是瓦力博士的代码,代大家参考。
1 | import turtle |
现在,蜂巢的大小的固定的。使用这节课的知识,通过函数参数,我们可以很方便地控制蜂巢的大小。
下面是瓦力博士改进后的代码。通过参数 size,我们可以自由地控制蜂巢的大小。
1 |
|
参数的传递过程如下:
第 14 行,我们在调用函数 honeycomb 时,将 80 传递给了 honeycomb 的参数 size
函数 honeycomb 接受了 80 这个参数值(第 8 行),因此函数 honeycomb 中,所有使用到参数 size 的地方(第 10, 11 行),都得到了 80 这个值
函数 honeycomb 中,又将 80 这个值传递给被调用的函数,第 10 传递给函数 hexagon, 第 11 行传递给函数 turtle.forward
函数 hexagon 接受了 80 个参数值(第 3 行),因此函数 hexagon 中,所有使用到参数 size 的地方(第 5 行),都得到了 80 这个值
……
这里,瓦力博士要提醒大家的是:函数 hexagon 和 honeycomb 中都有参数 size,这 2 个 size 虽然同名,而且在参数传递的过程中,都被赋予相同的值(80),但它们不是同一个参数!hexagon 中的参数 size,其作用域(即有效范围)是第 3-6 行;honeycomb 中的参数 size,其作用域是第 8-12 行。
练习
尝试编写一个带参数的函数,实现任意正多边形的绘制
提示
设计一个名为 draw_polygon 的函数来绘制任意正多边形
draw_polygon 接受 2 个参数 sides 和 length(多个参数之间用英文逗号分隔)
sides 用于控制正多边形的边数(内角)
length 用于控制正多边的边长(大小)
1 | def draw_polygon(sides, length): |