模块和函数

本节我们要讨论下模块和函数。
一个函数是一块用来执行单个操作的代码块。
一个模块则是一个Python文件,里面包含了变量,函数和其他东西。

我们启动Python REPL然后导入math模块,这个模块提供了一些数学方面的函数:

>>> import math
>>> math.cos(0.0)
1.0
>>> math.radians(275)
4.799655442984406

函数是包含了一组表达内容的序列,在调用的时候会被执行出来。 下面我们定义了一个do_hello函数,它的作用是打印两条信息:

>>> def do_hello():
... print("Hello")
... print("World")
...
>>> do_hello()
Hello
World

确保你在函数中的print表达式前插入了一个tab。 在Python中tabspace非常重要,定义一个代码块或多或少都会依赖于这样的结构。 比如,print表达式被包含在do_hello函数里面时,就必须有一个tab

函数还可以接受参数,并且也能返回一个值(使用return关键字来完成)。

>>> def add_one(val):
... print("Function got value", val)
... return val + 1
...
>>> value = add_one(1)
Function got value 1
>>> value
2

函数部分练习

  1. 定义一个名为add2的函数,它接受两个数字作为参数,返回的值为这两个数字之和。之后定义一个名为add3的函数,它接受3个数字并且返回这三个数字的和。

  2. 定义一个函数,返回接受的两个数字中较大的那个数字。你可以使用if关键字来比较两个数字: https://docs.python.org/3/tutorial/controlflow.html#if-statements 。

  3. 定义一个名为is_divisible的函数,它接受两个参数(“a”和“b”),如果“a”可以被“b”整除那么返回True否则返回False。 提示: 一个数字可以被另一个数字整除时,它余下的部分为0。你可以使用取模操作符(%)来计算。

  4. 定义一个名为average的函数,计算出所传入的列表的平均值。你可以使用sumlen函数。

递归函数

在计算机编程中,递归函数的意思是调用自身。比如一个阶乘函数

f(x) = 
{ 1, if x = 0. }
{ x × f(x − 1), otherwise. }

作为例子,我们传入5,它的计算过程是这样的:

5! = 5 × 4!
= 5 × 4 × 3!
= 5 × 4 × 3 × 2!
= 5 × 4 × 3 × 2 × 1

5的阶乘本质上是5乘4的阶乘...最终,是1(或0)的阶乘也就是1然后结束递归。在Python中,我们可以这样写:

def factorial(x):
    if x == 0:
        return 1
    else:
        return x * factorial(x-1)

递归的要点必须有一个基础条件,在这个条件下递归会终止,而递归的过程必须逐渐靠近这个基础条件。 阶乘这个例子中,我们知道数字为0时阶乘的结果是1,然后当阶乘的数大于0时则是之前数字的阶乘一直延续到0。

递归函数的练习

  1. 写一个阶乘函数并测试几个不同的数据。同时使用计算器来验证其正确性。
  2. 写一个递归函数,该函数会计算出1到(n)之间整数的和(n作为参数传入)。想想基础条件应该是什么(是不是加到0为止?),思考下递归例子是怎么做的。
  3. 斐波那契数列是一个数字序列,它的每一个数字都是前2个数字之和。请根据以下信息,写出一个递归函数来计算斐波那契数列(fib(n))。
fib(n) =
{ 0, if x = 0. }
{ 1, if x = 1. }
{ fib(n − 1) + fib(n − 2), otherwise }

检查下你最初的几个结果是否与结果对应了:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...


书籍推荐