python 列表解析

为什么:

  1. 代码精简,易维护
  2. 比普通的循环效率更高,但对大数据列表解析不适合,可能会暂用大量内存,导致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)可以是简单的或者复杂的表达式,甚至是函数

  1. >>> 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

posted @ 2015-11-24 11:04  Rikewang  阅读(542)  评论(0编辑  收藏  举报