百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

还在为不懂Python切片操作及原理而苦恼吗?漫画帮你立马理解掌握

off999 2024-09-21 21:03 66 浏览 0 评论


我首先通过 input() 函数,接收了外部输入字符串,然后通过 list 函数的切片,实现了回文数,代码真的好简洁,我自己都佩服我自己,我也不知道小组长会问我切片原理,我好无奈呀。

s = input()
if s == s[::-1]:
    print("True")
else:
    print("False")

>>> abcba
True

什么是列表切片?

切片操作不是列表特有的,python 中的有序序列都支持切片,如字符串,元组。

切片的返回结果类型和切片对象类型一致,返回的是切片对象的子序列,如:对一个列表切片返回一个列表,

字符串切片返回字符串。

切片生成的子序列元素是源版的拷贝。因此切片是一种浅拷贝。

切片的图示分析

li=["A","B","C","D"]
# 格式:li[start : end : step]    
# start 是切片起点索引,end 是切片终点索引,但切片结果不包括终点索引的值。step 是步长默认是 1。
# [start : end : step) 左开右闭
t=li[0:3]        ["A","B","C"]       #起点的0索引可以省略,t=li[:3]
t=li[2: ]        ["C","D"]           #省略end,则切到末尾
t=li[1:3]        ["B","C"]
t=li[0:4:2]      ["A","C"]            #从li[0]到li[3],设定步长为2。          

在 step 的符号一定的情况下,start 和 end 可以混合使用正向和反向索引,无论怎样,你都要保证

start 和 end 之间有和 step 方向一致元素间隔,否则会切出空列表。

Case 1

t=li[0:2] t=li[0:-2] t=li[-4:-2] t=li[-4:2]

上面的结果都是一样的:t 为 ["A","B"]。

Case 2

t=li[-1:-3:-1] t=li[-1:1:-1] t=li[3:1:-1] t=li[3:-3:-1]

上面的结果都是一样的:t 为 ["D","C"]。

Case 3

t=li[-1:-3] t=li[-1:1] t=li[3:1] t=li[3:-3]

都切出空列表。

同时,step 的正负决定了切片结果的元素采集的先后。

省略 start 和 end 表示以原列表全部为目标。

t=li[::-1] t--->["C","B","A"] #反向切,切出全部。

t=li[:] t--->["A","B","C","D"] #正向切全部。

切片原理

小狸,学习一件事物,先学习它的表象,然后分析它的内在实现,最后查看源代码仔细推敲它到底是怎么实现的。

需要注意的是,列表切片产生的是列表的副本,与原列表不是同一份空间。

x=[1,2,3]
y=x[:]
x[0]=-1
print(y) #输出[1,2,3]

切片写操作

在2后面插入若干个元素,应该用列表

#case 1
>>> x=[1,2,3,4,5]
>>> x[2:0]=100  #在2后面插入若干个元素,应该用列表
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
>>> x[2:0]=[100]
>>> x
[1, 2, 100, 3, 4, 5]

#case 2
>>> x[2:4]=None
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
>>> x[2:4]=[None]
>>> x
[1, 2, None, 5]

删除切片

>>> del x[2:3]  #删除切片
>>> x
[1, 2, 3, 4, 5]

对于切片x[from:to],会进行预处理to=max(from+1,to)

>>> x=[1,2,3,4,5]
>>> x[2:1]=[100] #对于切片x[from:to],会进行预处理to=max(from+1,to)
>>> x
[1, 2, 100, 3, 4, 5]

对于切片del操作,如果from>to,不执行任何操作

>>> del x[2:0] 
>>> x
[1, 2, 100, 3, 4, 5]
>>> del x[2:1]
>>> x
[1, 2, 100, 3, 4, 5]
>>> del x[2:3]
>>> x
[1, 2, 3, 4, 5]

切片原理解析

通过指定下标的方式来获得某一个数据元素,或者通过指定下标范围来获得一组序列的元素,这种访问序列的方式叫做切片。有些地方也把它称之为分片。

先从底层分析切片运算:

list 的切片,内部是调用 getitemsetitemdelitem 和 slice 函数。而 slice 函数又是和 range() 函数相关的。

给切片传递的键是一个特殊的 slice 对象。该对象拥有可描述所请求切片方位的属性。

a = [1,2,3,4,5,6]
x = a [ 1 : 5 ]                # x = a.__getitem__(slice( 1, 5, None))
a [ 1 : 3 ] = [10, 11, 12 ]    # a.__setitem__(slice(1, 3, None), [ 10, 11, 12 ])
del a [ 1 : 4 ]                # a.__delitem__(slice(1, 4, None))

看看代码具体实现

def between(beg, end, mid):
    # 判断mid是否位于begin和end之间
    return end > mid >= beg or end < mid <= beg

def get_slice(a, beg, end, delta=1):
     # 数组切片get方式
     if delta == 0: 
        raise ValueError("slice step cannot be 0")
     # 将负数下标转化一下
     if beg < 0: 
        beg += len(a)
     if end < 0: 
        end += len(a)
     # 如果转化完成之后依然不在合法范围内,则返回空列表
     if beg < 0 and end < 0 or beg >= len(a) and end >= len(a): 
        return []
     # 如果方向不同,则返回空列表
     if (end - beg) * delta <= 0: 
        return []
     # 将越界的部分进行裁剪
     beg = max(0, min(beg, len(a) - 1))
     end = max(-1, min(end, len(a)))
     ans = []
     i = beg
     while between(beg, end, i):
          ans.append(a[i])
          i += delta
     return ans

def set_slice(a, li, beg, end, delta=1):
     if delta == 0: 
        raise ValueError("slice step cannot be 0")
     if delta == 1:
      # 如果delta==1,那么li的长度可以随意
      if beg < 0: 
        beg += len(a)
      if end < 0: 
        end += len(a)
      beg = max(0, min(beg, len(a) - 1))
      end = max(-1, min(end, len(a)))
      for i in range(beg, end):
           del a[beg]
      for i in reversed(li):
           a.insert(beg, i)
    else:
      # delta!=1,相当于替换
      if len(get_slice(a, beg, end, delta)) != len(li): 
        raise ValueError("array don't match")
      if len(li) == 0: 
        return
      if beg < 0: 
        beg += len(a)
      if end < 0: 
        end += len(a)
      beg = max(0, min(beg, len(a) - 1))
      # 用li中的全部元素逐一替换
      for ind, value in enumerate(li):
           a[ind * delta + beg] = value

总结

1、本次贝斯狸的 Python 学习之旅是一次尝试,想让程序员学习生活变得更加有乐趣,也算满足了我的愿望,重拾 PhotoShop,后面还会更新更多有趣可爱的对话,轻松实现学习生活两不误。

2、学习知识是一个循序渐进的过程,正如小狸一样,学会了使用,但是却没有深入,小组长随机抽查便中了招,所以我们要时刻保持好奇心,凡事多问个为什么?这样才能进步。

相关推荐

安全教育登录入口平台(安全教育登录入口平台官网)

122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...

大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)

大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...

谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)

要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...

2026-02-04 09:03 off999

电信宽带测速官网入口(电信宽带测速官网入口app)

这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...

植物大战僵尸95版手机下载(植物大战僵尸95 版下载)

1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...

免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)

1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...

2025世界杯赛程表(2025世界杯在哪个国家)

2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...

下载搜狐视频电视剧(搜狐电视剧下载安装)

搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...

pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
永久免费听歌网站(丫丫音乐网)

可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...

音乐格式转换mp3软件(音乐格式转换器免费版)

有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...

电子书txt下载(免费的最全的小说阅读器)

1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...

最好免费观看高清电影(播放免费的最好看的电影)

在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...

孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)

要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...

取消回复欢迎 发表评论: