老齐教室

青少年编程:用Python探究数学(4)

经过前面的学习,你已经对编程有了一点了解,本节我们要更进一步:写个函数。

在初中数学中,有对函数的详细解释,此处不赘述。

对于Python里面的函数,有自己的独特定义方法。

还是打开myturtle.py文件,将其中的代码修改为:

1
2
3
4
5
6
7
8
9
10
from turtle import *

shape("turtle")

def polygon():
for i in range(4):
forward(100)
right(90)

polygon()

上面代码中的第1、3行没有变化,请读者注意的是第5行,这一行开始定义一个函数:

  • def是Python中定义函数的关键词,看到它就意味着现在要开始写一个函数了。
  • polygon是当前所定义的函数的名字,一般用小写字母表示。
  • ()这个括号里面应该写函数的参数,现在我们暂时不写参数,但是括号还是要写上,不能不写。

注意第6行到第8行,就是我们已经熟悉的绘制正方形的程序——前面使用过的,放到了这里,但是,注意第6行,相对函数左侧要有四个空格的缩进,后面各行依次缩进。这样,用缩进的方式就表示第6行到第8行,是当前函数polygon的代码块,只有在调用这个函数的时候,这部分代码才被执行。

如何调用这个函数?第10行,就是调用这个函数。

F5键执行此文件,同样画出了那个正方形——请读者自行调试。

上面这个函数好像也没有显示出什么特别,就是把原有的代码“打包”放到函数里面了,能不能让函数更灵活一些呢?

那就继续修改。

1
2
3
4
5
6
7
8
9
10
from turtle import *

shape("turtle")

def polygon(side):
for i in range(4):
forward(side)
right(90)

polygon()

这次修改了第5行和第7行:

  • 第5行中增加了一个参数side,它表示多边形的边长
  • 第7行就要使用这个参数,当调用这个函数的时候,就按照该参数的值绘制多边形。

如果完成了上述修改,就执行此文件,会出现如下情况:

1
2
3
4
Traceback (most recent call last):
File "/Users/qiwsir/Documents/Codes/mathadventure/myturtle.py", line 16, in <module>
polygon()
TypeError: polygon() missing 1 required positional argument: 'side'

报错的原因是,我们所调用的函数polygon已经有参数了,不能再如同原来那样调用。

修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
from turtle import *

shape("turtle")

def polygon(side):
for i in range(4):
forward(side)
right(90)

polygon(100)
polygon(50)
polygon(25)

上面修改之后的文件中,连续三次调用polygon函数,但是参数不同,也就是要按照三个不同的边长绘制正方形。

从上面的执行效果中,可以看到函数的一个好处,那就是避免了同样代码的重复。如果按照以往的做法,我们分别画不同边长的多边形,需要将第6行到第8行的代码重复若干遍,但是,现在只需要调用若干次该函数即可。

函数中的参数最多可以多少个?理论上是没有个数限制的,但是,太多了有点麻烦。不过,在画多边形的这个示例中,根据前面的学习,我们知道,至少还可以设置多边形的边数。

于是乎这个函数还可以这么写。

1
2
3
4
5
6
7
8
9
10
11
12
13
from turtle import *

shape("turtle")
n = input("请输入多边形的边数:")
length = input("请输入多边形的边长:")

def polygon(side, n):
alpha = 360 / n
for i in range(n):
forward(side)
right(alpha)

polygon(int(length), int(n))

第4、5行,还是通过键盘获得用户输入的多边形边数和编程。

第7行,在定义函数的时候,有两个参数,side代表边长,n代表边的个数。

第8行,计算海龟转过的角度。后面的程序就好理解了。

第13行,调用函数的时候要特别注意:

  • int(length)int(n)是按照位置顺序向函数polygon提供的两个参数,即int(length)对应sideint(n)对应n
  • 并且,同时将用函数input获得到的两个数据转化为了整数类型。

下面图示显示的是执行过程和输出结果。

是不是越来越感受到函数的特点了?

如果把我们已经学习过的循环语句结合起来,还能看到更酷炫的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
from turtle import *

shape("turtle")

def polygon(side, n):
alpha = 360 / n
for i in range(n):
forward(side)
right(alpha)

for side in range(10, 50, 10):
for n in range(3, 10):
polygon(side, n)

这段程序的执行时间稍微长一些,小海龟要跑好多圈——多少?能推算出来么?

并且,读者是否可以理解第11行到第13行的代码?结合前面已经学习过的知识。

代码的执行效果如下图所示:

关于代码的理解,留给读者研究了。


专注于软件和AI的公众号

老齐教室

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

关注微信公众号,读文章、听课程,提升技能