• python中的zip()函数和map()函数


    一、zip()函数

    1.语法:

    zip(iterable, ...)
    

    参数说明:

    iterable,...—— 一个或多个迭代器;
    
    • 在python2中:

    zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
    如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

    • 在python3中:

    zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
    我们可以使用 list() 转换来输出列表。
    如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

    2.返回值:

    • python2直接返回一个元组列表
    • python3返回一个对象,可以用list(),tuple()把这个对象转成列表或者元组

    3.用法:(python3环境)

    >>>a = [1,2,3]
    >>> b = [4,5,6]
    >>> c = [4,5,6,7,8]
    >>> zipped = zip(a,b)     # 返回一个对象
    >>> zipped
    <zip object at 0x103abc288>
    >>> list(zipped)  # list() 转换为列表
    [(1, 4), (2, 5), (3, 6)]
    >>> list(zip(a,c))              # 元素个数与最短的列表一致
    [(1, 4), (2, 5), (3, 6)]
    
    >>> zipped = zip(a,b)
    >>> a1, a2 = zip(*ziped)          # 与 zip 相反,zip(*) 可理解为解压,返回二维矩阵式
    >>> a1
    (1, 2, 3)
    >>> a2
    (4, 5, 6)
    
    >>>c = ('a','b','c')
    >>>d = (1,2,3)
    >>>aa = zip(c,d)
    >>>list(aa)
    [('a', 1), ('b', 2), ('c', 3)]
    

    4.关于用’*‘解包

    1.带*号的表达式获取序列剩余部分
    >>> a,b,*c = 1,2,3,4,5
    >>> a
    1
    >>> b
    2
    >>> c
    [3, 4, 5]
    
    2.带*号的表达式获取序列中间部分
    >>> a,*b,c = 1,2,3,4,5
    >>> a
    1
    >>> b
    [2, 3, 4]
    >>> c
    5
    
    3.带*号的表达式获取序列前面部分
    >>> *a,b,c = 1,2,3,4,5
    >>> a
    [1, 2, 3]
    >>> b
    4
    >>> c
    5
    
    4.嵌套解包
    >>> (a,b),(c,d) = (1,2),(3,4)
    >>> a
    1
    >>> b
    2
    >>> c
    3
    >>> d
    4
    >>> a,b
    (1, 2)
    >>> a,b,c,d
    (1, 2, 3, 4)
    

    二、map()函数

    1.语法:

    map(func, iterable, ...)
    

    map()会根据提供的函数对指定序列做映射。
    第一个参数 func 是函数名字,它把函数 func 依次作用在后面每个 iterable 的每个元素上,然后并返回执行结果。

    2.返回值:

    • python2中:返回一个新的列表。
    • python3中:返回一个迭代器

    3.用法:(python3环境)

    >>>def square(x) :            # 计算平方数
    ...     return x ** 2
    ... 
    >>> m = map(square, [1,2,3,4,5])   # 计算列表各个元素的平方
    >>> list(m)
    [1, 4, 9, 16, 25]
    >>> m = map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数
    >>> list(m)
    [1, 4, 9, 16, 25]
     
    # 提供了两个列表,对相同位置的列表数据进行相加
    >>> m = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
    >>> list(m)
    [3, 7, 11, 15, 19]
    

    4.map()的特殊情况:函数是None

    • 在python2中:

    如果函数是 None,自动假定一个‘identity’函数,这时候就是模仿 zip()函数,

    >>>l=[1,2,3,4]
    >>>x=map(None,l)
    >>>print(x)
    [1,2,3,4]
    
    当有多个列表时,相同位置的元素归并到一个元组。如:
    >>> print map(None, [4,5,6],[3,2,1])
    [(4, 3), (5, 2), (6, 1)]
    列表长度不一致时,会用None补足,如:
    >>> print map(None, [4,5,6],[3,2,1,0])
    [(4, 3), (5, 2), (6, 1),(None,0)]
    
    • 在 python3中:

    在 python3中,由于map()返回是一个迭代器,所以在这种情况下,map()返回的这个对象其实是不可调用的

    >>> m = map(None,[1,2,3,4])
    >>> m
    <map object at 0x000001EFFCC8E710>
    >>> list(m)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'NoneType' object is not callable
    

    关于map()函数的实现细节可以参考文章:map()函数

  • 相关阅读:
    图解排序算法(三)之堆排序
    博客园添加看板娘
    php设计模式
    PHP二维数组排序 array_multisort
    php-jwt-token
    c++实现冒泡排序
    常见的排序 转
    Mac VMware Fusion CentOS7配置静态IP
    vmwar快照和克隆区别
    springboot maven打包插件
  • 原文地址:https://www.cnblogs.com/ChangAn223/p/10729769.html
Copyright © 2020-2023  润新知