python进阶——高级特性(一)切片

本文介绍了Python编程中的切片操作,这是一种对序列性对象的高级索引方法,可用于获取不连续的序列元素。文章详细阐述了切片的基本概念、索引方式,包括正索引和负索引,并通过实例展示了不同参数组合下的切片用法,包括步长、起始和终止索引的设置以及截断现象。此外,还提及了切片在列表、字符串等序列对象上的应用。
摘要由CSDN通过智能技术生成

如有兴趣了解更多请关注我的个人博客https://07xiaohei.com/

(一)概述

在编程过程中,Python提供了很多高级特性,用于精简代码,提高运行速度或者节省空间。

该系列将会介绍切片,迭代,迭代器,列表生成式和生成器。

装饰器实际上也算是高级特性的一部分,但为了文章的连贯,写在了python基础——函数(三)中,如希望更多了解装饰器,请移步此博客。

(二)切片

1. 概述:

Python中对序列性对象的一种高级索引方法,可以取出序列中的一个范围对应的元素,且范围不一定连续,长度和频率不一定固定。

切片不会改变原值,返回的结果类型和切片对象的类型是一致的,可以理解为其返回的是切片对象的子序列——字符串切片返回字符串,列表切片返回列表。

切片实际上是一种浅拷贝,其生成的子序列是对原版的拷贝。

2. 基本索引:

Python中的序列性对象有两种索引方式——正索引和负索引。

以索引序列list_use为例,index为索引下标,list_use[index]表示对应元素,我们有:

list_use元素12345678910
正索引index0123456789
负索引index-10-9-8-7-6-5-4-3-2-1

正索引从0开始,0对应首元素;负索引从-1开始,-1对应末元素。

正负索引共同构成了Python索引的有效范围,基本索引中如果索引超出了有效范围会报错。

3. 切片操作:
(1)语法格式:

object[start_index : end_index : step]

完整的切片表达式如上,会包括三个参数,参数之间用":"分割。

  • step:先介绍step是为了理解后面两个索引的缺省情况。

    step是指切片的步长,可正可负,绝对值代表步长大小,正负性代表了步长的方向——正步长表示从左向右取值,负步长表示从右往左取值。

    step可以缺省,默认值为1,表示逐个元素取值,不会跳过任何一个元素。

  • start_index:表示起始索引,起始索引被包括到了切片子序列中。

    起始索引可以缺省,表示从被切片对象的某一端开始,如果步长为正,表示从最左端开始,如果为负,则从最右端开始。

  • end_index:表示终止索引,终止索引不会包括到切片子序列中。

终止索引可以缺省,表示从被切片对象的某一端开始,如果步长为正,表示从最右端开始,如果为负,则从最左端开始。

截断:在切片中,start_index和end_index允许绝对值大于被切片序列的长度,也就是超过索引的有效范围。此时不会发生报错,而是发生截断——所有的超出部分被自动忽略,只选取有效部分进行切片。

三个参数的组合必须正确:当start_index对应位置在end_index对应位置左侧时step应>0;当start_index对应位置在end_index对应位置右侧时step应<0,使用正索引还是负索引均可以,是否存在截断均可以,但必须符合上面的要求。

(2)举例:
  • 切单一值:

    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[0])
    print(a[9])
    print(a[5])
    # 运行结果:
    # 0
    # 9
    # 5
    
  • 切完整对象:

    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[0:10])
    print(a[:])
    print(a[0:])
    print(a[-1::-1])
    # 运行结果:
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    
  • start_index>0,end_index>0,step>0:

    # 运行结果:
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[2:7:1])
    print(a[2:8:2])
    print(a[1:19:3])
    print(a[5:233])
    # 运行结果:
    # [2, 3, 4, 5, 6]
    # [2, 4, 6]
    # [1, 4, 7]
    # [5, 6, 7, 8, 9]
    
  • start_index>0,end_index>0,step<0:

    # 运行结果:
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[7:2:-1])
    print(a[8:2:-2])
    print(a[19:1:-3])
    print(a[233:5:-1])
    # 运行结果:
    # [7, 6, 5, 4, 3]
    # [8, 6, 4]
    # [9, 6, 3]
    # [9, 8, 7, 6]
    
  • start_index<0,end_index<0,step>0:

    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[-7:-2:1])
    print(a[-8:-2:2])
    print(a[-19:-1:3])
    print(a[-233:-5:1])
    # 运行结果:
    # [3, 4, 5, 6, 7]
    # [2, 4, 6]
    # [0, 3, 6]
    # [0, 1, 2, 3, 4]
    
  • start_index<0,end_index<0,step<0:

    # 运行结果:
    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[-2:-7:-1])
    print(a[-2:-8:-2])
    print(a[-1:-19:-3])
    print(a[-5:-233:-1])
    # 运行结果:
    # [8, 7, 6, 5, 4]
    # [8, 6, 4]
    # [9, 6, 3, 0]
    # [5, 4, 3, 2, 1, 0]
    
  • start_index>0,end_index<0,step>0:

    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[2:-2:1])
    print(a[4:-1:2])
    print(a[3:-3:3])
    print(a[0:-5:1])
    # 运行结果:
    # [2, 3, 4, 5, 6, 7]
    # [4, 6, 8]
    # [3, 6]
    # [0, 1, 2, 3, 4]
    
  • start_index>0,end_index<0,step<0:

    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[8:-8:-1])
    print(a[6:-9:-2])
    print(a[123:-7:-3])
    print(a[6:-15:-1])
    # 运行结果:
    # [8, 7, 6, 5, 4, 3]
    # [6, 4, 2]
    # [9, 6]
    # [6, 5, 4, 3, 2, 1, 0]
    
  • start_index<0,end_index>0,step>0:

    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[-2:2:-1])
    print(a[-4:1:-2])
    print(a[-3:3:-3])
    print(a[-1:5:-1])
    # 运行结果:
    # [8, 7, 6, 5, 4, 3]
    # [6, 4, 2]
    # [7, 4]
    # [9, 8, 7, 6]
    
  • start_index<0,end_index>0,step<0:

    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[-8:8:1])
    print(a[-6:9:2])
    print(a[-7:7:3])
    print(a[-9:5:1])
    # 运行结果:
    # [2, 3, 4, 5, 6, 7]
    # [4, 6, 8]
    # [3, 6]
    # [1, 2, 3, 4]
    
  • 缺省:

    a = [0,1,2,3,4,5,6,7,8,9]
    print(a[::])
    print(a[5::])
    print(a[-5::])
    print(a[:4:])
    print(a[:-6:])
    print(a[::2])
    print(a[::-2])
    print(a[3::2])
    print(a[-7::1])
    print(a[7::-2])
    print(a[-3::-1])
    print(a[:7:2])
    print(a[:-3:1])
    print(a[:-7:-2])
    print(a[:3:-1])
    
    # 运行结果:
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    # [5, 6, 7, 8, 9]
    # [5, 6, 7, 8, 9]
    # [0, 1, 2, 3]
    # [0, 1, 2, 3]
    # [0, 2, 4, 6, 8]
    # [9, 7, 5, 3, 1]
    # [3, 5, 7, 9]
    # [3, 4, 5, 6, 7, 8, 9]
    # [7, 5, 3, 1]
    # [7, 6, 5, 4, 3, 2, 1, 0]
    # [0, 2, 4, 6]
    # [0, 1, 2, 3, 4, 5, 6]
    # [9, 7, 5]
    # [9, 8, 7, 6, 5, 4]
    

    切片除了用于列表,还可以用于其他序列对象,此处不再举例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaohei07

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值