python三大推导式
python的推导式非常好用,可以大大简化代码的设计,大致可分为三大类,分别是列表推导式、字典推导式和集合推导式。
python列表推导式的三种用法
基本用法
>>> a = list(range(10))
>>> b = [ i*i for i in a ]
>>> b
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
实例解析
列表推导式,用英文的方括号“[ ]”括起来,for循环之前的表达式相当于for每一次遍历循环过程中的返回值,i则是for遍历过程中获取的元素,该表达式相当于如下的for循环。
>>>c = [] #声明一个空列表
for i in a: #遍历列表a中的元素
x = i*i
c.append(x)
c
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> d = [i*i for i in range(10)] #上面的代码我们可以将其简化一句代码
>>> d
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
简而言之,这种列表推导式可以看作是:[ 表达式 for循环 ]两个部分的形式
增加条件判断的列表推导式
这种增加条件判断的推导式,可以看作是:[ 表达式 for循环 条件判断 ]三个部分的形式。
>>> a = [ x*x for x in range(10) if x%2 != 0 ] #增加了一个条件判断,用于过滤掉偶数
>>> a
[1, 9, 25, 49, 81]
多重循环的列表推导式
这种模式的列表推导式可以看作是:[ 表达式 for循环 for循环 ... ]
>>> a = [ x+y+z for x in 'abc' for y in '123' for z in 'def'] #增加了一个条件判断,用于过滤掉偶数
>>> a
['a1d', 'a1e', 'a1f', 'a2d', 'a2e', 'a2f', 'a3d', 'a3e', 'a3f', 'b1d', 'b1e', 'b1f', 'b2d', 'b2e', 'b2f', 'b3d', 'b3e', 'b3f', 'c1d', 'c1e', 'c1f', 'c2d', 'c2e', 'c2f', 'c3d', 'c3e', 'c3f']
从上面的实例,我们可以发现,多个循环的时候,就相当于for循环的嵌套,而不是并列循环,也就是最外层的循环一次,第二层的就需要全部循环完,以此类推。比如上面的例子,最外层的循环到b时,最外层的循环了一次,第二层已经循环一遍了,而第三层的意境循环三遍了。
列表推导式获取字典的数据
e = {'x1y1z1.com':'大器编程','理念':'璞玉天成,大器晚成'}
>>> new_e = [key+'—'+value for key, value in e.items() ]
>>> new_e
['x1y1z1.com—大器编程', '理念—璞玉天成,大器晚成']
字典推导式
字典的推导式与列表的推导式大同小异,不过字典是用“{}”括起来的,而且是键值对的类型:
>>> d = {x : str(x) for x in range(10) }
>>> d
{0: '0', 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9'}
>>> type(d)
< class 'dict' >
集合推导式
集合的推导式也用“{}”括起来,但是没有键值对。
>>> f = {x*2 for x in range(10) }
>>> f
{0, 2, 4, 6, 8, 10, 12, 14, 16, 18}
>>> type(f)
< class 'set' >
下一章节,我们将介绍python的迭代器。