列表/字典/集合解析式和生成器
列表解析式
列表解析式是将一个列表(实际上适用于任何 可迭代对象(iterable) )转换成另一个列表的工具。在转换过程中,可以指定元素必须符合一定的条件,才能添加至新的列表中,这样每个元素都可以按需要进行转换。
a0=dict(zip(('a','b','c'),(1,2,3))) a1=range(10) a2=[i for i in a1 if i in a0] print(a2)
以上代码打印的是一个空列表
我们来解释一下代码列表解析式运用的逻辑:
a0=dict(zip(('a','b','c'),(1,2,3))) a1=range(10) a2=[] for i in a1: if i in a0: a2.append(i) print(a2)
前面两个创建列表的方法等价,这时你就可以理解了列表解析式的基本运用了
这时还有一个问题,为什么打印的值为空呢?这是因为 if i in a0这个语句判断的是i是否在字典中,判断的是字典的key值而不是value值,所以不等价返回的是False
字典解析式
用于创建一个字典(可加条件语句或嵌套语句)
A1=range(10) A2={i:i*8 for i in A1 if i>5} print(A2) #{6: 48, 7: 56, 8: 64, 9: 72}
字典的形式是{key,value},所以这里用的是花括号并传递key和value用冒号隔开
集合解析式
用于创建一个集合(可加条件语句或嵌套语句)
A1=range(10) A2={i for i in A1 if i>5} print(A2) print(type(A2)) #{8, 9, 6, 7} #<class 'set'>
注意集合的顺序是随机的
生成器
生成器是可迭代对象,可用list()转换成列表和循环遍历出值
有两种生成器创建方法:生成器表达式和生成器函数
生成器表达式
用于创建一个生成器(可加条件语句或嵌套语句)
A1=range(10) A2=(x*2 for x in A1) print(A2) #<generator object <genexpr> at 0x007ED090>
生成器函数
def gen(n): for i in range(n): yield i*i for item in gen(5): print(item) # 0 # 1 # 4 # 9 # 16
这里用yield返回一个生成器
yield会一次返回一个结果,然后挂起,下次从挂起处继续执行,这能有效的减少内存损耗
如果是return就直接退出函数并返回一个值了