# 2.1.3 方法、函数

本节目标：

* 了解什么是方法，与数学函数的相似处。
* 学习使用`fd`，`lt`，`bk`，`rt`方法。

## 什么是方法

方法（Method）是实现某种特定功能、可以重复使用的一段代码 。在不同场合，这样的一段代码也会被叫做其他名字，比如子程序、过程、函数等 （[https://zh.wikipedia.org/wiki/子程序](https://zh.wikipedia.org/wiki/%E5%AD%90%E7%A8%8B%E5%BA%8F) ） 。在Python中，如果这段代码出现在一个类中，通常叫**方法**。 如果是不依赖一个类的“方法”，一般叫**函数**，如之前出现的`mainloop`。

方法与数学中函数的概念有类似之处，如二次函数`f(x) = x^2`将`x`映射到`x^2`。 一个Python中的方法也可以实现类似功能，比如一个正方形对象，求面积是它的一个方法。（相应地，面积可以是它的一个属性。） Python中的方法不局限于数学函数，比如对于小海龟对象，画一个正方形也是它的一个方法。

刚才的例子`f(x) = x^2`是一个一元函数，这里的“元”在Python中叫做**参数**，即“`f(x)`带有一个参数”。 方法也可以没有参数。

Python中的参数可以是任何对象，数字、字符串、小海龟都可以。

**Learning By Doing 难度：★ 重要性：★★★★★**

*   运行以下代码，观察结果。

    ```python
    import turtle
    t1 = turtle.Turtle('turtle')
    t2 = turtle.Turtle('turtle')
    t1.lt(90)
    t1.fd(50)
    turtle.mainloop()
    ```

可以看到，屏幕上一只小海龟动了起来，而另一只小海龟停留在原地。

并且，通过在创建对象的时候带上参数`'turtle'`，我们让小海龟真的变成了海龟的形状。 `'turtle'`中的`turtle`被引号括起来了，这是一个字符串对象。 我们以后再来看字符串的其他特性。

这里，是把字符串`'turtle'`当作类`turtle.Turtle`的参数。

`t1.fd`让小海龟`t1`前进（`fd`是`forward`的缩写），这个方法带一个参数，表示前进的距离； `t1.lt`让小海龟`t1`左转（`lt`是`left`的缩写），带一个参数，表示转动的角度。

类似，`t1.bk`和`t1.rt`让小海龟后退、右转。

我们可以再让小海龟走几步，画一个正方形。

```python
import turtle
t1 = turtle.Turtle('turtle')
t1.fd(50)
t1.rt(90)
t1.fd(50)
t1.rt(90)
t1.fd(50)
t1.rt(90)
t1.fd(50)
t1.rt(90)
turtle.mainloop()
```

**Learning By Doing 难度：★ 重要性：★★★★★**

* 让小海龟`t2`画一个正五边形。

**Learning By Thinking 难度：★ 重要性：★★★**

* 数学函数与Python中的函数有什么异同？

数学中的函数是一个映射，计算机函数的概念从数学函数中产生，可以看作是从参数定义域到代码的映射。 然而，在编程中相比于函数的代码，我们更关心这段代码的运行结果。从参数的定义域到运行结果却并不一定是一个映射。 比如，Python函数可以用来产生随机数，每一次对随机函数求值都会得到不同的结果，这显然（至少在形式上）不是数学函数。

注意这只是Python中的情况，在有些语言中，比如Haskell，函数与数学函数是一样的概念。
