列表/字典/集合解析式和生成器

列表解析式

列表解析式是将一个列表(实际上适用于任何 可迭代对象(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就直接退出函数并返回一个值了

posted @ 2019-04-17 23:27  LuoSpider  阅读(483)  评论(0编辑  收藏  举报