一.递归函数
如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。
其最重要的就是找到停止的条件。
计算n的阶乘。
我们可以使用循环来完成。
def xunhuan(num):
result, i = 1, 1
while i <= num:
result *= i
i += 1
return result
print(xunhuan(4)) # 24
使用递归来求n!,其规律为:n!=n*(n-1)!
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)
print(factorial(6)) # 24
使用递归求斐波那契数列的第 n 个数字的值
斐波那契数列:1,1,2,3,5,8,13,21,34,55,89,144···,其规律是:前两个数的和等于第三个数
def fibonacci(n):
if n == 1 or n == 2:
return 1
return fibonacci(n - 2) + fibonacci(n - 1)
print(fibonacci(4)) # 3
二.匿名函数
1.匿名函数的定义
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
在Python里使用lambda来创建匿名函数。
格式:lambda 参数列表: 运算表达式
1.lambda 只是一个表达式,函数体比 def 简单很多。
2.lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
3.lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
4.虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
sum1 = lambda a, b: a + b
print(sum1(1, 2)) # 3
注意:1.Lambda函数能接收任何数量的参数但只能返回一个表达式的值
2.匿名函数可以执行任意表达式(甚至print函数),但是一般认为表达式应该有一个计算结果供返回使用。
3.python在编写一些执行脚本的时候可以使用lambda,这样可以接受定义函数的过程,比如写一个简单的脚本管理服务器。
2.内置函数和类
sort函数的使用
功能:用来将一个无序列表进行排序。
参数描述:函数参数的返回值规定按照元素的哪个属性进行排序
students = [
{'name': '源一', 'age': 18},
{'name': '源二', 'age': 21},
{'name': '源三', 'age': 19},
]
students.sort(key=lambda ele: ele['age'])
print(students)
运行结果:
[{‘name’: ‘源一’, ‘age’: 18}, {‘name’: ‘源三’, ‘age’: 19}, {‘name’: ‘源二’, ‘age’: 21}]
filter类的使用
功能:用来过滤一个列表里符合规定的所有元素,得到的结果是一个迭代器。
参数描述:函数参数的返回值指定元素满足的过滤条件。
(Python2的时候是内置函数,Python3修改成了一个内置类)
ages = [18, 22, 16, 32, 24, 17, 19]
x = filter(lambda ele: ele >= 18, ages)
adult = list(x)
print(adult) # [18, 22, 32, 24, 19]
map类的使用
功能:将列表里的每一项数据都执行相同的操作,得到的结果是一个迭代器。
参数描述:函数参数用来指定列表里元素所执行的操作。
ages = [18, 22, 16, 32, 24, 17, 19]
x = map(lambda ele: ele * 2, ages)
print(list(x)) # [36, 44, 32, 64, 48, 34, 38]
reduce函数的使用
功能:对一个序列进行压缩运算,得到一个值。python3以后,这个方法被移到了functools模块。
参数描述:函数参数用来指定元素按照哪种方式合并。
from functools import reduce # 导入模块的语法
students = [
{'name': '源一', 'age': 18},
{'name': '源二', 'age': 21},
{'name': '源三', 'age': 19},
]
print(reduce(lambda x, y: x + y['age'], students, 0)) # 58
三.高阶函数
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,同样,我们还可以把一个函数当做另一个函数的返回值。这种函数的使用方式我们称之为高阶函数。
1.函数作为另一个函数的参数
def person(age, action):
if age < 18:
print('未满18岁,不得进入')
action() # 把参数action直接当做一个函数来调用
def play_game():
print('开始你的新征程')
my_action = play_game # 定义一个变量my_action,让它指向play_game函数
person(22, my_action) # 将my_action传给person函数作为它的参数
# person(22,play_game) # 还可以不再定义一个新的变量,直接传入函数名
2.函数作为另一个函数的返回值
def person1():
print('我还未成年')
def person2():
print('我已经成年了')
return person1 # person1函数作为person2函数的返回值
person2() #我已经成年了
person2()() #我已经成年了 我还未成年
3.函数的嵌套
def person(age):
print('我已经成年了')
def play_game(): # play_game这个函数是在person函数内部定义的
print('我可以上网了')
if age >= 18:
play_game() # play_game函数只在person函数内部可见
person(22)
运行结果:
我已经成年了
我可以上网了