python基础之高阶函数(下)

1.高阶函数

高阶函数是满足下列条件之一的即为高阶函数。

  • (1)接收函数作为参数
    即:我们传入的实参是以函数方式传入,并在包含形参的函数中使用。
  • (2)将函数作为返回值的函数
    返回值是一个函数
    高阶函数的好处:
    接收的参数是以函数传入,函数又是一个储存代码运算的小仓库,那么高阶函数就是能够直接使用我的小仓库的代码,从而便于我们运算。
#高阶函数的引入
#1-1 定义一个函数,将指定列表中的偶数,保存到一个新的列表中。
list=list(range(1,11,1))
def fn (a):
	new_list=[]
	for i in list:
		if i % 2 ==0:
			new_list.append(i)
	return new_list
print(fn(list))
[2,4,6,8,10]
#1-2 将指定列表中的3的倍数,保存到一个新的列表中。
#只需对上述代码的条件判断进行改动。
if i % 3 ==0:#if i % 2 ==0改为if i % 3 ==0

#由于每次需求改变,都需要改一次代码,这是一个繁琐的工作。由此引入高阶函数:

'''(1)接收函数对象作为参数案例
'''
#高阶函数
'''
个人理解,根据需要不同,不同需要求用一个函数来判断,我们在进行需要求计算时就可以直接使用包含需求判断的函数作为高阶函数的参数使用,并在高阶函数中进行对应的计算。
上述案例,我们可以将条件定义为不同的函数,然后高阶函数直接使用条件函数为参数。
'''
#定义偶数
def fn1(i):
	if i % 2 ==0:
		return True
#定义一个函数  3的倍数:
list=list(range(1,11,1))
def fn2(i):
	if i% 3==0:
		return Ture
#高阶函数
def fn (func,l):
	new_list=[]
	for i in list:
		if func(i):
			new_list.append(i)
	return new_list
print(fn(fn1,list))	##函数传参不能带括号,带括号为调用函数,本次使用判断为偶数的函数作为参数
[2,4,6,8,10]
###计算3的倍数,并返回新列表,我们传入参数函数对象fn2

def fn (func,l):
	new_list=[]
	for i in list:
		if func(i):
			new_list.append(i)
	return new_list
print(fn(fn2,list))#传入fn2函数对象
[3,6,9]

'''
(2)将函数对象作为返回值案例
filter()函数使用时,不用向上述案例一样从新定义一个高阶函数。filtrr()函数可以对列表进行过滤--作用
#语法:
filter(function,iterable)

**参数解释:**
function:函数对象
iterable:可迭代对象

**注意:**返回值是一个对象
'''
lsi= list(range(1,11))
def fn1(i):
	if i % 2 ==0:
		return True
print(list(filter(fn1,lsi)))#由于filter()返回值是一个对象,所以需要将对象转换成列表,根据需求转换对象。


总结:
高阶函数的使用,在传入函数参数时,传入的是函数对象,而不是调用函数。
便于灵活计算易变得一些条件筛选,我们可以将条件作为一个新函数,再将新函数对象作为参数传入高阶函数进行计算。

2. 匿名函数

lambda函数表达式可以用来创建一些简单的函数,它是函数的另一种创建方式

lambda  参数列表:返回值

案例:实现两个数a和b的和

y=lambda a,b: a+b
print((y)(1,3))##匿名函数返回一个接受对象,并打印值,第一种打印方式
4
print((lambda a,b : a + b)(1,3))#第二种方式暴力打印
4

总结:
以匿名函数方式传入参数,打印时需要将指定元素放于print()函数内,如果指定元素放于括号外,打印错误。

3.闭包

形成闭包的条件:
(1)函数嵌套
(2)将内部函数作为返回值返回
(3)内部函数必须要使用外部函数的变量

  • 为什么要有闭包这个东西存在?
    通过闭包我们可以创建一些只有当前函数能够访问的变量,我可以将一些私有的数据藏到闭包中。为什么藏在里面?–为了避免我们活着使用者在使用函数时,发生数据变动,导致函数改变。简而言之,闭包就是防止在计算时由于外部操作,导致函数计算错误。

4. 装饰器的引入

我们可以直接通过修改函数中的代码去完成这个需求,但是会产生一些问题

  • (1) 如果要修改的函数比较多,修改起来比较麻烦
  • (2) 不方便后期的维护
  • (3)这种方式会违反开闭原则(ocp) 要求对开发程序的扩展,要求关闭程序的修改

在对程序进行扩展时,需要从新定义一个新的函数,然后调用源程序并添加新的计算方法,每次对程序扩展时都需要从新定义函数,该步骤过于麻烦,因此,引入是否有一个东西,可以不用每次做程序开发时,不用从新定义函数,-答案是肯定的,那就是装饰器。使用装饰器可以在程序扩展时不用从新定义函数。

5. 装饰器的使用

  • (1)有的函数需要参数或有的函数不需要参数
    使用带星号的参数,函数中一个星号的在前,两个星号的在后

  • (2)装饰器的作用
    可以在不修改原函数的基础上对原函数进行扩展。
    在开发中都是通过装饰器对函数进行扩展。

  • (3)假设我们定义 一个装饰器,如何调用 或者 语法是什么???
    @装饰器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值