Skip to content

Lesson 7

函数

复习函数

前面的课程中我们已经学习了函数的定义与使用方法,今天我们将复习函数的使用方法,并且再更注意一些细节。

函数的定义

def function_name(args1, args2, ...):
    function_body
def function_name(args1: type1, args2: type2, ...) -> type {
    function_body
}

函数名的命名方法和变量命名方法一致。(字母,数字和下划线;不能使用数字开头;不能使用关键字)

函数的调用

使用函数名,在括号里填上要使用的参数

function_name(args1, args2, ...)

我们已经学习调用Python内置的函数,下面也一并复习一下:

  • print函数

    print函数用于将数据类型、变量的值输出到屏幕上。在调用该函数时,函数接受多个参数。 print 函数在输出变量值时,默认情况下会在多个参数之间添加空格。

    name = "Jackson"
    print("Hello", name)
    
    repeated_string = "hello"
    print("The result is", repeated_string*3)
    
    a = 3
    print(a == 3)
    print(a > 4)
    

    输出结果为:

    Hello Jackson
    The result is hellohellohello
    True
    False
    -61
    a = 3
    
  • input函数

    input函数用于读取用户的键盘输入,并且将他以 字符串的数据类型 返回。它可以接收一个字符串参数,他可以在等待用户输入时,在屏幕输出提示用语。

    number = input("Please input a number: ")
    print("Your input is:", number)
    

    输出结果为:

    Please input a number: 12
    Your input is: 12
    
  • len函数

    len函数用于测量输入参数的长度。对于字符串来说,会返回字符串内字符的个数;对于列表、元组、字典类型来说,会输出列表的元素个数,元组元素个数以及字典内键值对的个数。

    a_list = [1, 2, 3, 4, 5]
    a_dict = { "a": 1, "c": 12, "c": 100, "d": 3}
    a_tuple = (1, 2, 3, 4, 5, 6)
    
    a_string = "Hello, world"
    a_chinese_string = "你好世界!"
    
    print("len(a_list)=", len(a_list))
    print("len(a_dict)=", len(a_dict))
    print("len(a_tuple)=", len(a_tuple))
    print("len(a_string)=", len(a_string))
    print("len(a_chinese_string)=", len(a_chinese_string))
    

    输出结果为:

    len(a_list)= 5
    len(a_dict)= 3
    len(a_tuple)= 6
    len(a_string)= 12
    len(a_chinese_string)= 5
    
  • int函数

    将输入的参数转换为整数。可以接受字符串、浮点数。

    print(int("123"))
    print(int(12.3))
    

    输出结果为

    123
    12
    

    需要注意的是,如果输入参数是字符串类型的,并且字符串没有数字的话,调用int函数时,会发生错误:

    print(int("123abc"))
    
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: '1234abc'
    
  • float函数

    int函数类似,他也可以将接收的参数转换为浮点数,当然同样需要注意的是在输入字符串时,该函数同样可能会摄氏。大家自己敲写代码测试,这里不在举例。

  • str函数

    str和先前的两个函数正好相反,可以将接收到的参数转换为字符串的形式。

    a = 3
    b = 4.5
    c = {"a": a, "b": b}
    d = [1, 2, 3, 4, 5]
    e = ("Tuesday", "Wednesday", "Saturday")
    
    print(str(a))
    print(str(b))
    print(str(c))
    print(str(d))
    print(str(e))
    

    输出结果为:

    3
    4.5
    {'a': 3, 'b': 4.5}
    [1, 2, 3, 4, 5]
    ('Tuesday', 'Wednesday', 'Saturday')
    

函数的参数

在上面的式子中,我们可以看到,函数的参数申明有两种可以方式。一种是只需要提供函数参数的名称即可。

函数的返回值

当一个函数完成他的功能后,可以返回一个或者多个数据。此时我们用 return 这个关键字。注意第二种函数的定义过程中,也给出了返回值的数据类型。

思考题

如果一个函数没有返回值,那将函数返回结果赋值到一个变量上,会出现什么状况?这个变量里储存着什么值?这个值是什么类型?请你动手操作并给出答案。

练习题

  1. 定义一个函数 multiply(a, b), 接收两个参数 ab , 并且返回他们的乘积。

  2. 定义一个函数 average(a, b, c), 该函数返回 a, b, c 的平均值。

递归(Recursion)

什么是递归?简单的说函数自己调用自己就是递归。听上去好像很难理解,那我们先看此图,你能有个直观的印象去体会什么是递归?

递归1

生活中的例子:

  • 让同学帮你传递作业本
  • 剥洋葱
  • 卡农音乐
  • 从前有座山,山里有座庙的故事
  • 梦中梦中梦

再看视频中的 Mandelbrot Set的部分: 数学漫步 - 复数2

用Python函数实现递归

  1. 编写函数 sum_to(n),函数返回 1n 的累加和。

    我们使用循环,可以很简单的得到下列代码:

    def sum_to(n):
      i = 1
      sum = 0
      while i <= n:
        sum += n
        i += 1
    
       return sum
    

    通过观察,我们发现,把1n的累加这个问题,其实就是等于 n 值再加上 1n-1的累加值,所以我们可以得到以下的公式:

    \[ sum\_to(n) = n + sum\_to(n - 1) \]

    另外,我们发现有1个特殊的值,就是当 \(n = 1\) 时,上面的式子就不成立了,而此时 \(sum\_to(n) = 1, n = 0\)

    def sum_to(n):
      if n == 1:
        return n
      else:
        return n + sum_to(n-1)
    

如何使用递归?

  1. 首先,你需要认真的思考,需要解决的问题能否被分解成相同的子问题,并且他们是一层一层嵌套的。如果有这种结构的问题,都可以使用递归。
  2. 试着写出他们的递推式,如果写出递推式,表明你已经完成问题的90%了。
  3. 确定递归在什么条件下终止。现实中的程序不可能无限递归下去,所以必须要将递归正确终止。找到这个终止递归的情况,在函数中打断递归。
  4. 确定了递推式和终止条件(或者说边界的情况、特殊情况后)我们就可以完成代码。

思考题

如果有1个n阶的楼梯,你1次只能跨1级或者2级阶梯,请问总共有多少种方法能够走上n阶的楼梯?

你能写出递推式吗?

def fibonacci(n):
  if n == 1:
    return 1
  if n == 2:
    return 2
  return fibonacci(n-1) + fibonacci(n-2)

习题

编写函数 reverse(a_list), 他将输入的字符串参数进行反转。在前面的练习中,大家已经学会使用循环的方法,此处要求使用递归的方法。

提示: 如果可以使用 list(string)方式先将字符串转换为list形式。如下所示:

a_string = "hello"
a_list = list(a_string)
print(a_list)
a_list[0] = '1'
print(a_list)
print("".join(a_list))

可以看到运行结果为

['h', 'e', 'l', 'l', 'o']
['1', 'e', 'l', 'l', 'o']
1ello