Python基础知识:切片

article/2025/10/29 8:33:35

什么是切片操作

在Python中,切片(slice)是对序列型对象(如liststringtuple)的一种高级索引方法。普通索引只取出序列中一个下标对应的元素,而切片取出序列中一个范围对应的元素,这里的范围不是狭义上的连续片段。下面的代码初步展示了切片索引的力量。

 >>> a = list(range(10))>>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[:5][0, 1, 2, 3, 4]>>> a[5:][5, 6, 7, 8, 9]>>> a[2:8][2, 3, 4, 5, 6, 7]>>> a[::2][0, 2, 4, 6, 8]>>> a[::-1][9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

你可能还看不懂具体的语法(这正是本篇要介绍的),但你应该已经领略到了切片的花式操作。

写这篇文章的初衷是,一方面切片操作是Python中非常常见的,另一方面网上却很难找到全面系统的解析,比如以下结果是否让人有些迷惑:

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[0::-1][0]>>> a[0:len(a):-1][]

为什么有len(a)和省略len(a)结果会不一样?

本文致力于真正讲清楚Python切片的使用方法。若您希望进一步了解切片的实现原理,以帮助我们自定义类的切片操作,敬请期待本文的续篇,《切片完全指南(原理篇)》


基本索引

我们从Python的基本索引开始,即单个整数的索引。假设被索引的序列仍为之前提到的a,则基本索引的语法为a[index],其中index为下标。读者可能会觉得这里过于简单,但我们要强调的是Python一个语法糖:负数下标索引,即:index可以取为负数,当其为-n时,对倒数第n个元素进行索引。我们用一张表格值观展示a的索引范围。

非负下标索引和负数下标索引共同构成了Python索引的有效范围:​。有效范围的概念对切片的理解非常重要,在基本索引中,索引超出有效范围时会抛出IndexError异常:

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[10]Traceback (most recent call last):File "<stdin>", line 1, in <module>IndexError: list index out of range>>> a[-11]Traceback (most recent call last):File "<stdin>", line 1, in <module>IndexError: list index out of range

但在切片中不是这样,我们将在下文具体解释。


简单切片

简单切片指的是这样的切片形式:a[start:stop],其行为是得到下标在这样一个前闭后开区间范围内的元素,其中startstop为负数时,简单看作是负数下标对应的位置即可:

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[2:3][2]>>> a[5:9][5, 6, 7, 8]>>> a[5:-1][5, 6, 7, 8]>>> a[-5:9][5, 6, 7, 8]>>> a[-5:-1][5, 6, 7, 8]

事情到这里也很简单,下面着重讲解两个比较特殊的情况:超出有效索引范围缺省

超出有效索引范围

startstop超出上文提到的有效索引范围​时,切片操作不会抛出异常,而是进行截断。可以这样去理解截断机制:我们假象把索引范围扩充到全体整数,只不过小于​或大于​的区域对应空元素,在这个扩充后的数轴上进行切片,只需把最终结果中的所有空元素忽略即可。

来看几个具体的例子

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[-100:5][0, 1, 2, 3, 4]>>> a[5:100][5, 6, 7, 8, 9]>>> a[-100:100][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[100:1000][]

另外,如果start的位置比stop还靠后怎么办?Python还是不会抛出异常,而是直接返回空序列:

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[6:5][]

缺省

startstop都是可以缺省的,在缺省的情况下,Python的行为是尽可能取最大区间,具体来说:

按照扩充索引范围的观点, start的缺省值是 无穷小(​)stop的缺省值是 无穷大(​)
 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[:5][0, 1, 2, 3, 4]>>> a[5:][5, 6, 7, 8, 9]>>> a[100:][]


扩展切片

早期的Python解释器仅支持上述a[start:stop]形式的基本切片,后来加入了下面要介绍的切片形式,扩展切片的名称也流传下来,实际上不用担心,这早已是Python所支持的标准语法。

扩展切片指的是这样的切片形式:a[start:stop:step],其中step是一个非零整数,即比简单切片多了调整步长的功能,此时切片的行为可概括为:从start对应的位置出发,以step为步长索引序列,直至越过stop对应的位置,且不包括stop本身。事实上,简单切片就是step=1的扩展切片的特殊情况。需要详细解释的是step分别为正数和负数的两种情况。

step为正数

step为正数时,切片行为很容易理解,startstop截断缺省规则也与简单切片完全一致:

 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[0:6:2][0, 2, 4]>>> a[::2][0, 2, 4, 6, 8]>>> a[:-2:2][0, 2, 4, 6]>>> a[4::2][4, 6, 8]

step为负数

step为负数时,切片将其解释为从start出发以步长|step|逆序索引序列,此时,startstop截断依然遵循前述规则,但缺省发生一点变化,因为我们说过,在缺省的情况下,Python的行为是尽可能取最大区间,此时访问是逆序的,start应尽量取大,stop应尽量取小,才能保证区间最大,因此:

按照扩充索引范围的观点, start的缺省值是 无穷大(​)stop的缺省值是 无穷小(​)
 >>> a[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> a[5::-1][5, 4, 3, 2, 1, 0]>>> a[:4:-2][9, 7, 5]>>> a[::-1][9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

 


http://chatgpt.dhexx.cn/article/9HeX0Vlm.shtml

相关文章

Django 对接 Mysql Datatime 日期格式化处理

查询显示结果时&#xff0c;前端界面会是英文格式显示日期&#xff0c;那么应该怎么处理&#xff1f; 这里直接在前端操作&#xff0c;将日期格式化 “ | ” 符号后&#xff0c;拼接日期格式根据本身数据库显示格式来去&#xff0c;我这里是年月日&#xff0c;时分秒

MySQL 日期类型小数秒的处理

一、 MySQL 日期类型对小数秒的支持 注&#xff1a;本文所使用MySQL版本为 5.7 版本。 官方文档&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html 1、小数秒位数精度 MySQL 支持小数秒的展示&#xff0c;比如官网的例子&#xff0c;在建表时&…

Java 接收 MySQL datetime 类型日期字段输出格式问题

文章目录 前言Java 与 MySQL 类型对应注解操作代码格式转换参考 前言 不管世事多艰难&#xff0c;别忘了&#xff0c;看开点儿&#xff0c;再温柔点儿&#xff0c;不要满身戾气&#xff0c;也不要紧皱眉头&#xff0c;生活都是在你眉开眼笑的时候&#xff0c;一天天好起来的。…

mysql查询数据库日期_mysql如何查询日期与时间

前言: 在项目开发中,一些业务表字段经常使用日期和时间类型,而且后续还会牵涉到这类字段的查询。关于日期及时间的查询等各类需求也很多,本篇文章简单讲讲日期及时间字段的规范化查询方法。 1.日期和时间类型概览 MySQL支持的日期和时间类型有 DATETIME、TIMESTAMP、DATE、…

操作MYSQL日期格式年 或 月 或 日

1&#xff0c;年(year)&#xff1a; select year(create_time) from person2&#xff0c;月(month)&#xff1a; select month(create_time) from person3&#xff0c;日&#xff08;day&#xff09;&#xff1a; select day(create_time) from person4&#xff0c;yyyy-MM-…

关于Thymeleaf 日期字段时间格式化处理

1.接手项目时测试发现页面时间格式不对&#xff0c;如图所示&#xff1a; 代码调整前: <input type"text" name"recruitTime" th:field"*{recruitTime}" class"form-control" placeholder"yyyy-MM-dd HH:mm" required&g…

mysql里如何写日期_mysql之日期函数

写在前面 mysql的学习,断断续续,今天就接着学习mysql的日期操作吧。 系列文章 Mysql实战 1、获得当前时间格式yyyy-MM-dd HH:mm:ss select now(); 结果 另外一个获取当前时间的函数是:sysdate(); 区别:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值。 …

MYSQL中时间毫秒数转换及日期格式化

一、时间戳转换成日期 java中常用bigint字段保存时间&#xff0c;通常将时间保存为一大串数字&#xff0c;每次取出需要在程序里转换&#xff0c;有时候程序里不方便&#xff0c;可以使用MYSQL自带的函数 FROM_UNIXTIME(unix_timestamp,format)。 举例&#xff1a; select …

MySql格式化日期

原文路径&#xff1a;https://www.cnblogs.com/duhuo/p/5650876.html mysql查询记录如果有时间戳字段时&#xff0c;查看结果不方便&#xff0c;不能即时看到时间戳代表的含义&#xff0c;现提供mysql格式换时间函数&#xff0c;可以方便的看到格式化后的时间。 1. DATE_FORMA…

com.jcraft.jsch.JSchException: verify: false

背景 高并发下&#xff0c;SFTP上传偶现com.jcraft.jsch.JSchException: verify: false&#xff0c;网上有说升级版本什么的修复了这个bug&#xff0c;然而升级版本后事实证明这个bug还是会出现&#xff0c;大概上传几百次会出现一次。但是项目不可能允许文件丢失&#xff0c;…

java jsch jar_使用JSch从Java在远程计算机上执行命令

SSH是任何一种every-day工具Linux系统管理工作。这是访问网络上的远程计算机&#xff0c;传输数据和执行远程命令的一种简单而安全的方法。除了交互模式之外&#xff0c;还有许多工具可以使依赖于现有技术的远程任务实现自动化ssh服务器/客户端架构。对于这样一种工具&#xff…

java jsch执行脚本_JSch远程执行脚本

JSch远程执行脚本 2017-02-24 在自动化测试的时候&#xff0c;需要远程操控服务器做一些操作&#xff0c;比如切日、起服务器、执行某些脚本。如何实现&#xff1f; 我们可以利用JSch&#xff0c;远程执行脚本。JSch是Java Secure Channel的缩写&#xff0c;是一个SSH2功能的纯…

JSch基本使用

欢迎支持笔者新作&#xff1a;《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》&#xff0c;同时欢迎关注笔者的微信公众号&#xff1a;朱小厮的博客。 欢迎跳转到本文的原文链接&#xff1a;https://honeypps.com/java/jsch-quick-start/ JSch 是SSH2的一个纯Ja…

基于 JSch 实现服务的自定义监控解决方案

一、基于 JSch 实现服务的自定义监控 JSch 是 SSH2 的一个纯 Java 实现。它允许你连接到一个 sshd 服务器&#xff0c;使用端口转发&#xff0c;X11转发&#xff0c;文件传输等等。你可以将它的功能集成到你自己的 程序中。 既然可以通过 SSH 连接到服务器&#xff0c;那就可…

java jsch_java - 使用JSch在远程计算机上执行命令

SSH是访问远程计算机,传输数据和执行远程命令的一种简单而安全的方法。除了基础的交互模式外,还有许多依赖于ssh Client/Server架构的工具可以实现自动化执行远程任务。我们可以找到ssh客户端的许多实现,但是如何从代码编程访问ssh提供的功能呢?本文介绍JAVA语言中使用ssh功…

使用JSCH连接Linux系统并执行命令

一、关于JSCH技术的简单描述 JSCH是SSH的一个纯Java实现。说直白点&#xff0c;就是一个远程连接你其他Linux或者Unix服务器的一个java代码包。其实就是我们使用jsch这个jar包来方便我们编写代码来连接自己linux系统的。 SSH&#xff1a;是目前较可靠&#xff0c;专为远程登录…

【实用技巧篇】JSch使用介绍,实用JSch实现文件传输

文章目录 JSch使用介绍1. jar包下载2. 引入依赖3. 代码实现4. 验证 JSch使用介绍 JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器&#xff0c;使用端口转发&#xff0c;X11转发&#xff0c;文件传输等等。你可以将它的功能集成到你自己的程序中。 1. jar包下载…

Jsch网络工具包的使用及源码简析

一、背景 最近&#xff0c;导师安排了些看论文文献并整理论文至文件服务器的工作&#xff0c;在实验的过程中&#xff0c;我们知道常见的上传文件至服务器有以下方式。 ftp/sftp协议进行上传ssh连接&#xff0c;并通过scp命令进行上传通过xftp、xshell、ftplina等图形化工具上…

JSch学习笔记

JSch笔记 第 1 章 JSch简介 1.1 简述 1&#xff09;jsch是ssh2的一个纯Java实现。它允许你连接到一个sshd服务器&#xff0c;使用端口转发、X11转发、文件传输等。 2&#xff09;SSH 是较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议。 3&#xff09;…

OrmLite For Android 学习笔记 之一 Ormlite 介绍及使用

Android 自带的数据库是SQLite&#xff0c;这种数据库适合用于于小型设备中。在实际使用数据库的应用中&#xff0c;我们经常需要把数据库记录转换为 业务对象实体。在桌面应用或者web应用中我们有很多成熟的ORM工具。Android本身没有提供这么一种工具。 Ormlite 是一种ORM工具…