美文网首页
2018-02-26 切片操作和生成器

2018-02-26 切片操作和生成器

作者: 少儿创客 | 来源:发表于2018-02-26 14:29 被阅读40次

    切片操作

    python的切片操作是用来访问可迭代对象的,包括字符串和数组,列表等。
    我们以数组为例进行介绍

    a = [1, 2, 3, 4, 5]
    # 访问数组的前3个元素
    a[0:3]
    
    [1, 2, 3]
    

    可以看到我们采用a[0:3]的方法很容易的访问到了数组的前三个元素。
    对于具有序列结构的数据来说,切片操作的方法是:consequence[start_index: end_index: step]。

    start_index:表示是第一个元素对象,正索引位置默认为0;负索引位置默认为 -len(consequence)
    end_index:表示是最后一个元素对象,正索引位置默认为 len(consequence)-1;负索引位置默认为 -1。
    step:表示取值的步长,默认为1,步长值不能为0。

    print(a[-2])
    
    4
    
    a[0::2] # 从第0个元素开始,每隔两个元素取一个元素
    
    [1, 3, 5]
    
    a[-4 : 3] # 从倒数第四个元素到正数第三个元素
    
    [2, 3]
    
    a[-4 : -2] # 从倒数第四个元素到正数第四个元素
    
    [2, 3]
    

    可以看到从杨是从

    利用步长对序列进行倒序取值

    在切片运算中,步长为正,表示从左至右,按照索引值与起始位置索引之差可以被步长整除的规律取值;当步长为负,则表示从右至左,按照按照索引值与起始位置索引之差可以被步长整除的规律取值。

    根据这个特性,我们可以很方便对某个序列进行倒序取值,这个方法比reverse方法更方便,且适用于没有reverse方法的字符串和元组。

    print(a[::-1])
    
    [5, 4, 3, 2, 1]
    
    a[::-2] # 从最后一个元素开始,每两个元素取一个
    
    [5, 3, 1]
    

    列表生成式

    列表生成式是python中非常好用的一个语法糖,很多时候可以大大的简化代码,让代码更加容易阅读和理解。是Python内置的非常简单却强大的可以用来创建list的生成式。举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用range(1, 11):

    list(range(1, 11))
    
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    

    但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环:

    demolist = []
    for x in range(1, 11):
        demolist.append(x * x)
    demolist
    
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    

    但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:

    [x * x for x in range(1, 11)]
    
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    

    写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。

    for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

     [x * x for x in range(1, 11) if x % 2 == 0]
    
    [4, 16, 36, 64, 100]
    

    还可以使用两层循环,可以生成全排列:

     [m + n for m in 'ABC' for n in 'XYZ']
    
    ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
    

    在涉及到列表操作的时候,列表生成式是非常方便的,举个简单的例子,举个例子我们要找出1到100中所有3的倍数:

    L = []
    for x in range(100):
        if x % 3 == 0:
            L.append(x)
    print(L)
        
    
    [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
    
    # 而如果用列表生成式就简单多了
    print([x for x in range(100) if x % 3 == 0])
    # 代码的可读性高,只要一行代码就能够完成四行代码的工作
    # 在比如找出100以内所有3或者7的倍数
    print([x for x in range(100) if x % 3 == 0 or x % 7 == 0])
    
    [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
    [0, 3, 6, 7, 9, 12, 14, 15, 18, 21, 24, 27, 28, 30, 33, 35, 36, 39, 42, 45, 48, 49, 51, 54, 56, 57, 60, 63, 66, 69, 70, 72, 75, 77, 78, 81, 84, 87, 90, 91, 93, 96, 98, 99]
    

    绝大部分用到循环的地方,都可以用列表生成式来简化代码,列表生成式是python中非常强大的工鞥呢。

    相关文章

      网友评论

          本文标题:2018-02-26 切片操作和生成器

          本文链接:https://www.haomeiwen.com/subject/nukyxftx.html