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代码水平会有很大提升。

  • 相关阅读:
    .net core 基于IIS发布
    所有开源播放器
    JWT的相关讲解
    .NET Core2.0 使用EF做数据操作
    任意的组合,数组或数组,数组或list,list或list不用循环得出匹配的总数和需要的字段列
    linq to sql学习
    winform文本框怎么实现html的placeholder效果
    [数据结构]-单链表实现栈
    [数据结构]-数组实现栈
    [数据结构]-单链表
  • 原文地址:https://www.cnblogs.com/yyht-xgy/p/11776716.html
Copyright © 2011-2022 走看看