写一个函数叫做square,有一个名叫t的参数,这个t是一个 turtle。用这个turtle来画一个正方形。写一个函数调用,把bob作为参数传递给square,然后再运行这个程序。
$ cat mypolygon.py
#!/bin/python
import turtle
bob = turtle.Turtle()
def square(t):
for i in range(4):
t.fd(100)
t.lt(90)
square(bob)
在最内部的语句里面,fd和lt缩进了两次,这个意思是他们是for循环的循环体内部成员,而for循环本身缩进了一次,说明for语句被包含在函数的定义当中。
接下来的这行square(bob),紧靠左侧,没有缩进,这说明for循环和函数定义都结束了。
在函数体内部,t所指代的就是小乌龟bob,因此让t来左转九十度的效果,完全等同于让bob来左转九十度。这里没有把square函数的形式参数名字设置成bob,这是为啥呢?
是因为用t可以指代任意一个小乌龟,不仅仅是bob,所以你就能再创建另一个小乌龟,比如定义jack,把它传递给square这个函数作为实际参数:
$ cat mypolygon.py
#!/bin/python
import turtle
bob = turtle.Turtle()
def square(t):
for i in range(4):
t.fd(100)
t.lt(90)
square(bob)
jack = turtle.Turtle()
square(jack)
执行程序后,箭头会按照轨迹跑两次。第一次是调用bob,第二次是调用jack.
用函数的形式把一段代码包装起来,叫做封装,比如这里的square函数。
这样有一个好处,就是给代码起了个名字, 类似文档说明的功能(square意指四边形,而函数体就是画一个四边形)。另外一个好处是下次重复使用这段代码的时候,再次调用函数就可以了,这比复制粘贴函数体可方便多了。比如后面的square(jack),直接调用函数square,而不用拷贝一堆代码。
给square函数添加一个长度参数length:
#!/bin/python
import turtle
bob = turtle.Turtle()
def square(t,length): #添加length
for i in range(4):
t.fd(length) #替换为length
t.lt(90)
square(bob,100)
给函数添加参数,就叫做泛化,因为这可以让函数的功能更广泛。在这之前,square 函数画出来的四边形总是一个尺寸的,使用泛化后,就可以自定义边长了。
比如这里的square(bob,100) 可以写100,也可以写150,或者200等等其它数值。
再看一个例子,定义一个函数polygon,画多边形:
$ cat mypolygon.py
#!/bin/python
import turtle
bob = turtle.Turtle()
def polygon(t,n,length):
angle= 360 / n
for i in range(n):
t.fd(length)
t.lt(angle)
polygon(bob,7,70)
这个例子画了一个每个边长度都为70像素的七边形。
当一个函数有超过一个数据参数的时候,很容易忘掉这些参数都是什么,或者忘掉他们的顺序。为了避免这个情况,可以把形式参数的名字包含在一个实际参数列表中:
比如把n和length放到函数polygon的实际参数列表中:polygon(bob,n=7,length=70)
这些列表叫做关键参数列表,因为他们把形式参数的名字作为关键词包含了进来。(注意区别这里的关键词,不是Python语言的关键词。这里就是字面意思,很关键的词。)
这种语法结构让程序更容易被人读懂,也能提醒实际参数和形式参数的使用过程:调用一个函数的时候,把实际参数的值赋给了形式参数。
结束。
原文:https://www.cnblogs.com/liusingbon/p/13061664.html