从Python切片[::-1]可实现序列逆序引出的思考

初学Python,相较于之前所学的C/C++,其序列的索引和切片功能是第一个给人以幸福感的特性

  1. 既可以正向索引,0,1,2..., 也可以逆向索引,-1, -2, -3...
  2. 支持切片,其格式为[start : end: step],表示从start以step为步长直到end,但不包括end,start默认值为0,end默认值为到结束,step默认为1

然后,有一些初级小结论,比如:对于序列a = [1, 2, 3],  a[ : : -1]可实现逆序,即[3, 2, 1]

这里我产生了一个疑惑,既然是a[ : : -1],由于没有指定start, end,那么默认值为0和到结束,应该得到的是[ 1 ]才对呀 (我一直认为索引0对应的是序列第一个元素的位置)

于是,我查阅了Python官方文档,得到如下解释

您也可以这么理解切片:将索引视作指向字符 之间 ,第一个字符的左侧标为0,最后一个字符的右侧标为 n ,其中 n 是字符串长度。例如:

而我之前的理解,应该是这样:

二者的区别在于索引标识位置不同。如果是索引,如a[0],a[2],a[-3],对应第二个图,而对于切片,则应对应于第一个图


进一步思考,为什么Python在序列切片中不采用和索引一样的标识方式?而要以边界为标识位置?

假设我们采用和索引一样的切片的索引标识方式,即索引位置位于边界,会有什么问题?

如果我们想从某一位置,切片到序列尾部,比如,我们想得到 ‘Python‘ 中的thon,采用这种方式,由于切片规则中不包含end标识的元素,因此我们将无法取到最后一个元素!最多只能取到 ‘0‘

逆序同理。均是由于切片规则中舍弃末位元素导致的。那么,在这样的切片方式上,如何改进,才能满足我们的需求?

——那就是以元素边界为标识位置,每一个元素都有左边界和右边界,如此,我们便可随意切片取到我们想取的任何一个片段

最后,回到我们开头的问题,对于序列a[::-1],可以实现将序列逆序就很显然了

原文地址:https://www.cnblogs.com/laideng/p/11186816.html

时间: 2024-11-13 03:53:40

从Python切片[::-1]可实现序列逆序引出的思考的相关文章

【c语言】将一个数的二进制序列逆序,然后输出逆序之后的二进制序,所对应的数

// 将一个数的二进制序列逆序,然后输出逆序之后的二进制序,所对应的数 #include <stdio.h> // 从原数拿出最低位,放到mid中,mid左移,原数右移 int reverse(int a) { int mid = 0; int bit; int n = 31; for (; n > 0; --n) { bit = a & 1; mid |= bit; mid <<= 1; a >>= 1; } return mid; } int main

Python基础课:定义一个函数,可以对序列逆序的输出(对于列表和元组可以不用考虑嵌套的情况)

1 15 def fun(arg): 2 16 if type(arg) is not tuple 3 17 and type(arg) is not str 4 18 and type(arg) is not list: 5 19 print('请输入一个序列') 6 20 return None 7 21 8 22 tmp_list = list(arg) 9 23 tmp_list.reverse() 10 24 11 25 if type(arg) == tuple: 12 26 arg

实现一个函数,将一个数的二进制序列逆序,然后输出逆序所得二进制序列所对应的数字

#include<stdio.h> #include<stdlib.h> unsigned int reverse_bit(unsigned int num) {  int ret = 0;  int i = 0;  while (num)  {   ret += (num & 1) << 31 - i;   i++;   num >>= 1;  }  return ret; }  int main()  {   int num = 0;   sca

Python基础课:定义一个函数,输入一个序列,判断序列是顺序还是逆序,顺序输出UP,逆序输出DOWN,否则输出None

1 def fun(arg): 2 try: 3 li = list(arg) 4 if(sorted(li)==li): 5 print('顺序序列UP') 6 elif(sorted(li, reverse=True)==li): 7 print('逆序序列DOWN') 8 else: 9 print('None') 10 except Exception as e: 11 print('您输入的不是序列,请输入一个序列') 12

python 基础笔记 — 数据类型之序列(0)

一.定义 成员是有序排列的,并且可以通过下标偏移量访问到它的一个或者几个成员,这类 Python 类型统称为序列(sequence) 序列 主要包括以下几种类型:  字符串(str 和 unicode).列表(list).元组(tuple) 二.序列相关的操作符 in  和  not in  --> 成员关系操作符:用来判断一个元素是否属于一个序列 obj [not] in sequence +  --> 连接操作符:把一个序列和另一个相同类型的序列做连接 sequence1 + sequen

python 切片理解

切片操作符在Python中的原型是 [start:stop:step] 即:[开始索引:结束索引:步长值] 开始索引:同其它语言一样,从0开始.序列从左向右方向中,第一个值的索引为0,最后一个为-1 结束索引:切片操作符将取到该索引为止,不包含该索引的值. 步长值:默认是一个接着一个切取,如果为2,则表示进行隔一取一操作.步长值为正时表示从左向右取,如果为负,则表示从右向左取.步长值不能为0 print str[0:3] #截取第一位到第三位的字符 print str[:] #截取字符串的全部字

Python Special Syntax 4:序列相关

元组通过圆括号中用逗号分割的项目定义.元组通常用在使语句或用户定义的函数能够安全地采用一组值的时候,即被使用的元组的值不会改变. 含有0个或1个项目的元组.一个空的元组由一对空的圆括号组成,如myempty = ().然而,含有单个元素的元组就不那么简单了.你必须在第一个(唯一一个)项目后跟一个逗号,这样Python才能区分元组和表达式中一个带圆括号的对象.即如果你想要的是一个包含项目2的元组的时候,你应该指明singleton = (2 , ). 序列的切片功能: name = 'swaroo

Python 实现倒序输出(逆序自动回复)

>>> s = 'shiyanlou' >>> s[1:3] #这里呢,是左闭右开,是角标大于等于1并且小于3,就是1,2咯,所以是'hi' 'hi' >>> s[0:7:1] #这里呢,等于s[0:7],因为递增的值1是默认的,你也可以改 'shiyanl' >>> s[0:7:2] #递增2,看下结果,对上了吧 'sial' >>> s[-9:-3] #其实s是不仅仅是'shiyanlou',更是'shiyanl

Python(5)--数据结构-序列-通用操作

数据结构: 数据结构是以某种方式(如通过编号)组合起来的数据元素(如数.字符乃至其他数据结构)集合.在Python中,最基本的数据结构为序列(sequence). 序列: 序列中的每个元素都有编号,即其位置或索引,其中第一个元素的索引为0,第二个元素的索引为1,依此类推.在有些编程语言中,从1开始给序列中的元素编号,但从0开始指出相对于序列开头的偏移量.同时可回绕到序列末尾,用负索引表示序列末尾元素的位置. 通用序列操作: 索引: 序列中的所有元素都有编号,也就是索引,从0递增,使用索引来访问元