什么是Python中的生成器和装饰器?
在本文中,我们将向您解释Python中的生成器和装饰器是什么。
自PEP 255推出以来,生成器一直是Python的重要组成部分。
在Python中,生成器是一种特殊的例程,可用于控制循环的迭代行为。生成器类似于返回数组的函数。生成器有一个参数,我们可以调用它并它会生成一个数字序列。但与返回整个数组的函数不同,生成器一次只产生一个值,这需要更少的内存。
任何带有关键字“yield”的Python函数都可以称为生成器。普通Python函数从第一行开始执行,直到我们得到一个return语句、异常或函数结束,但是,函数作用域期间创建的任何局部变量都会被销毁并且不能进一步访问。而在生成器的情况下,当遇到yield关键字时,函数的状态被冻结,并且所有变量都存储在内存中,直到再次调用生成器时才释放。
我们可以按照迭代器的方式使用生成器,也可以使用“next”关键字显式地调用它。
通常情况下,Python中的生成器 –
- 在def关键字中定义。
-
使用yield关键字。
-
可能包含几个yield关键字。
-
返回一个迭代器。
生成器是返回可迭代的生成器对象的函数。因为从生成器对象获取的值是一个接一个地获取而不是一次性获取整个列表,所以您可以使用for循环,next()或list()函数来获取实际的值。
更多Python相关文章,请阅读:Python 教程
生成器函数
可使用生成器函数和生成器表达式来创建生成器。
生成器函数类似于常规函数,但是Instead of a return value, it has a yield keyword.
若要创建生成器函数,请添加 yield 关键字。下面的示例演示如何编写生成器函数。
带有迭代器的生成器
示例
# 创建一个函数
def generatorExample():
yield "T"
yield "U"
yield "T"
yield "O"
yield "R"
yield "I"
yield "A"
yield "L"
yield "S"
# 调用上面创建的generatorExample()函数
result = generatorExample()
# 遍历上述结果(生成器对象)
for k in result:
# 打印相应的值
print(k)
输出
T
U
T
O
R
I
A
L
S
从生成器读取yield值
可以使用list()、for循环和next()方法从生成器对象中读取值。
使用next()从生成器对象中读取值
next()方法返回列表、数组或对象中的下一项。当列表为空且调用next()时,它会返回带有stopIteration标识的错误。此错误表示列表中没有更多的条目。
示例
#创建一个接受数字为参数的函数
def oddNumbers(num):
#遍历给定数字
for i in range(num):
#检查迭代器索引值是否为奇数
if (i%2!=0):
#如果条件为真,则使用yield关键字获取迭代器的索引值
yield i
#调用上述函数以获取8以下的奇数
result = oddNumbers(8)
#调用结果列表中的下一个项
print(next(result))
print(next(result))
print(next(result))
print(next(result))
#由于列表没有更多元素,因此抛出错误
print(next(result))
输出结果
1
3
5
7
Traceback (most recent call last):
File "main.py", line 17, in <module>
print(next(result))
StopIteration
Python中的装饰器
Python提供了一种令人惊叹的工具称为 装饰器 以添加现有代码的功能。
这也被称为 元编程 由于程序的一部分试图在编译时修改程序的另一部分。
装饰器在另一个函数中使用函数作为参数,然后在包装函数中调用该函数。
语法
@tutorials_decorator
def python_decorator():
print("Hello tutorials Point")
'''以上代码相当于 -
def python_decorator():
print("Hello tutorials Point")
python_decorator = tutorials_decorator(python_decorator)'''
这里的 tutorials_decorator 是一个可调用函数,它在另一个 可调用 函数 python_decorator 之上添加一些代码,并返回包装器函数。
示例
这里 func 是被修饰的函数, python_decorator 是用于修饰它的函数。
#定义一个装饰器
def python_decorator(func):
def wrapper():
print("调用函数之前的文本")
func() print("调用函数之后的文本")
return wrapper
def tutorials_decorator():
print("你好教程点!!!")
tutorials_decorator = python_decorator(tutorials_decorator)
tutorials_decorator()
输出结果
调用函数之前的文本
你好教程点!!!
调用函数之后的文本
python_decorator(func) − 这是一个装饰器函数;它将另一个函数作为参数,并“装饰”它,这意味着它修改它并返回修改后的版本。
包装器 − 我们在装饰器函数中定义了另一个内部函数,名为 wrapper 。这是实际修改传递的函数 func 的函数,它对其进行包装。
包装器函数由装饰器返回。
tutorials_decorator − 这是我们需要装饰的普通函数。在这里,它只是打印了一个简单的语句。
语法装饰器
上述描述的装饰器模式在Python社区中变得流行,但有点复杂。我们必须三次编写函数名称,并且装饰在函数定义之下。
因此,Python添加了一种新的方法来使用装饰器,其中包含用 @ 符号 的语法糖。
语法
@decorator
def func(arg1, arg2, ...):
pass
语法糖是在编程语言内部使用的一种语法,以使事情更易于阅读或表达。
示例
下面的示例执行与以前相同的操作 −
# 定义装饰器
def python_decorator(func):
def wrapper():
print("调用函数前的文本")
func()
print("调用函数后的文本")
return wrapper
@python_decorator
def tutorials_decorator():
print("Hello Tutorials Point!!!")
tutorials_decorator()
输出
调用函数前的文本
Hello Tutorials Point!!!
调用函数后的文本
它与前面的示例相同,唯一的区别是我们使用了 @python_decorator 而不是
tutorials_decorator = python_decorator(tutorials_decorator)
结论
在本文中,我们简要介绍了Python中的生成器和装饰器。我们还演示了如何在编写代码时使用生成器和装饰器。