Python之列表生成式、生成器、可迭代对象与迭代(2)

我觉得,大家应该已经发现这里说的列表生成式的功能与之前 这篇文章 中讲到的map()和filter()高阶函数的功能很像,比如下面两个例子:

实例1:把一个列表中所有的字符串转换成小写,非字符串元素原样保留 L = ['TOM', 'Peter', 10, 'Jerry'] # 用列表生成式实现 list1 = [x.lower() if isinstance(x, str) else x for x in L] # 用map()函数实现 list2 = list(map(lambda x: x.lower() if isinstance(x, str) else x, L)) 实例2:把一个列表中所有的字符串转换成小写,非字符串元素移除 L = ['TOM', 'Peter', 10, 'Jerry'] # 用列表生成式实现 list3 = [x.lower() for x in L if isinstance(x, str)] # 用map()和filter()函数实现 list4 = list(map(lambda x: x.lower(), filter(lambda x: isinstance(x, str), L)))

��于大部分需求来讲,使用列表生成式和使用高阶函数都能实现。但是map()和filter()等一些高阶函数在Python3中的返回值类型变成了Iteraotr(迭代器)对象(在Python2中的返回值类型为list),这对于那些元素数量很大或无限的可迭代对象来说显然是更合适的,因为可以避免不必要的内存空间浪费。关于迭代器的概念,下面会单独进行说明。

三、生成器(Generator)

从名字上来看,生成器应该是用来生成数据的。

1. 生成器的作用

按照某种算法不断生成新的数据,直到满足某一个指定的条件结束。

2. 生成器的构造方式

构造生成器的两种方式:

使用类似列表生成式的方式生成 (2*n + 1 for n in range(3, 11))

使用包含yield的函数来生成

如果计算过程比较简单,可以直接把列表生成式改成generator;但是,如果计算过程比较复杂,就只能通过包含yield的函数来构造generator。

说明: Python 3.3之前的版本中,不允许迭代函数法中包含return语句。

3. 生成器构造实例 # 使用类似列表生成式的方式构造生成器 g1 = (2*n + 1 for n in range(3, 6)) # 使用包含yield的函数构造生成器 def my_range(start, end): for n in range(start, end): yield 2*n + 1 g2 = my_range(3, 6) print(type(g1)) print(type(g2))

输出结果:

<class 'generator'> <class 'generator'> 4. 生成器的执行过程与特性 生成器的执行过程:

在执行过程中,遇到yield关键字就会中断执行,下次调用则继续从上次中断的位置继续执行。

生成器的特性:

只有在调用时才会生成相应的数据

只记录当前的位置

只能next,不能prev

5. 生成器的调用方式

要调用生成器产生新的元素,有两种方式:

调用内置的next()方法

使用循环对生成器对象进行遍历(推荐)

调用生成器对象的send()方法

实例1:使用next()方法遍历生成器 print(next(g1)) print(next(g1)) print(next(g1)) print(next(g1))

输出结果:

7 9 11 Traceback (most recent call last): File "***/generator.py", line 26, in <module> print(next(g1)) StopIteration print(next(g2)) print(next(g2)) print(next(g2)) print(next(g2))

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f77ac7316e5df9cf4f98cd5ef6820607.html