列表推导(list comprehensions)
场景1:将一个三维列表中所有一维数据为a的元素合并,组成新的二维列表。
最简单的方法:新建列表,遍历原三维列表,判断一维数据是否为a,若为a,则将该元素append至新列表中。
缺点:代码太繁琐,对于Python而言,执行速度会变慢很多。
针对场景1,我们首先应该想到用列表解析式来解决处理,一行代码即可解决:
lista = [item for item in array if item[0] == 'a']
那么,何为列表解析式?
官方解释:列表解析式是Python内置的非常简单却强大的可以用来创建list的生成式。
强大具体如何体现?
可以看到,使用列表解析式的写法更加简短,除此之外,因为是Python内置的用法,底层使用C语言实现,相较于编写Python代码而言,运行速度更快。
场景2: 对于一个列表,既要遍历索引又要遍历元素。
这里可以使用Python内建函数enumerate,在循环中更好的获取获得索引。
array = ['I', 'love', 'Python']for i, element in enumerate(array): array[i] = '%d: %s' % (i, seq[i])
可以使用列表推导式对其进行重构:
def getitem(index, element): return '%d: %s' % (index, element)array = ['I', 'love', 'Python']arrayIndex = [getitem(index, element) for index, element in enumerate(array)]
据说这种写法更加的Pythonic。
总结:如果要对现有的可迭代对象做一些处理,然后生成新的列表,使用列表推导式将是最便捷的方法。
迭代器和生成器
迭代器(Iterator)
这里的迭代可以指for循环,在Python中,对于像list,dict和文件等而言,都可以使用for循环,但是它们并不是迭代器,它们属于可迭代对象。
什么可迭代对象
最简单的解释:可以使用for...in...语句进行循环的对象,就是可迭代对象(Iterable),可以使用isinstance()方法进行判断。
from collections import Iterable type = isinstance('python', Iterable)print type
什么是迭代器
迭代器指的是可以使用next()方法来回调的对象,可以对可迭代对象使用iter()方法,将其转换为迭代器。
temp = iter([1, 2, 3])print type(temp)print next(temp)
此时temp就是一个迭代器。所以说,迭代器基于两个方法:
next:返回下一个项目 iter 返回迭代器本身可理解为可被next()函数调用并不断返回下一个值的对象就是迭代器,在定义一个装饰器时将需要同时定义这两个方法。
迭代器的优势
在构建迭代器时,不是将所有的元素一次性的加载,而是等调用next方法时返回元素,所以不需要考虑内存的问题。
迭代器应用场景
新闻热点
疑难解答