生成器理解是在 python 中创建生成器的一种聪明而有效的方法。 它是定义生成器的单行规范,对于理解该语法以高效编码至关重要。
在本文中,我们将学习 python 的生成器和生成器理解以及示例。
Python 中的生成器是返回可迭代或遍历对象的函数,用于创建一次遍历项目的迭代器。 生成器是使用预定义的 iter()
和 next()
函数创建迭代器的一种简单易行的方法,以跟踪内部状态,它还负责处理 StopInteration 异常。
虽然在 Python 中创建迭代有很多复杂性,但您必须定义和实现 iter()
和 next()
函数。 这是一个漫长的过程,但多亏了发电机。
让我们看一个 Python 生成器的例子。
# A simple generator function
def my_gen():
n = 1
print(f'This is line number {n}')
# generator function always contains the 'yield' Keyword
yield n
n += 1
print(f'This is line number {n}')
yield n
n += 1
print(f'This is line number {n}')
yield n
print(my_gen())
输出:
<generator object my_gen at 0x00000150EA43E448>
我们在上面的函数中使用了 yield
将值转换为生成器。 当我们打印 my_gen()
函数时,我们得到了可用于迭代生成器的函数对象。
让我们看一个迭代生成器的例子。
def even_nums():
# create generator
for i in range(11):
if(i%2==0):
yield i
print("This is the generator object of the generator function:",even_nums())
# iterate over the generator function
print("\nEven number from 0 to 11")
for i in even_nums():
print(i, end= ", ")
输出:
This is the generator object of the generator function: <generator object even_nums at 0x05ACC2D0>
Even number from 0 to 11
0, 2, 4, 6, 8, 10,
生成器理解类似于 Python 中的列表理解; 但是,括号和方括号将它们区分开来。 我们可以使用 Python 中的生成器理解轻松创建一个简单的生成器,其工作方式类似于创建匿名函数的 lambda 函数。
生成器理解和列表理解之间的区别在于生成器理解同时创建一个项目,而列表理解同时创建整个列表。 生成器理解速度更快且内存效率更高。
让我们看一个 Python 中生成器理解的例子。
# generator comprehension in python
# take the square of each number from 1-6 and store it in 'gen'
gen = (x**2 for x in range(1,6))
print(gen) # return --> generator object
# iterate over the generator 'gen'
for i in gen:
print(i, end=", ")
输出:
<generator object <genexpr> at 0x00000150EA43EC48>
1, 4, 9, 16, 25,
在上面的代码示例中,生成器表达式已按需生成所需的结果,但不是立即生成。 它返回生成器的对象,我们稍后使用该对象使用 for 循环遍历生成器。
您可以使用 next()
函数按顺序打印生成器的每个值,因为生成器会处理值的顺序和状态。
# generator comprehension in python
# take the square of each number from 1-6 and store it in 'gen'
gen = (x**2 for x in range(1,6))
# next()
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
输出:
1
4
9
16
25
如您所见,我们正在使用 next()
获取按需值,它会处理值的序列,因为我在每个 next()
函数之后获取下一个值。