第十节:函数(三)

本文介绍了Python编程中的高级函数概念,包括递归函数的基线和递归条件,高阶函数的特性,匿名函数(lambda)的使用,以及闭包的创建和应用场景。闭包有助于保护内部变量,常用于实现装饰器。最后提出了猴子吃桃问题作为递归应用的实例。
摘要由CSDN通过智能技术生成

函数(三)

在这里插入图片描述

递归函数

• 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题(递归简单理解就是自己调用自己)

• 递归式函数有2个条件:

  1. 基线条件 - 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
  2. 递归条件 - 可以将问题继续分解的条件
# 求任意数的阶乘
def fun(x):
	if x == 1:			# 基线条件
		return 1
	return fun(x-1)*x 	# 递归条件
print(fun(5)) 			# 得 120

高阶函数

  • 接收函数作为参数,或者将别的函数对象作为返回值返回的函数就是高阶函数
def fun0(x,y,fun): 			# 函数作为参数
   return fun(x)*fun(y)		# 函数作为返回值
print(fun0(-9,-10,abs))

匿名函数

  • 定义一个匿名函数并调用,定义格式如–>lambda arg1,arg2…:表达式
  • 防止重名,不用再去定义函数,使用方便,可以作为一个传参的工具
  • lambda函数就是匿名函数
list = [1,2,3,4,5,6,7,8]
# 语法: lambda 参数 :表达式
print(lambda a,b: a+b)(1,2) # 前面形参,后面实参
s = lambda a : a % 2 == 0
# filter() 有两个参数,第一个参数(函数)是过滤规则,第二个是过滤的数据
print(list(filter(s,list1)))

闭包

  • 闭包的定义?闭包本质上就是一个函数
    如何创建闭包?

    • 函数要嵌套(有内外部函数)
    • 内部函数使用外部函数的变量
    • 外部函数返回内部函数的名称
  • 如何使用闭包?典型的使用场景是装饰器的使用。
    global与nonlocal的区别:

    • global可以改变全局变量,同时可以定义新的全局变量;
    • nonlocal只能改变外层函数变量,不能定义新的外层函数变量,并且nonlocal也不能改变全局变量。
    • global关键字可以用在任何地方,包括最上层函数中和嵌套函数中;
    • nonlocal关键字只能用于嵌套函数中,并且外层函数中必须定义了相应的局部变量,否则会发生错误。
  • 闭包的好处
    • 通过闭包可以创建一些只有当前函数能访问的变量
    • 可以将一些私有数据藏到闭包中
    • 行成闭包的条件

  • 特性:可以保证外部函数变量不被销毁

def outFun(arg1):
      def inFun(arg2):
        nonlocal arg1#nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
         arg1+=200
         return arg1*arg2
     return inFun
 infun=outFun(100)	#调用外部函数,传入参数,返回是内部函数
 result=infun(300)	#调用内部函数,传入参数
 print("the result is:",result)

#使用闭包求给function计算耗时(上面的内容已经提到)代码如下:
import time
def waste_time(func): #用于计算函数执行的耗时
    def function(*args,**kwargs):
        start_time=time.time()
        result=func(*args,**kwargs)
        end_time=time.time()
        spend=end_time-start_time
        print("函数%s 总共耗时%.3f秒:"%(func.__name__,spend))
        return result
    return function

作业

  1. 猴子吃桃问题(递归):
    猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?
def fun(x):
	if x == 10 :
		return 1
	return 2*(fun(x + 1) + 1)
print(fun(1))  # 得 1534 第一天共摘了1534个桃子

声明:本文为学习笔记,转载请标明出处,本文仅供交流学习,请勿用于非法途径,希望本文对大家有帮助。

仅是个人意见,如有不足之处或者侵权,请留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值