首页 > 编程语言 >有关 python 切片的趣事

有关 python 切片的趣事

时间:2023-06-10 09:11:05浏览次数:48  
标签:趣事 python 列表 切片 索引 lst result print

哈喽大家好,我是咸鱼

今天来讲一个我在实现 python 列表切片时遇到的趣事

在正式开始之前,我们先来了解一下切片(slice)

切片操作是访问序列(列表、字符串......)中元素的另一种方法,它可以访问一定范围内的元素,通过切片操作,可以生成一个新的序列

语法如下

name[start : end : step]
  • start 是切片的起始索引值,当 start 是序列首位时可以省略
  • end 是切片结束索引值,当 end 是序列末位时可以省略
  • step 为步长,可以不提供,默认是1,不能为0,为负数时表示列表翻转

需要注意的是,切片操作遵循包头不包尾的原则,即从序列的第 start 位索引起,向右取到后 end-1 位元素为止,按 m 间隔过滤

下面举一些关于切片的例子

# 获取列表的前 n 个元素:
lst = [1, 2, 3, 4, 5, 6]
n = 3
result = lst[:n]
print(result)  # [1, 2, 3]

# 获取列表的后 n 个元素:
lst = [1, 2, 3, 4, 5, 6]
n = 3
result = lst[-n:]
print(result)  # [4, 5, 6]

# 获取列表中的偶数元素:
lst = [1, 2, 3, 4, 5, 6]
result = lst[1::2]
print(result)  # [2, 4, 6]

# 获取列表中的奇数元素:
lst = [1, 2, 3, 4, 5, 6]
result = lst[::2]
print(result)  # [1, 3, 5]

# 获取列表中的倒数第二个元素:
lst = [1, 2, 3, 4, 5, 6]
result = lst[-2:-1]
print(result)  # [5]

# 获取列表中的最后两个元素:
lst = [1, 2, 3, 4, 5, 6]
result = lst[-2:]
print(result)  # [5, 6]

根据 GPT 的回答,Fortran 是最早支持切片语法的语言,历史上曾经有多种语言支持切片操作
image
上面这些语言虽然说都支持切片语法,但我觉得不够 python 那样的灵活简洁

  1. 简洁而直观的语法:

Python 的切片语法非常简洁和直观,使用起来非常方便。通过使用冒号(:)来指定起始位置、结束位置和步长,可以轻松地进行切片操作。

  1. 强大的切片功能:

Python 的切片语法不仅支持基本的切片操作,还可以使用负数索引和省略号(...)来处理更复杂的情况。这使得对列表、字符串、元组等序列类型的数据进行灵活的切片成为可能

再介绍完了切片之后,我们来进入正题,那天咸鱼在写一个关于列表切片操作的文档

现象

我们知道:根据单个索引进行取值时,如果索引越界,就会报错

list1 = [1,2,3]
print(list1[5])

"""
报错信息如下:
Traceback (most recent call last):
  File "E:\PycharmProjects\projects\demo\草稿纸.py", line 2, in <module>
    print(list1[5])
IndexError: list index out of range
"""

但是当咸鱼不小心将切片结束索引值设置成了超过了列表长度的值的时候,发现居然没有报错

list1 = [1,2,3]
print(list1[1:5]) # 结果[2, 3]

是不是很有趣,Python 中的切片操作不会引发索引越界的错误

关于这个现象,官方文档里面是有介绍的

The slice of s from i to j is defined as the sequence of items with index k such that i <= k < j. If i or j is greater than len(s), use len(s).

If i is omitted or None, use 0. If j is omitted or None, use len(s). If i is greater than or equal to j, the slice is empty.

也就是说,对于序列 s :

  • 当初始索引值或者结束索引值大于序列长度时,就用长度值(len(s))作为索引值
  • 当初始索引值没写或者是 None 时,用 0 作为初始索引值
  • 当结束索引值没写或者是 None 时,用序列长度值(len(s))作为初始索引值
  • 当初始索引值大于等于结束索引值时,结果为空对象
my_list = [1, 2, 3, 4, 5]

# 有效的切片范围
print(my_list[1:4])  # 输出: [2, 3, 4]

# 超出索引范围的切片,会自动调整为有效的索引
print(my_list[1:10])  # 输出: [2, 3, 4, 5]

# 负数索引也适用
print(my_list[-3:10])  # 输出: [3, 4, 5]

总结

Python 的切片语法设计得很安全,即使指定的切片索引超出了序列的长度,也不会引发索引越界错误。相反,它会自动调整切片范围,只返回有效的结果

当进行切片操作时,Python会根据切片的参数和可用的索引范围来确定切片的实际范围

虽然不知道龟哥为什么设计 Python 的切片语法要允许索引超出边界,而不是设计成抛出索引错误?

但是可以知道的是,这种设计使得切片操作更加灵活和方便,无需手动检查索引范围或引发索引越界异常

它允许我们在切片操作中不必担心边界情况,并且可以更加简洁地处理列表、字符串和其他序列类型的操作

标签:趣事,python,列表,切片,索引,lst,result,print
From: https://www.cnblogs.com/edisonfish/p/17470761.html

相关文章

  • python之requests库详解
    1.requests库详解发送http请求,接受http响应的库安装:pipinstallrequests1.1常用方法requests.get()--->defget(url,params=None,**kwargs)#发送get请求url:接口请求地址params:是get请求用于传参,这个参数会自动以?的方式加到url之后,多个参数之间用&分割**kwargs:可变......
  • Python字符串注意啦!
    注意在进行python里面进行比较时,一定要先看好比较双方的类型,如果我们想要比较的是字符串,第二项就一定要定义成字符串类型;例如:#这就是一个错误典型aa.get()==1#这个就会显示出False#我们需要将其改成这样aa.get()=='1'#这样才能够显示出True真的会谢!记住啦!......
  • Python自动化运维
    2-27在命令行窗口中启动的Python解释器中实现在Python自带的IDLE中实现print("Helloworld")编码规范每个import语句只导入一个模块,尽量避免一次导入多个模块不要在行尾添加分号“:”,也不要用分号将两条命令放在同一行建议每行不超过80个字符使用必要的空行可以增加代码的可读性运算......
  • 这 3个Python 函数你知道吗?
    动动发财的小手,点个赞吧!作为21世纪最流行的语言之一,Python当然有很多有趣的功能值得深入探索和研究。今天将介绍其中的三个,每个都从理论上和通过实际示例进行介绍。我想要介绍这些函数的主要原因是它们可以帮助您避免编写循环。在某些情况下,循环的运行成本可能很高,除此之外,这些......
  • 用python获取文件夹中文件的路径,基础路径,后缀,复制文件等。
    #读取文件夹中文件的路径#方法一importosimportshutilwenjianjia=r'D:\Desktop\内部培训python'#文件夹绝对路径#r的作用是去除转义字符lujing=os.listdir(wenjianjia)#获取文件夹中所有文件的相对路径返回一个列表forlujing_listinlujing......
  • 切片比数组好用在哪
    1.引言在Go语言中,数组和切片都是常见的数据结构,它们经常被用于存储数据,可以相互替换。本文将介绍Go语言中数组和切片的基本概念,同时详细探讨切片的优势。从而能够充分的理解切片相对于数组的优点,更好得对切片进行使用。2.基本介绍2.1数组数组是一种固定长度、具有相同类型的......
  • python 数据可视化———电子商务销售分析
    一、选题背景随着互联网和移动互联网技术的不断发展,电子商务已经成为了一个全球性的发展趋势。越来越多的商家和消费者都开始使用电子商务平台进行线上交易,这在一定程度上改变了传统商业模式,并且对于消费者而言,电子商务平台也提供了更为便捷的购物体验。因此,对于电子商务销售的分......
  • 切片比数组好用在哪
    1.引言在Go语言中,数组和切片都是常见的数据结构,它们经常被用于存储数据,可以相互替换。本文将介绍Go语言中数组和切片的基本概念,同时详细探讨切片的优势。从而能够充分的理解切片相对于数组的优点,更好得对切片进行使用。2.基本介绍2.1数组数组是一种固定长度、具有相同类型......
  • Python递归法计算棋盘上所有路径总奖品最大值(京东2016编程题)
    问题描述:假设有一个6x6的棋盘,每个格子里有一个奖品(每个奖品的价值在100到1000之间),现在要求从左上角开始到右下角结束,每次只能往右或往下走一个格子,所经过的格子里的奖品归自己所有。问最多能收集价值多少的奖品。思路:每个格子所在路径的总奖品最大值依赖于左边的格子或右边的格子。......
  • Python寻找给定序列中相差最小的两个数字
    importrandomdefgetTwoClosestElements(seq):#先进行排序,使得相邻元素最接近#相差最小的元素必然相邻seq=sorted(seq)#无穷大dif=float('inf')#遍历所有元素,两两比较,比较相邻元素的差值#使用选择法寻找相差最小的两个元素fori,vi......