为什么:
-
代码精简,易维护
-
比普通的循环效率更高,但对大数据列表解析不适合,可能会暂用大量内存,导致MemoryError
是什么:
语法: [expr for iter_item in iterable if cond_expr]
>>>a = [' Are', 'you', 'Ok?', 1, 2]
>>> [x for x in a if isinstance(x,int)]
[1, 2]
支持多重嵌套:
>>> a=[['i','am'],['wxl','!']]
>>> [[x.upper() for x in item] for item in a]
[['I', 'AM'], ['WXL', '!']]
多重迭代:
>>> a
[1, 2, 3, 4]
>>> b
[3, 5]
>>> [ m+n for m in a for n in b if m == n ]
[6]
表达式(expr)可以是简单的或者复杂的表达式,甚至是函数
-
>>> def f(v):
... return '+' if v>0 else '-'
>>> [f(v) for v in [-1,0,1,2] ]
['-', '-', '+', '+']
2. >>> ['+' if v>0 else '-' for v in [-1,0,1,2] ]
['-', '-', '+', '+']
iterable可以时任意的可迭代对象:
>>> f=open("test")
>>> [i.strip() for i in f]
['I', 'am', 'wxl']
生成器表达式:(expr for iter_item in iterable if cond_expr)
生成器的使用场景:序列过长, 而每次只需要获取一个元素时
A generator object in python is something like a lazy list. The elements are only evaluated as soon as you iterate over them
有些像惰性的列表,只有当需要的时候才会生成
>>> a=[1,2,3,4]
>>> (i, for i in a if i>2) #只是生成迭代器 next可访问
当函数接收可迭代对象参数时,可以使用生成器简写
>>> def f(a):
... for i in a:
... print i
>>> f((1,)) #注意元组(1,)不是(1),否则报错'int' object is not iterable
1
>>> p=open("test")
>>> f(p)
I
am
wxl
>>> f(i for i in range(3) if i%2 == 0)
0
2