map, reduce, zip three built-in functions


def printline(content,sign):
    """
    打印一条分割线
    :param content: 分割线中你想要填写的内容 格式:例如:------ 解压 --------
    :param sign: 用什么符号分割 “-”、“*”。。。
    :return:
    """
    print('{}'.format(sign)*50,end='')
    print(content,end='')
    print('{}'.format(sign)*50)

"""
map :map(函数,可迭代数据,可迭代数据,可迭代数据,''')
    : 最主要的作用是并行,以及zip就是用来进行并发运算的、迭代等;
        map会 根据指定的函数对指定迭代器进行映射;

        map中指定函数的参数个数,与后面的集合数必须对应,但是集合中的个数可以不同
"""

printline('map','-')
def addnum(a, b, c, d):
    return a + b * c * d


ret = map(addnum, [1, 2, 3, 4, 5], [5, 4, 3, 2, 1], [5, 4, 3, 2, 1], (0, 0, 0, 0, 1))
for i in ret:
    print(i)  # 1 2 3 4 5 6


def func(x, y):
    return x, y


ret = map(func, [1, 2, 3], [1, 2, 4, 5])  # 当个数不匹配时返回 在对应位置返回空值
print(list(ret))  # [(1, 1), (2, 2), (3, 4)]

ret = map(lambda x: x ** 2, [2, 3, 4])
print(list(ret))  # [4, 9, 16]

ret = map(lambda x, y, z: x + y + z, [2, 3, 4], [3, 4, 5], [4, 5, 6])
print(list(ret))  # [9, 12, 15]

"""
******************        reduce()      **********************
"""
printline('reduce','*')
from functools import reduce


def func(a, b):
    return a + b


ret = reduce(func, [1, 2, 3, 4, 5])  # 15
print(ret)
"""
reduce(函数,可迭代数据,初始值(initial)),在python3之后就不是内置函数了需要导入
过程:
1、取 1、2 ,传进函数, 得到返回值 3 ;
2、取 3、3 ,传进函数, 得到返回值 6 ;
1、取 6、4 ,传进函数, 得到返回值 10 ;
1、取 10、5 ,传进函数, 得到返回值 15 ;

也就是:从左到右对一个序列的项累计地应用有两个参数的函数,以此合并序列到一个单一值。

"""
# 进阶 将一个列表拼成一个整数

ret = reduce(lambda x, y: x * 10 + y, [1, 2, 3, 4, 5])
print(ret)  # 12345

# 再进阶
person = (
    {'name': 'zhangsan', 'age': 21},
    {'name': 'lisi', 'age': 51},
    {'name': 'wangwu', 'age': 71},
    {'name': 'liuliu', 'age': 121},
)

'''
#这部分代码会出错,报错内容:TypeError: 'int' object is not subscriptable
def func(p1,p2):
    ret = p1['age']+p2['age']
    return ret

ret = reduce(func,person)
print(ret)

原因:
    在第一执行的时候,p1={'name': 'zhangsan', 'age': 21},,p2= {'name': 'lisi', 'age': 51}
                    p1['age'] = 21                     , p2['age'] = 51               返回:72
    第二次执行的时候  func函数中第一个参数p1成了 72,是一个整数,它就没有['age']这个键了就会报错
    
'''

# 所以在此我们要设立一个初始值0,这样p1就一直是一个整数了,就不影响执行了
def func(p1,p2):
    ret = p1+p2['age']
    return ret

ret = reduce(func,person,0)
print(ret)  #264




"""
zip(): zip(iterable1,iterable2,iterable3,iterable4''')
            将可迭代函数作为参数,对应元素打包成一个元组,并组成一个对象。如果要迭代的个数一样,
            返回长度与最短可迭代对象相等,返回值是zip类型数据
"""



printline('压缩','-')
a = [1,2,3,4]
b = ['a,','b','c','d']
c = [6,7,8,9,10]

zip1 = zip(a,b)
print(list(zip1),type(zip1))  #[(1, 'a,'), (2, 'b'), (3, 'c'), (4, 'd')] <class 'zip'>

zip2 = zip(a,c)
print(list(zip2)) #[(1, 6), (2, 7), (3, 8), (4, 9)]  按短的来

zip3 = zip(a,b,c)
print(list(zip3)) #  [(1, 'a,', 6), (2, 'b', 7), (3, 'c', 8), (4, 'd', 9)]


zip4 = zip(zip1,zip2)
print(list(zip4))  # 将两个zip对象zip,结果是空




# 解压  *zip( zip 对象)
printline('解压','-')
zip5 = zip(a,b)
print(list(zip5))  # 压缩 [(1, 'a,'), (2, 'b'), (3, 'c'), (4, 'd')]
zip_jie = zip(*zip(a,b)) # 解压
print(list(zip_jie)) #[(1, 2, 3, 4), ('a,', 'b', 'c', 'd')]
print(list(zip(zip(*zip(a,b)))))  # [((1, 2, 3, 4),), (('a,', 'b', 'c', 'd'),)]


# zip 对象是一个迭代器
printline('zip迭代器','+')
a_b = zip(a,b)
for i in a_b:
    print(i)   #(1, 'a,') 、(2, 'b')、(3, 'c')、(4, 'd')
print(list(a_b)) # []



Guess you like

Origin blog.csdn.net/qq_39062888/article/details/94768830