password
URL
type
status
date
slug
summary
tags
category
icon
周起始
标签
是否汉化
生活有一点我不是太喜欢,就是它总会让更懂事的人承担糟糕的感受和结果,但糟糕的是生活,不是你,你有能力改变这一切
高阶函数
什么是高阶函数?
只要满足下面的任意一个条件就是高阶函数
- 1、一个函数的
函数名
作为参数传给另外一个函数
- 2、一个函数返回值(return)为另外一个
函数
(返回为自己,则为递归)
如果函数包含其他函数作为参数或返回函数作为输出,则称为高阶函数(Higher Order Function),即与另一函数一起操作的函数称为高阶函数。这个高阶函数也适用于将函数作为参数或返回函数作为结果的函数和方法。Python 中常用的高阶函数有 map() 、reduce() 、filter() 、sorted() 等。
特点
Python 高阶函数的特点:
- 函数是对象类型(Object type)的实例
- 可以将函数存储在变量中
- 可以将函数作为参数传递给另一个函数
- 您可以从函数返回函数
- 您可以将它们存储在数据结构中,如哈希表、列表等…
函数作为对象
在 Python中,可以将函数分配给变量,此赋值不调用函数,而是创建对该函数的引用。考虑下面的例子,以便更好地理解。
在上面的示例中,一个函数对象被 shout 引用,并创建指向它的第二个名称 yell。
将函数作为参数传递给其他函数类似于 Python 中的对象,因此,它们可以作为参数传递给其他函数。请考虑下面的示例,在这里我们创建了一个函数 greet,它将函数作为参数。
一个函数的
函数名
作为参数传给另外一个函数返回函数
由于函数是对象,我们也可以从另一个函数返回一个函数。在下面的示例中,create_adder 函数返回 adder 函数。
这段代码使用了一个闭包(closure)的方式实现了一个创建adder的函数。
分析:
- create_adder()是一个工厂函数,用于创建专门的adder函数。
- create_adder()在内部定义了一个adder()函数,并返回它。
- adder()函数使用了外部变量x,这成为了一个闭包结构。
- 调用create_adder(15)时,会新建一个adder函数,其中x绑定为15。
- 然后我们用返回的adder函数创建了add_15。
- 在add_15(10)时,就相当于调用adder(10),根据闭包的机制,x=15已被绑定,所以计算15+10=25。
- 每次调用create_adder返回的函数都拥有自己特定的x值,互不影响。
这样通过闭包实现了创建参数化的adder函数的能力。make adder可以创建多个专门的加法函数。
这种方式非常巧妙地利用了闭包内外变量绑定的机制,是一个常见的函数式编程模式
一个函数返回值(return)为另外一个
函数
装饰器
装饰器是 Python 中最常用的高阶函数。它允许程序员修改函数或类的行为。装饰器允许我们包装另一个函数,以扩展包装函数的行为,而无需永久修改它。在 Decorators 中,函数作为参数被放入另一个函数中,然后在包装器函数中调用。
什么是装饰器
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
简单的装饰器
装饰器的语法允许我们在一个函数进行装饰之前干点额外的事情:
上面这个示例中,我们创建了一个叫做
my_decorator
的装饰器,它将负责装饰 say_whee
函数。装饰功能是在调用原函数之前和之后分别打印一条消息。使用装饰器语法
Python提供了一个语法糖 @ ,使得装饰器的使用更简洁:
上面的代码就是使用装饰器的标准姿势。
带参数的装饰器
为了让装饰器更通用,我们可以使用 *args 和 **kwargs 在装饰器里接收可变参数,这样就可以装饰带参数的函数了:
装饰器类
除了简单函数之外,装饰器还可以是类。使用类的好处是可以通过面向对象的方式保存装饰器的状态。
上面示例定义了一个
CountCalls
类,它实现了 __call__
方法,可以像函数一样被调用,同时通过属性可以保存状态。这就是Python装饰器的基本用法,它可以让我们很方便地为函数添加新功能。
其他例子
日志装饰器
这是一个python的装饰器函数,它可以用来打印出任意函数被调用时的函数名。
具体来说:
- log是一个装饰器函数,它接受一个func参数,func是要装饰的函数。
- log内部定义了一个wrapper函数,它接受任意args和kwargs参数。
- wrapper函数首先打印出"Call "加上要装饰的函数的名字func.name。
- 然后wrapper函数调用传入的func函数,并返回结果。
- log函数返回wrapper函数。
- 当使用@log装饰另一个函数时,这个函数就会替换成log 返回的wrapper函数。
- 这样当装饰的函数被调用时,就会先打印出"Call 函数名",然后再执行原函数。
- 所以装饰器的作用就是为已有函数添加额外功能。
认证验证
缓存结果
参数验证
计时器装饰器
自动化测试实例应用
参数化装饰器
上面的代码定义了一个装饰器
parameterized
,这个装饰器可以用于将多个参数传递给装饰的函数。让我逐步解释代码的结构和功能:parameterized
是一个装饰器工厂函数,它接受一个参数params
,这个参数是一个可迭代对象(如列表或元组),其中包含要传递给被装饰函数的参数。
decorator
函数是实际的装饰器,它接受一个函数func
作为参数。这个函数将被包装(装饰)起来,以便能够多次调用它,每次使用不同的参数。
- 在
decorator
函数内部,定义了一个wrapper
函数,它接受任意数量的位置参数args
和关键字参数*kwargs
。这是为了接收被装饰函数可能的参数。
- 在
wrapper
函数中,使用一个for
循环遍历参数列表params
中的每个参数(通常是元组),并将这些参数传递给被装饰的函数func
。这意味着被装饰的函数将会多次执行,每次使用不同的参数。
实例应用
在上面的示例中,
add
函数被 @parameterized
装饰,传递给装饰器的参数是一个包含多组参数的列表。当调用 add()
函数时,它会多次执行,每次使用不同的参数对进行加法运算,并输出相应的结果。这使得你可以轻松地测试一个函数在不同参数组合下的行为。request 装饰器
离开乏味的皮囊,自由的灵魂在路上
- Name: Alan Hsu
- Tag: 随感、技术、经验、旅行、推荐、生活、音乐、电影 etc.
- Email:xulanzhong521gmail.com
- Twitter:@AlanHsu521
- Telegram:@AlanHsu521
- WeChat: Alan_Hsu_521
- Github: https://github.com/xsoway/
- Author:Alan_Hsu
- URL:https://xmylog.com/article/articles_python_func
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts