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
这个关键字。注意第二种函数的定义过程中,也给出了返回值的数据类型。
思考题
如果一个函数没有返回值,那将函数返回结果赋值到一个变量上,会出现什么状况?这个变量里储存着什么值?这个值是什么类型?请你动手操作并给出答案。
练习题¶
-
定义一个函数
multiply(a, b)
, 接收两个参数a
和b
, 并且返回他们的乘积。 -
定义一个函数
average(a, b, c)
, 该函数返回a
,b
,c
的平均值。
递归(Recursion)¶
什么是递归?简单的说函数自己调用自己就是递归。听上去好像很难理解,那我们先看此图,你能有个直观的印象去体会什么是递归?
生活中的例子:
- 让同学帮你传递作业本
- 剥洋葱
- 卡农音乐
- 从前有座山,山里有座庙的故事
- 梦中梦中梦
再看视频中的 Mandelbrot Set的部分: 数学漫步 - 复数2
用Python函数实现递归¶
-
编写函数
sum_to(n)
,函数返回1
到n
的累加和。我们使用循环,可以很简单的得到下列代码:
def sum_to(n): i = 1 sum = 0 while i <= n: sum += n i += 1 return sum
通过观察,我们发现,把
1
到n
的累加这个问题,其实就是等于n
值再加上1
到n-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)
如何使用递归?¶
- 首先,你需要认真的思考,需要解决的问题能否被分解成相同的子问题,并且他们是一层一层嵌套的。如果有这种结构的问题,都可以使用递归。
- 试着写出他们的递推式,如果写出递推式,表明你已经完成问题的90%了。
- 确定递归在什么条件下终止。现实中的程序不可能无限递归下去,所以必须要将递归正确终止。找到这个终止递归的情况,在函数中打断递归。
- 确定了递推式和终止条件(或者说边界的情况、特殊情况后)我们就可以完成代码。
思考题
如果有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