Python生成器总结【很是详细】

列表生成式

列表生成式是 python 内置的很是强大的能够用来生成列表的生成式。在学习生成器以前先来了解一下列表生成式,者有利于咱们队生成器的理解。python

列表生成式的语法格式以下app

[exp for iter_var in iterable if_exp]

列表生成式的实际执行过程以下:函数

  • 迭代 iterable 中的每一个元素,每次迭代都先判断 if_exp 表达式结果为真,若是为真则进行下一步,若是为假则进行下一次迭代;
  • 把迭代结果赋值给 iter_var,而后经过 exp 获得一个新的计算值;
  • 最后把全部经过 exp 获得的计算值以一个新列表的形式返回。
若是迭代获得的元素无需过滤的话,if_exp 能够省略。

咱们若是要生成一个 1 至 100 的整数的列表能够使用 list(range(1,101)), 若是要 1 到 100 的整数的平方咱们能够使用循环来实现工具

list = []
for x in range(1, 101):
    list.append(x * x)

print(list)

除了使用选好咱们还能够使用列表生成式来实现学习

list = [x * x for x in range(1, 101)]
print(list)

如今咱们须要 1 至 100 中全部偶数的的平方,咱们也能够使用列表生成式来实现开发工具

list = [x * x for x in range(1, 101) if x % 2 == 0]
print(list)

经过使用列表生成式咱们能够写出简洁的代码来快速的初始化列表。spa

生成器

生成器从名字上来看能够理解为生成数据的工具。生成器按照某种特定的规则不断的生成数据,直到结束为止。3d

生成器的语法规则以下:code

(exp for iter_var in iterable if_exp)

从形式上看生成器和列表生成式很是类似,生成器仅仅是将列表生成式的方括号换成了圆括号。而实际使用上却有很大的差异,列表生成式一次生成一个列表若列表的元素过多则占用很大的内存空间,而生成器一次仅生成一个元素即节省了内存空间又能够获取完整的列表内容。blog

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

list1 = [x * x for x in range(1, 20) if x % 2 == 0]
list2 = (x * x for x in range(1, 20) if x % 2 == 0)

print(type(list1))
print(type(list2))
print(list1)
print(list2)
for n in list2:
    print(n)
for n in list2:
    print(n)

以上代码执行结果以下:

<class 'list'>
<class 'generator'>
[4, 16, 36, 64, 100, 144, 196, 256, 324]
<generator object <genexpr> at 0x101163390>
4
16
36
64
100
144
196
256
324

从以上代码的执行结果咱们能够看出,使用列表生成式即生成了一个完整的列表,包含了列表的全部元素;使用生成器产生的是一个生成器,自己未含有任何元素,当咱们使用 for 循环进行迭代时能够获取生成器生成的整个列表的元素,可是生成器仅能迭代一次,迭代完成后将没法再获取内容,这也是迭代器的特性。

生成器解具备不少用途,在不少地方替代列表使用是一个不错的选择。特别是针对大量值的时候,列表占内存较多,生成器的优点就在于少占内存,所以无需将生成器实例化为一个列表,直接对其进行操做,方显示出其迭代的优点。

以上列表是比较简单的生成器,能够直接使用列表生成式修改获得,若是是比较复杂的生成器则须要使用包含 yield 的函数来实现。下面咱们经过 yield 函数来实现上面的列表(包含 1 至 20 中全部偶数的平方)。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

def even_squares(start, end):
    for n in range(start, end):
        if n % 2 == 0:
            yield n * n

list = even_squares(1, 20)
print(type(list))
print(list)
for n in list:
    print(n)

以上代码执行结果以下

<class 'generator'>
<generator object even_squares at 0x10aa38c00>
4
16
36
64
100
144
196
256
324

从以上代码运行结果能够看出使用 yield 函数和使用列表生成式的生成器获取的结果彻底相同。

生成器具备如下特色:

  1. 能够使用相似列表生成式的方式生成,也能够使用 yield 函数生成。
  2. 生成器只在使用时才生成数据,可用来节省内存空间。
  3. 生成器实际是一个特殊的迭代器,能够使用 for 循环进行迭代。
  4. 只记录当前的位置,只能向前不能向后,「生成器只能使用一次,再次使用需从新初始化」。最后注意:无论你是为了Python就业仍是兴趣爱好,记住:项目开发经验永远是核心,为解决初学者学习上的困难,专门创建的Python学习扣QUN:⑧⑤⑤-④零⑧-⑧⑨③从零基础开始到Python各领域的项目实战教程、开发工具与电子书籍。与你分享企业当下对于python人才需求及学好python的高效技巧,不停更新最新教程
相关文章
相关标签/搜索