详解3_递归_匿名函数-函数-python

1、递归

程序调用自身的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或
间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题
来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进
段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

  • 特点
  1. 必须有一个明确的结束条件
  2. 每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少
  3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
  • 名词解析

    • 递推:像上边递归实现所拆解,递归每一次都是基于上一次进行下一次的执行,这叫递推
    • 回溯:则是在遇到终止条件,则从最后往回返一级一级的把值返回来,这叫回溯
  • 案例

    1. 求阶乘

      def factorial(n):
          '''
          求n的阶乘
          :param n:   给定的某个自然数
          :return:    n的阶乘
          '''
          if n == 1 or n == 0:
              return 1
          else:
              return n * factorial(n - 1)
      
      
      r = 5
      print('{}的阶乘是:{}'.format(r, factorial(r)))
      
      
    2. 斐波那契数列

      def fabonacci(n):
          '''
          求斐波那契数列的第n项
          :param n:   数列项数
          :return:    第n项
          '''
          if n == 1 or n == 2:
              return 1
          else:
              return  fabonacci(n - 1) + fabonacci(n - 2)
      
      
      r = 15
      print('斐波那契数列第{}项是:{}'.format(r, fabonacci(r)))
      
  • 参考地址:Python递归的经典案例

2、匿名函数

在Python中,不通过def来声明函数名字,而是通过lambda关键字来定义的函数称为匿名函数。

lambda函数能接收任何数量(可以是0个)的参数,但只能返回一个表达式的值,lambda函数是一个函数对象,直接赋值给一个变量,这个变量就成了一个函数对象。

语法:lambda 参数列表:表达式

先写lambda关键字,然后依次写匿名函数的参数,多个参数中间用逗号连接,然后是一个冒号,冒号后面写返回的表达式。

使用lambda函数可以省去函数的定义,不需要声明一个函数然后使用,而可以在写函数的同时直接使用函数。

  • 使用场景:

1.需要将一个函数对象作为参数来传递时,可以直接定义一个lambda函数(作为函数的参数或返回值)

2.要处理的业务符合lambda函数的情况(任意多个参数和一个返回值),并且只有一个地方会使用这个函数,不会在其他地方重用,可以使用lambda函数

3.与一些Python的内置函数配合使用,提高代码的可读性

2.1、匿名函数与普通函数的对比

def test01(n):
    return n ** 2


# 匿名函数
f = lambda n: n ** 2
n = 5
print('{}的平方是:{}'.format(n, test01(n)))
print('{}的平方是:{}'.format(n, f(n)))
  • 匿名函数适用于函数只使用一次的情况
  • 普通函数适用于多次调用
  • lambda函数比普通函数更简洁,且没有声明函数名

2.2、匿名函数的多种形式

# 无参数
lambda_a = lambda: 100
print(lambda_a())
 
# 一个参数
lambda_b = lambda num: num * 10
print(lambda_b(5))
 
# 多个参数
lambda_c = lambda a, b, c, d: a + b + c + d
print(lambda_c(1, 2, 3, 4))
 
# 表达式分支
lambda_d = lambda x: x if x % 2 == 0 else x + 1
print(lambda_d(6))
print(lambda_d(7))

可以看到,lambda的参数可以0个到多个,并且返回的表达式可以是一个复杂的表达式,只要最后的值是一个值就行了。

2.3、匿名函数作为参数

def test(n, f):
    return f(n)


n = 5
print('{}的平方是:{}'.format(n, test(5, lambda n: n ** 2)))
print('{}的3次方是:{}'.format(n, test(5, lambda n: n ** 3)))

2.4、lambda函数与Python内置函数配合使用

  • 常用的函数
函数名功能
max(*args, key=None)求最大值
min(*args, key=None)求最小值
sorted(object)排序
filter(object)过滤
map(object)转换
reduce(object)对一个序列压缩运算,得到一个值
member_list = [
    {"name": "风清扬", "age": 99, "power": 10000},
    {"name": "无崖子", "age": 89, "power": 9000},
    {"name": "王重阳", "age": 120, "power": 8000}
]
new_list = sorted(member_list, key=lambda dict_: dict_["power"])
print(new_list)

number_list = [100, 77, 69, 31, 44, 56]
num_sum = list(map(lambda x: {str(x): x}, number_list))
print(num_sum)

运行结果:

[{'name': '王重阳', 'age': 120, 'power': 8000}, {'name': '无崖子', 'age': 89, 'power': 9000}, {'name': '风清扬', 'age': 99, 'power': 10000}]
[{'100': 100}, {'77': 77}, {'69': 69}, {'31': 31}, {'44': 44}, {'56': 56}]
  • sorted是Python中对列表排序的内置函数,我们使用lambda来获取排序的key。

  • map是Python中用来做映射的一个内置函数,接收两个参数,第一个参数是一个函数,第二个参数是一个可迭代对象,map会遍历可迭代对象的值,然后将值依次传递给函数执行。我们使用lambda来实现map中的函数参数。

2.5、lambda作为函数的返回值

def run_func(a, b):
    return lambda c: a + b + c

return_func = run_func(1, 10000)
print(return_func)
print(return_func(100))
运行结果:

<function run_func.<locals>.<lambda> at 0x00000254E4C94158>
10101

匿名函数可以作为一个函数的返回值,在上面的代码中,run_func返回的是一个匿名函数,返回的是一个函数对象,当我们执行这个函数时,可以得到lambda函数的结果。

  • 注意:其中的a,b两个参数是run_func中的参数,但我们执行返回的函数return_func时,已经不在run_func的作用域内了,而lambda函数仍然能使用a,b参数。说明lambda函数会将它的运行环境保存一份,一直保留到它自己执行的时候使用。

  • 参考地址:Python匿名函数lambda的使用

代码仓库地址:https://gitee.com/gaogzhen/python-study
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaog2zh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值