和列表一样,
列表推导式
也采用方括号[]表示,并且用到了一个简写版的for循环,第一部分是一个生成结果列表元素的表达式,第二部分是一个输入表达式上的循环。阅读理解列表表达式的推荐做法是先从里面的for循环开始,向右查看是否有if条件,然后将推导式开始的那个表达式映射到每一个匹配的元素上去。
在处理大量的数据是,最好考虑生成器表达式而不是列表推导式。
- >>> even_numbers = [x for x in range(10) if x%2 == 0]
- >>> even_numbers
- [0,2,4,6,8]
以上例子展示了使用if语句来过滤元素。
Python还支持另外一种和列表表达式类似的结构,叫做生成器表达式(generator expression),除了它有一种称之为“惰性计算”的特点以外,它和列表推导式的用法基本一致。它的工作方式是每次处理一个对象,而不是一口气处理和构造整个数据结构,这样做的潜在优点是可以节省大量的内存。
- >>> even_numbers = (x for x in range(10000) if x%2 == 0)
- >>> even_numbers
- <generator object at 0x....>
另一个列表推导式和生成器表达式的例子是:
- >>> data = ['abc','def','I use python', 'hong201']
- >>> sum([len(word) for word in data])
- 25
- >>> sum(len(word) for word in data)
- 25
enumerate()是一个同时能让你迭代和计数的内置函数,而for循环自身只能迭代而没办法计数:
- >>> data = [123,"abc",3.14]
- >>> for i in enumerate(data):
- ... print i
- ...
- (0, 123)
- (1, 'abc')
- (2, 3.14)