Python—高级函数

简介: 闭包

一、闭包


Python函数是支持嵌套的。如果在一个内部函数中对外部函数作用域(非全局作用域)的变量进行引用,那么内部函数就会被称为闭包。


闭包需要满足如下3个条件:


存在于两个嵌套关系的函数中,并且闭包是内部函数;

内部函数引用了外部函数的变量;

外部函数会返回内部函数的函数名。


举例:


#演示内置函数

def a():#1定义外部函数

b=1#3 外部函数代码

def c():#4定义内部函数

print(b)#6 执行内部函数代码

c()#5调用内部函数

a() #2调用外部函数

#演示把内部函数返回(闭包的必要条件),外部可以用接收返回值的方式来访问内部函数

def a():

def b():

return 1 #定义了内部函数的返回值为1

return b #定义了外部函数的返回值为内部函数

rst=a() #接收了外部函数的返回值,也就是内部函数

print(rst)#rst就是内部函数

print(a()())#a()()=rst()

print(rst())#rst()是调用内部函数

 

#使用一个函数作为另一个函数的参数

def a(func_a):#可以传任意函数

print("你好,我是小a!")

func_a() #可以对已定义的函数做额外的操作,不需要修改原来的函数

print("gudeibai")

 

def b():

print("你好,我是小b!")

a(b)

 

def outer(start=0):

count=[start]

def inner():

count[0]+=1

return count[0]

return inner

out=outer(5)

print(out())

 

#使用闭包实现案例

#有银行卡才能执行汇款的操作

#外部函数为创建银行卡

#内部函数为汇款的操作

def bank(isVIP,action):

if isVIP:

print("客户你好,欢迎光临")

else:

print("您好,给你办一张新卡")

if action=="huikuan":

def remit():

print("进行汇款操作")

return remit

if action=="cun":

def cunkuan():

print("进行存款")

return cunkuan

 

card=bank(False,"cun")

card()

 

二、什么是装饰器


假设我们已经定义了一个函数,后续可能会增加临时的需求,例如插入日志,我们可以增加一个包裹函数,由它来负责这些额外的需求,这个包裹函数就是装饰器 。

装饰器主要用于下列场景:


引入日志;

函数执行时间统计;

执行函数前预备处理;

执行函数后清理功能;

权限校验;

缓存。

 

装饰器是一个函数,它需要接收一个参数,该参数表示被修饰的函数。例如,有如下一个装饰器函数:


def wrap(func):

print(‘正在装饰’)

def inner():

print(‘正在验证权限’)

func()

return inner()

装饰器是个嵌套函数

内部函数是一个闭包。

外部函数接收的是被修饰的函数(func)

 

通过在函数定义的前面添加@符号和装饰器名,实现装饰器对函数的包装。给test函数加上装饰器,示例如下:

@wrap

def test():

print(’test')

此时,程序会自动编译生成调用装饰器函数的代码,等价于:

test = wrap(test)

举例:

1.#演示装饰器

from functools import wraps, reduce

 

def a(func_a):

print("装饰器开始工作")

@wraps(func_a)

def b():

print("闭包开始工作")

func_a()

print("装饰器工作结束")

return b

 

def decorator_c():

print("感觉很虚空,需要被装饰")

 

rst=a(decorator_c()) #b

rst()

@a

def abc():

print("想要被装饰")

abc()

print(abc.__name__)

2.

def func(function_name):

print("这是一个有返回值的闭包")

def func_in():

return function_name()

return func_in

 

@func #装饰器的名称

def test():

return 'hello world'

a=test()

print(a)

3.

def out(args):

def fun(function_name):

print('闭包')

def fun_in():

print(args)

return function_name()

return fun_in

return fun

fun=out('hello')

@fun

def test():

return 'hello world'

 

a=test()

print(a)

 

三、常见Python内置函数


  • map函数

map函数会根据提供的函数对指定的序列做映射。

map函数的定义如下:

map(function, iterable,…)

参数function表示函数的名称,参数iterable可以是序列、支持迭代的容器或者迭代器。

 

map函数的作用是以iterable中的每个元素调用function函数,把每次调用后返回的结果保存为迭代器对象。

func = lambda x:x+2

result = map(func, [1,2,3,4,5])

print(list(result))


举例:

#演示map函数

func=lambda x:x+2

rst=map(func,(1,2,3,4,5))

for x in rst:

print(x)


  • filter函数

filter函数会对指定序列执行过滤操作。

filter函数的定义如下:

filter(function,iterable)

function参数可以是函数的名称或None; iterable参数可以是序列、支持迭代的容器或迭代器。

func = lambda x:x%2

result = filter(func, [1, 2, 3, 4, 5])

print(list(result))


举例:

#演示filter函数

func=lambda x:x>5#返回为true通过,false不通过

rst=filter(func,[1,2,3,4,5,6,7,8])

print(list(rst))

 

  • reduce函数

reduce函数会对参数序列中的元素进行累积。

reduce函数的定义如下:

reduce(function, iterable[, initializer])

function是一个带有两个参数的函数;

iterable是一个迭代器对象;

initializer表示固定的初始值。


代码演示:

from functools import reduce

func = lambda x, y:x + y

result = reduce(func, [1, 2, 3, 4, 5])

print(result)


举例:

#演示reduce函数

func=lambda x,y:x+y#前一个值和后一个值相加

rst=reduce(func,[1,2,3,4,5,6,7,8,9,10])

print(rst)

 

注意:function参数不能为None。

在Python 3中,reduce函数已经被从全局名字空间里面移除了,它现在被放置在fucntools模块中,使用时需要先引入,格式如下:

from functools import reduce

 

总结:


闭包:

1、一个函数包含另一个函数

2、外部函数return了内部函数名

3、内部函数调用了外部函数的变量

--这个内部函数叫做闭包

特点:闭包不能直接被调用,而是需要调用外部函数获得返回值;使用该返回值(),来调用内部函数

 

二、装饰器

1、在外部函数的参数部分接收函数名

2、在内都函数的函数体中调用参数对应的函数

3.外部函数返回了内部函数

4.调用外部函数获取返回值(闭包)

5.通过闭包调用,实现对参数对应的函数调用

6.可以通过@装饰器名,来替代传参的过程

特点:

装饰器的调用相对安全可靠,并且不会改变原函数的逻辑

相关文章
|
2月前
|
Python
【python从入门到精通】-- 第五战:函数大总结
【python从入门到精通】-- 第五战:函数大总结
80 0
|
21天前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
124 67
|
14天前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
42 18
|
6天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
37 8
|
15天前
|
Python
Python中的函数
Python中的函数
31 8
|
22天前
|
监控 测试技术 数据库
Python中的装饰器:解锁函数增强的魔法####
本文深入探讨了Python语言中一个既强大又灵活的特性——装饰器(Decorator),它以一种优雅的方式实现了函数功能的扩展与增强。不同于传统的代码复用机制,装饰器通过高阶函数的形式,为开发者提供了在不修改原函数源代码的前提下,动态添加新功能的能力。我们将从装饰器的基本概念入手,逐步解析其工作原理,并通过一系列实例展示如何利用装饰器进行日志记录、性能测试、事务处理等常见任务,最终揭示装饰器在提升代码可读性、维护性和功能性方面的独特价值。 ####
|
29天前
|
Python
Python中的`range`函数与负增长
在Python中,`range`函数用于生成整数序列,支持正向和负向增长。本文详细介绍了如何使用`range`生成负增长的整数序列,并提供了多个实际应用示例,如反向遍历列表、生成倒计时和计算递减等差数列的和。通过这些示例,读者可以更好地掌握`range`函数的使用方法。
45 5
|
2月前
|
Python
Python之函数详解
【10月更文挑战第12天】
Python之函数详解
|
2月前
|
存储 数据安全/隐私保护 索引
|
1月前
|
测试技术 数据安全/隐私保护 Python
探索Python中的装饰器:简化和增强你的函数
【10月更文挑战第24天】在Python编程的海洋中,装饰器是那把可以令你的代码更简洁、更强大的魔法棒。它们不仅能够扩展函数的功能,还能保持代码的整洁性。本文将带你深入了解装饰器的概念、实现方式以及如何通过它们来提升你的代码质量。让我们一起揭开装饰器的神秘面纱,学习如何用它们来打造更加优雅和高效的代码。