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是一个包含诸多容器数据类型的模块(枚举),常用的有:

    1. defaultdict
    2. counter
    3. deque
    4. namedtuple
    5. 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)

 

    

    

 

posted @ 2020-03-20 13:34  保军Baojun  阅读(188)  评论(0编辑  收藏  举报