python中的切片

        学习python已经有段时间了,但是有些知识点刚学的时候记得非常好,但是时间一长很多概念性的东西就忘了,所以最好记下学习笔记,这样便于学习巩固;比如python中的切片,好了废话不多说,直接上代码。

#创建一个从1到100的一个集合
L = range(1, 101)

print(L[:10])  #取前10个元素
#输出 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print(L[0:10]) #从索引0开始取值 直到索引10为止 但不包括索引10 正好是10个元素。
#输出  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print(L[1:3]) #从索引1开始取值,到索引3为止 但不包括索引3 正好是3个元素
#输出 [2, 3]

#print(L[:]) #表示从头到尾
#输出[1,2,3......98,99,100]

print(L[::10]) #表示每隔10个元素取一个
#输出 [1, 11, 21, 31, 41, 51, 61, 71, 81, 91]

print(L[2::3]) #从索引2开始 每隔3个取一个元素
#输出 [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]

#不大于50  5的倍数,下面的第三个元素5是每隔几个元素取一次值
print(L[4:50:5])
#输出 [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]

print('------------------------')
#倒序切片
A = [1,2,3,4,5]
print(A[-2:])  #取最后2个元素
#输出  [4, 5]

print(A[:-2]) #从前面开始取元素 截止到最后2个元素之前
#输出  [1, 2, 3]

print(A[-3:-1])  #取最后3个元素,截止到最后3个元素最后一个之前
#输出  [3, 4]

print(A[-4:-1:2]) #取最后4个元素,截止到最后4个元素的最后一个之前,每隔2个元素取一个
#输出  [2, 4]

print('----------------------')

B = range(1,101)
print(B[-10:])  #取最后10个元素
#输出  [91, 92, 93, 94, 95, 96, 97, 98, 99, 100]

print(B[-46::5]) #最后10个元素中5的倍数。
#输出 [55, 60, 65, 70, 75, 80, 85, 90, 95, 100]


#对字符串的切片
def firstCharUpper(s):
    s1 = s[:1]  #取字符串第一个元素
    s1 = s1.upper() #字符串第一个元素 转成大写
    return s1+s[1:]

print(firstCharUpper('hello'))
#输出   Hello


  

<think>我们正在讨论Python切片的使用方法和原理。根据提供的引用,我们知道切片操作可以用于序列类型(如列表、字符串等),并且有两种索引方式:正索引和负索引。同时,我们还想了解其底层原理。 # 切片的使用方法 切片的基本语法是:`sequence[start:stop:step]`,其中: - `start`:切片开始的位置(包含该位置),默认为0。 - `stop`:切片结束的位置(不包含该位置),默认为序列的长度。 - `step`:切片的步长,默认为1。当步长为负数时,表示反向切片。 ## 示例说明 以一个列表为例:`a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]` 1. 基本切片: - `a[2:7]` -> 从索引2开始到索引7(不包括7),即`[2,3,4,5,6]` - `a[:5]` -> 从开始到索引5(不包括5),即`[0,1,2,3,4]` - `a[5:]` -> 从索引5到末尾,即`[5,6,7,8,9]` - `a[::2]` -> 步长为2,即`[0,2,4,6,8]` 2. 负索引: - `a[-3:]` -> 从倒数第3个元素到末尾,即`[7,8,9]` - `a[-5:-2]` -> 从倒数第5个到倒数第2个(不包括倒数第2个),即`[5,6,7]` 3. 负步长(反向切片): - `a[::-1]` -> 反转列表,即`[9,8,...,0]` - `a[5:2:-1]` -> 从索引5开始到索引2(不包括2),反向取,即`[5,4,3]` ## 注意事项 - 当`step`为负数时,`start`应大于`stop`,否则结果为空列表。 - 切片操作会返回一个新的对象,是原序列的浅拷贝(对于可变序列,如列表,切片操作会生成一个新的列表对象,但新列表中的元素是对原列表中元素的引用)。 # 切片的底层原理 在Python中,切片操作实际上是通过`__getitem__`方法实现的。当我们对一个序列对象进行切片时,Python会调用该对象的`__getitem__`方法并传入一个`slice`对象。 例如,`a[1:5:2]`实际上会被解释为`a.__getitem__(slice(1,5,2))`。 `slice`对象是Python内置的一个类型,它有三个属性:`start`, `stop`, `step`。我们可以自己创建`slice`对象并使用它来切片。 ## 示例 ```python s = slice(1,5,2) a = [0,1,2,3,4,5,6,7,8,9] print(a[s]) # [1,3] ``` ## 关于浅拷贝 切片操作返回的是一个新的序列,但是这个新序列中的元素是原序列中元素的引用。因此,如果原序列中的元素是可变对象,修改新序列中的元素可能会影响原序列(因为它们是同一个对象的引用)。但是,如果原序列中的元素是不可变对象(如整数、字符串),则不存在这个问题。 例如: ```python a = [[1,2], [3,4]] b = a[:] # 切片复制,b是一个新的列表,但里面的元素是对a中元素的引用 b[0][0] = 10 print(a) # [[10,2], [3,4]],因为a[0]和b[0]是同一个列表 ``` # 总结 切片Python中非常强大且常用的操作,它提供了一种简洁、高效的方式来获取序列的子集。理解其索引规则(特别是负索引和负步长)以及底层原理(通过`slice`对象和`__getitem__`方法)对于深入掌握Python非常重要。 §§相关问题§§ 1. 如何利用切片进行序列的逆序? 2. 切片操作在哪些Python数据结构中可用? 3. 切片操作的时间复杂度是多少? 4. 如何通过切片实现列表的深拷贝以避免引用问题? </think>### Python切片的使用方法和原理 #### 一、切片基本语法 切片操作的基本格式为:`sequence[start:stop:step]` 其中: - `sequence`:可切片对象(如列表、字符串、元组) - `start`:起始索引(包含),默认为0 - `stop`:结束索引(不包含),默认为序列长度 - `step`:步长(可为负值),默认为1 例如: ```python a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(a[2:7]) # [2, 3, 4, 5, 6](索引2到6) print(a[1:8:2]) # [1, 3, 5, 7](步长为2) print(a[::-1]) # [9, 8,...,0](逆序) ``` #### 二、索引方向原理 Python支持两种索引方式(以列表 `a = [0,1,2,3,4,5,6,7,8,9]` 为例): 1. **正索引**(左→右): ``` 索引: 0 1 2 3 4 5 6 7 8 9 值: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ``` 2. **负索引**(右→左): ``` 索引:-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 值: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ``` **混合索引示例**: ```python print(a[-4:-1]) # [6,7,8](倒数第4到倒数第2) print(a[3:-2]) # [3,4,5,6,7](索引3到倒数第3) ``` #### 三、底层实现原理 1. **切片对象**: 切片操作 `a[start:stop:step]` 会被转换为 `a.__getitem__(slice(start, stop, step))`,其中 `slice` 是内置类型[^1]。 2. **内存机制**: 切片操作会创建**新对象**,但新序列元素是原序列的**浅拷贝引用**。例如: ```python b = a[2:5] # 创建新列表,但元素指向相同内存地址 ``` 3. **索引计算**: Python内部自动处理负索引转换: ```python a[-3:] → a[len(a)-3 : len(a)] ``` #### 四、特殊切片技巧 | 操作 | 示例 | 结果 | |--------------|-------------------|-----------------------| | 全序列复制 | `a[:]` | `[0,1,...,9]`(浅拷贝) | | 逆序 | `a[::-1]` | `[9,8,...,0]` | | 偶数索引 | `a[::2]` | `[0,2,4,6,8]` | | 边界溢出处理 | `a[5:100]` | `[5,6,7,8,9]`(自动截断) | #### 五、注意事项 1. **不可变对象**(如字符串)切片会创建完整副本 2. **步长为负**时需确保 `start > stop`: ```python print(a[7:2:-1]) # [7,6,5,4,3](从索引7反向到索引3) ``` 3. **空切片**条件:当 `start` 和 `stop` 逻辑冲突时返回空序列 ```python print(a[5:2]) # [](正向切片要求start<stop) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值