本文主要介绍三种python的高级用法:列表推导式、迭代器和生成器、装饰器
一、列表推导(list comprehensions)
使用场景1:将一个三维列表中所有一维数据为1的元素合并,组成新的二维列表。
# 假设有一个三维数组
>>> result_list=[[1,2,3],[1,4,5],[4,7,6]]
>>> lista=[item for item in result_list if item[0]==1]
>>> lista
[[1, 2, 3], [1, 4, 5]]
>>>
维度是指描述一个事物所使用的参量个数,通常是在数学或物理上的描述。如上列表中嵌套列表的元素个数即为维度数。通过简单而又快速的列表推导式,可以很快的从一个多维列表中选出符合筛选条件的列表元素并组成新的列表,这种写法简洁而且快捷。
使用场景2:对于一个列表,既要遍历索引又要遍历元素。
这里可以使用python内建函数enumerate,在循环中更好的获得索引。
# 定义一个函数,专门处理数组数据
>>> def getitem(index,element):
... return '%s:%s' %(index,element)
...
# 定义数组
>>> array=['nihao','python']
# 使用enumerate函数,配合自定义函数使用
>>> arrayIndex = [getitem(index,element) for index,element in enumerate(array)]
>>> arrayIndex
['0:nihao', '1:python']
>>> array = ['abcdefg','1234567','ABCDEFG']
>>> arrayIndex = [getitem(index,element) for index,element in enumerate(array)]
>>> arrayIndex
['0:abcdefg', '1:1234567', '2:ABCDEFG']
二、迭代器和生成器
1.迭代器(Iterator)
使用isinstance()方法可以判断是否是迭代器或者是否能迭代。
from collections import Iterable
is_iterable = isinstance('python',Iterable)
print type
迭代器(Iterator):指的是可以使用next()方法来回调的对象,可以对可迭代对象使用iter()方法,将其转换为迭代器。
可迭代对象(Iterable):可以使用for循环进行循环的如列表,字典,元祖等,均为可迭代对象,但不是迭代器,可使用iter()方法将其转换为迭代器。
temp = iter(['a','b','c'])
print type(temp)
print next(temp)
这里temp就是一个迭代器,所以说,只有满足以下两个方法的,才是迭代器:
- next:返回下一个项目
2.iter: 返回迭代器本身
也可理解为可被next()函数调用并不断返回下一个值的对象就是迭代器,在定义一个装饰器时将需要同时定义这两个方法。
迭代器的优势
在构建迭代器时,不是将所有的元素一次性的加载,而是等调用next方法时返回元素,所以不需要考虑内存的问题。在数列的数据规模巨大或者数列有规律但是不能使用列表推导式描述的情况下比较适用。
2.生成器
生成器是一种高级迭代器,可以暂停一个函数并返回中间结果。当需要一个将返回一个序列或在循环中执行的函数时,就可以使用生成器,因为当这些元素被传递到另一个函数中进行后续处理时,一次返回一个元素可以有效的提升整体性能。