Python 高级特性-切片

news/2025/2/23 16:37:15

目录

切片

练习

小结


掌握了Python的数据类型、语句和函数,基本上就可以编写出很多有用的程序了。

比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现:

python">L = []
n = 1
while n <= 99:
    L.append(n)
    n = n + 2

取list的前一半的元素,也可以通过循环实现。

但是在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。

基于这一思想,我们来介绍Python中非常有用的高级特性,1行代码能实现的功能,决不写5行代码。请始终牢记,代码越少,开发效率越高。

切片

取一个list或tuple的部分元素是非常常见的操作。比如,一个list如下:

python">>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']

取前3个元素,应该怎么做?

笨办法:

python">>>> [L[0], L[1], L[2]]
['Michael', 'Sarah', 'Tracy']

之所以是笨办法是因为扩展一下,取前N个元素就没辙了。

取前N个元素,也就是索引为0-(N-1)的元素,可以用循环:

python">>>> r = []
>>> n = 3
>>> for i in range(n):
...     r.append(L[i])
... 
>>> r
['Michael', 'Sarah', 'Tracy']

对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作。

对应上面的问题,取前3个元素,用一行代码就可以完成切片:

python">>>> L[0:3]
['Michael', 'Sarah', 'Tracy']

也可以从索引1开始,取出2个元素出来:

python">>>> L[1:3]
['Sarah', 'Tracy']

类似的,既然Python支持L[-1]取倒数第一个元素,那么它同样支持倒数切片,试试: 

python">>>> L[-2:]
['Bob', 'Jack']
>>> L[-2:-1]
['Bob']

 记住倒数第一个元素的索引是-1

切片操作十分有用。我们先创建一个0-99的数列:

python">>>> L = list(range(100))
>>> L
[0, 1, 2, 3, ..., 99]

 可以通过切片轻松取出某一段数列。比如前10个数:

后10个数:

python">>>> L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

前11-20个数:

python">>>> L[10:20]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

前10个数,每两个取一个:

python">>>> L[:10:2]
[0, 2, 4, 6, 8]

所有数,每5个取一个:

python">>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

甚至什么都不写,只写[:]就可以原样复制一个list:

python">>>> L[:]
[0, 1, 2, 3, ..., 99]

tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple:

python">>>> (0, 1, 2, 3, 4, 5)[:3]
(0, 1, 2)

字符串'xxx'也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:

python">>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[::2]
'ACEG'

 在很多编程语言中,针对字符串提供了很多各种截取函数(例如,substring),其实目的就是对字符串切片。Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单。

练习

利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:

python">def trim(s):
    # return s.strip()
    start = 0
    while start < len(s) and s[start] == ' ':
        start += 1
    end = len(s) - 1
    while end >= 0 and s[end] == ' ':
        end -= 1
    if start > end:
        return ''
    return s[start:end + 1]


# 测试:
if trim('hello  ') != 'hello':
    print('测试失败!')
elif trim('  hello') != 'hello':
    print('测试失败!')
elif trim('  hello  ') != 'hello':
    print('测试失败!')
elif trim('  hello  world  ') != 'hello  world':
    print('测试失败!')
elif trim('') != '':
    print('测试失败!')
elif trim('    ') != '':
    print('测试失败!')
else:
    print('测试成功!')

小结

有了切片操作,很多地方循环就不再需要了。Python的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作。


http://www.niftyadmin.cn/n/5863585.html

相关文章

常用高压缩率的视频容器格式,并进行大比例压缩

常用的高压缩率视频容器格式,包括*.mp4 、*.mkv、*.webM等。     容器格式本身并不直接决定压缩率,而是取决于容器中所使用的视频编码格式等因素。不过,在常见的视频容器格式中,一些容器在搭配特定编码格式时,通常能表现出较高的压缩效率,以下是相关介绍: 1 MKV格式 …

计算机视觉:主流数据集整理

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络(附代码) 第五章&#xff1…

SpringCloud系列教程:微服务的未来(二十五)-基于注解的声明队列交换机、消息转换器、业务改造

前言 在现代分布式系统中&#xff0c;消息队列是实现服务解耦和异步处理的关键组件。Spring框架提供了强大的支持&#xff0c;使得与消息队列&#xff08;如RabbitMQ、Kafka等&#xff09;的集成变得更加便捷和灵活。本文将深入探讨如何利用Spring的注解驱动方式来配置和管理队…

WordPress Elementor提示错误无法保存500的解决指南

500内部服务器错误是一种常见的服务器错误&#xff0c;通常由网站的服务器环境引起。这种错误可能导致网站无法正常访问&#xff0c;影响用户体验。本文将探讨500错误的常见原因&#xff0c;并提供解决方案&#xff0c;特别针对使用Elementor构建的WordPress网站。 500错误的常…

【WebGL】fbo双pass案例

双pass渲染案例&#xff08;离线渲染一个三角面&#xff0c;然后渲染到一个占满屏幕的矩阵上&#xff09; 离线渲染如何需要开启深度测试的话&#xff0c;需要额外操作&#xff0c;这里不展开 <!DOCTYPE html> <html lang"en"><head><meta ch…

区块链讲解

1.基本概念&#xff1a;区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的链式数据结构&#xff0c;并以密码学方式保证的不可篡改和不可伪造的分布式账本。简单来说&#xff0c;它就像是一个由众多节点共同维护的账本&#xff0c;每个节点都有这个账本的完整副本&a…

PTA:有序顺序表的插入

请设计一个算法&#xff0c;在有序顺序表L中插入元素x&#xff0c;使得表依然有序&#xff0c;并输出新增元素后的表数据。 例如&#xff1a; L的元素 1 3 5 7 插入新元素 4 输出 1 3 4 5 7 其中&#xff0c;L的长度不超过1000&#xff0c;当中的元素为非递减排序。 输入格式…

Trae+Qt+MSVC环境配置

Trae Trae是字节跳动基于VSCode推出的AI集成开发环境&#xff08;IDE&#xff09;&#xff0c;是一款专为中文开发者深度定制的智能编程工具。其目标是通过AI技术实现从“Copilot”到“Autopilot”的编程模式演进。 类似这样的IDE比如Windsurf、Cursor&#xff0c;都是基于VS…