python中那些让开发事半功倍的模块
1. Map
Map会将一个函数映射到一个输入列表的所有元素上
ex: 有一个列表: [1,2,3,4,5,6], 现在要求把列表每个元素乘以10
如果你还不知道Map,那你可能会这样做:
list1 = [1,2,3,4,5,6] list2 = list() for i in list1: list2.append(i*10) print(list2) # output: [10, 20, 30, 40, 50, 60]
以上写法没问题,但是不够pythonic。 接下来我们看下如何利用map让代码更加优雅吧!
list1 = [1,2,3,4,5,6] list2 = map(lambda item:item*10, list1) print(list2) # output: <map object at 0x0000017CD1F4BE80>
你可能会很奇怪: 为什么输出不是 [10, 20, 30, 40, 50, 60],其实是因为在python3中map返回的是一个迭代器对象 而在python2中返回的是一个就直接是list
为了兼容:我们稍作修改:
list1 = [1,2,3,4,5,6] list2 = list(map(lambda item:item*10, list1)) print(list2) # output: [10, 20, 30, 40, 50, 60]
2. Filter
Filter用于过滤列表中的元素,并返回一个满足过滤条件的元素的列表
list1 = [1,2,3,4,5,6] list2 = list(filter(lambda item: item > 3, list1)) print(list2) # output: [4, 5, 6]
3. Reduce
Reduce是一个可以对列表进行计算的高阶函数,例如计算一组数据的乘积
from functools import reduce list1 = [1,2,3,4,5,6] list2 = reduce(lambda x, y: x*y, list1) print(list2) # output: 720
4. Collections(容器)
Collections是一个包含诸多容器数据类型的模块(枚举),常用的有:
- defaultdict
- counter
- deque
- namedtuple
- enum.Enum
defaultdict
这个模块与dict的不同在于不需要检查dict的key是否存在,defaultdict()方法会为字典提供默认值:
在dict中,给字典进行嵌套赋值时,必须保证key存在,否则会触发KeyError的异常:
mydict = {} mydict['userInfo']['age'] = 30 print(mydict) # output: # Traceback (most recent call last): # File "sd.py", line 21, in <module> # mydict['userInfo']['age'] = 30 # KeyError: 'userInfo'
让我们换defaultdict试试:
import collections defaultdictTree = lambda : collections.defaultdict(dict) mydefault = defaultdictTree() mydefault['userInfo']['age'] = 30 print(mydefault) print(dict(mydefault)) # output: #defaultdict(<class 'dict'>, {'userInfo': {'age': 30}}) #{'userInfo': {'age': 30}}
counter
counter是一个计数器,用于统计数据。当前他还可以统计一个文件,如果你需要.
import collections result = collections.Counter('我是一个中国人, 我爱中国') print(result) # output: Counter({'我': 2, '中': 2, '国': 2, '是': 1, '一': 1, '个': 1, '人': 1, ',': 1, ' ': 1, '爱': 1})
deque
deque是一个双端队列,允许从两头插入删除元素
from collections import deque mydeque = deque() # 向后添加 mydeque.append('a') mydeque.append('b') mydeque.append('c') print(mydeque) # 向前添加 mydeque.appendleft('1') print(mydeque) # 从后删除 mydeque.pop() print(mydeque) # 从前删除 mydeque.popleft() print(mydeque) # 向后合并拓展 mydeque.extend(['d', 'e']) print(mydeque) # 向前合并拓展 mydeque.extendleft(['8','9']) print(mydeque)
# output:
#deque(['a', 'b', 'c'])
#deque(['1', 'a', 'b', 'c'])
#deque(['1', 'a', 'b'])
#deque(['a', 'b'])
#deque(['a', 'b', 'd', 'e'])
#deque(['9', '8', 'a', 'b', 'd', 'e'])
定长队列
mydeque = deque(maxlen=5) # 定长队列,超出长度,最左边的元素将被删除 mydeque.extend([1,2,3,4]) print(mydeque) mydeque.append(5) print(mydeque) mydeque.append(6) print(mydeque) # output #deque([1, 2, 3, 4], maxlen=5) #deque([1, 2, 3, 4, 5], maxlen=5) #deque([2, 3, 4, 5, 6], maxlen=5)