Python的函数(二):递归函数、匿名函数、高阶函数

一.递归函数

如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。
其最重要的就是找到停止的条件。

计算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)

运行结果:

我已经成年了
我可以上网了

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值