我觉得,大家应该已经发现这里说的列表生成式的功能与之前 这篇文章 中讲到的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))