zoukankan      html  css  js  c++  java
  • python六剑客

    python六剑客map、filter、reduce、lambda、切片、推导列表

    python最有特点的一行代码,所有代码均可以借用一行代码(目标)
    map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
    举例说明,比如我们有一个函数f(x)=x%2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现
    一个最简单的例子,如基于f(x) = x²,map()作用于list [1, 2, 3, 4, 5, 6, 7, 8, 9]后的结果如下:返回结果仍为list
    print(list(map(lambda x: x ** 2, [1, 2, 3, 4, 5, 6, 7, 8, 9])))
    # output
    [1, 4, 9, 16, 25, 36, 49, 64, 81]

    2、filter 两个参数(自定义函数名,列表)对列表中的元素过滤后输出
    Python内建的filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
    选择大于等于5的数字
    print(list(filter(lambda x:int(x)>=5,"123456789")))
    print(list(filter(lambda x:int(x)>=5,[1, 2, 3, 4, 5, 6, 7, 8, 9])))
    # output
    ['5', '6', '7', '8', '9']
    [5, 6, 7, 8, 9]

    3、reduce (函数名,列表)将列表中的元素逐一累计
    函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
    python3.x中需要导包rom functools import reduce
    一行代码实现累加、阶乘
    from functools import reduce
    # 累加
    print(reduce(lambda x,y:x+y, [1,2,3,4,5]))
    # 阶乘
    print(reduce(lambda x,y:x*y,range(1,5)))
    # output
    15
    24

    4、lambda函数
    lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
    语法:变量:运算表达式 如 x:x+1
    引用: 函数名(变量赋值) num(1)
    # 一个参数lambda函数
    num = lambda x: x+1
    print(num(2))

    # 两个参数lambda函数
    nums = lambda x,y:x+y
    print(nums(2,3))
    # output
    3
    5

    5、推导列表
    通过for 语句处理表达式里面的变量,如果还要加条件,就加if条件

    列表推导式是Python基础,好用,而又非常重要的功能,也是最受欢迎的Python特性之一,可以说掌握它是成为合格Python程序员的基本标准。本质上可以把列表推导式理解成一种集合了变换和筛选功能的函数,通过这个函数把一个列表转换成另一个列表。注意是另一个新列表,原列表保持不变。
    li = [1,2,3,4,5,6,7,8,9]
    print([x**2 for x in li])

    print([x**2 for x in li if x>5])

    # 字典推导
    print(dict([(x,x*10) for x in li]))

    print([ (x, y) for x in range(10) if x % 2 if x > 3 for y in range(10) if y > 7 if y != 8 ])

    vec=[2,4,6]
    vec2=[4,3,-9]
    sq = [vec[i]+vec2[i] for i in range(len(vec))]
    print(sq)

    print([x*y for x in [1,2,3] for y in [1,2,3]])

    testList = [1,2,3,4]
    def mul2(x):
    return x*2
    print([mul2(i) for i in testList])

    打印结果
    [1, 4, 9, 16, 25, 36, 49, 64, 81]
    [36, 49, 64, 81]
    {1: 10, 2: 20, 3: 30, 4: 40, 5: 50, 6: 60, 7: 70, 8: 80, 9: 90}
    [(5, 9), (7, 9), (9, 9)]
    [6, 7, -3]
    [1, 2, 3, 2, 4, 6, 3, 6, 9]
    [2, 4, 6, 8]

    与zip结合
    将a,b两个列表中相对应得值组合起来,形成一个新列表。例如包含x坐标的列表与y坐标的列表形成相对应的点坐标[x, y]列表。

    a= [-1, -2, -3, -4, -5, -6, -7, -8, -9, -10]

    b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    xy = [[x, y] for x, y in zip(a, b)]

    print(xy)
    # output
    [[-1, 1], [-2, 2], [-3, 3], [-4, 4], [-5, 5], [-6, 6], [-7, 7], [-8, 8], [-9, 9], [-10, 10]]

    6、切片
    我们基本上都知道Python的序列对象都是可以用索引号来引用的元素的,索引号可以是正数由0开始从左向右,也可以是负数由-1开始从右向左。
    在Python中对于具有序列结构的数据来说都可以使用切片操作,需注意的是序列对象某个索引位置返回的是一个元素,而切片操作返回是和被切片对象相同类型对象的副本。

    # 如下面的例子,虽然都是一个元素,但是对象类型是完全不同的:
    >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> alist[0]
    0
    >>> alist[0:1]
    [0]

    通常一个切片操作要提供三个参数 [start_index: stop_index: step]
    start_index是切片的起始位置
    stop_index是切片的结束位置(不包括)
    step可以不提供,默认值是1,步长值不能为0,不然会报错ValueError。
    当 step 是正数时,以list[start_index]元素位置开始, step做为步长到list[stop_index]元素位置(不包括)为止,从左向右截取,
    start_index和stop_index不论是正数还是负数索引还是混用都可以,但是要保证 list[stop_index]元素的【逻辑】位置
    必须在list[start_index]元素的【逻辑】位置右边,否则取不出元素。
    # 比如下面的几个例子都是合法的:
    >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> alist[1:5]
    [1, 2, 3, 4]
    >>> alist[1:-1]
    [1, 2, 3, 4, 5, 6, 7, 8]
    >>> alist[-8:6]
    [2, 3, 4, 5]

    当 step 是负数时,以list[start_index]元素位置开始, step做为步长到list[stop_index]元素位置(不包括)为止,从右向左截取,
    start_index和stop_index不论是正数还是负数索引还是混用都可以,但是要保证 list[stop_index]元素的【逻辑】位置
    必须在list[start_index]元素的【逻辑】位置左边,否则取不出元素。
    # 比如下面的几个例子都是合法的:
    >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> alist[-1: -5: -1]
    [9, 8, 7, 6]
    >>> alist[9: 5: -1]
    [9, 8, 7, 6]
    >>> alist[-1:1:-1]
    [9, 8, 7, 6, 5, 4, 3, 2]
    >>> alist[6:-8:-1]
    [6, 5, 4, 3]

    一些常用的切片操作

    >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    # 取前一部分
    >>> alist[:5][0, 1, 2, 3, 4]
    ># 取后一部分
    >>>> alist[-5:][5, 6, 7, 8, 9]
    # 取偶数位置元素
    >>> alist[::2][0, 2, 4, 6, 8]
    # 取奇数位置元素
    >>> alist[1::2][1, 3, 5, 7, 9]

    # 浅复制,等价于list.copy()更加面向对象的写法
    >>> blist = alist[:]
    >>> blist[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    # 返回一个逆序列表,推荐reversed(list)的写法,更直观易懂。
    >>> alist[::-1][9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    # 在某个位置插入多个元素
    >>> alist[3:3] = ['a','b','c']
    >>> alist[0, 1, 2, 'a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9]
    # 在开始位置之前插入多个元素
    >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> alist[:0] = ['a','b','c']
    >>> alist['a', 'b', 'c', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    # 替换多个元素
    >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> alist[0:3] = ['a','b','c']
    >>> alist['a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9]

    # 删除切片>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> del alist[3:6]
    >>> alist[0, 1, 2, 6, 7, 8, 9]

    Python的切片操作非常灵活、强大、简洁、优雅,如果能全面掌握和正确运用将会对你的编写Python代码水平会有很大提升。

  • 相关阅读:
    SCAU 9504 面试
    SCAU 9503 懒人选座位
    SCAU 8628 相亲
    SCAU 10691 ACM 光环
    SCAU 8626 原子量计数
    SCAU 10674 等差对
    HDU ACM 1048 The Hardest Problem Ever (水题)
    SCAU 9502 ARDF
    SCAU 10686 DeathGod不知道的事情
    SCAU 8629 热身游戏(高精度)
  • 原文地址:https://www.cnblogs.com/yyht-xgy/p/11776716.html
Copyright © 2011-2022 走看看