模块和函数

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

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

  1. >>> import math
  2. >>> math.cos(0.0)
  3. 1.0
  4. >>> math.radians(275)
  5. 4.799655442984406

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

  1. >>> def do_hello():
  2. ... print("Hello")
  3. ... print("World")
  4. ...
  5. >>> do_hello()
  6. Hello
  7. World

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

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

  1. >>> def add_one(val):
  2. ... print("Function got value", val)
  3. ... return val + 1
  4. ...
  5. >>> value = add_one(1)
  6. Function got value 1
  7. >>> value
  8. 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函数。

递归函数

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

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

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

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

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

  1. def factorial(x):
  2. if x == 0:
  3. return 1
  4. else:
  5. return x * factorial(x-1)

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

递归函数的练习

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