- images
- results
- .gitignore
- 1.1概论.ipynb
- 1.2 环境配置.pdf
- 1.3数据类型.ipynb
- 1.4 人机交互.ipynb
- 1.5 对象与变量.ipynb
- 1.6 编码与命名规范.ipynb
- 2.1 数值类型.ipynb
- 2.2 数值类型转换.ipynb
- 2.3 数值元算.ipynb
- 2.4常用数学运算函数.ipynb
- 2.5 math 模块及其应用.ipynb
- 2.6.1 逻辑值测试.ipynb
- 2.6.2 成员运算.ipynb
- 2.6.3 比较运算.ipynb
- 2.6.4 布尔运算.ipynb
- 2.6.5 运算优先级.ipynb
- 2.ipynb
- 3.1 流程控制结构.ipynb
- 3.3.1 for 循环语句.ipynb
- 3.3.3 rang.ipynb
- 3.3.3 while 循环语句.ipynb
- 3.4 and 3.5 分支结构和条件.ipynb
- 3.6 and 3.7 .ipynb
- 3.9 异常处理.ipynb
- 4 函数和模块化编程.ipynb
- 4.1 函数的定义、调用与返回值.ipynb
- 4.2 函数的参数传递.ipynb
- 4.3 变量的作用域.ipynb
- 4.4 匿名函数.ipynb
- 4.5 递归.ipynb
- 4.6 内置函数.ipynb
- 4.7 模块化程序设计.ipynb
- 5.1 序列通用操作.ipynb
- 5.1.1 索引.ipynb
- 5.1.2 切片.ipynb
- 5.1.3 序列拼接与重复.ipynb
- 5.1.4 成员测试.ipynb
- 5.2.1 字符串的创建.ipynb
- 5.2.2 字符串常量.ipynb
- 5.2.4 字符串的遍历.ipynb
- 5.2.5 文件遍历.ipynb
- 5.2.6 字符串的处理方法.ipynb
- 5.2.7 字符串格式化.ipynb
- 5.2.8 转义字符.ipynb
- 5.3 random 模块及其应用.ipynb
- 6.1 元组.ipynb
- 6.2 列表.ipynb
- 6.2.1 列表的创建.ipynb
- 6.2.2 列表的更新.ipynb
- 6.2.3 列表的删除.ipynb
- 6.2.4 列表的排序.ipynb
- 6.2.5 列表赋值与复制.ipynb
- 6.2.6 列表推导式.ipynb
- 6.2.8 常用内置函数.ipynb
- 6.2.9 列表嵌套及其排序.ipynb
- 6.3 列表综合应用.ipynb
- 7.1.1 集合的创建.ipynb
- 7.1.2可变集合类型的操作.ipynb
- 7.1.3 成员关系.ipynb
- 7.1.4 集合关系.ipynb
- 7.1.5 集合运算.ipynb
- 7.2.1 字典创建.ipynb
- 7.2.2 获取字典值.ipynb
- 7.2.3 修改字典值.ipynb
- 7.2.4内置函数与方法.ipynb
- 7.2.5字典排序输出.ipynb
- 7.3 集合与字典的应用.ipynb
- 8 中 numpy 概述.ipynb
- 8 中panda 库.ipynb
- 8.1 文件的打开与关闭.ipynb
- 8.2 文件读写操作.ipynb
- 8.3 文件的应用.ipynb
- 8.4 numpy 文件操作.ipynb
- 8.4.2 and 3.ipynb
- 8.5.1 pandas文件读写.ipynb
- 8.5.2 and 3 and 4.ipynb
- 9.1 matplotlib 线性图.ipynb
- 9.1.5 数据文化绘图.ipynb
- 9.2 非线性图.ipynb
- 9.3 词云.ipynb
- _overview.md
- _readme.ipynb
- coding_here.ipynb
- dream.png
- score.txt
- score_total.csv
- 成绩分析综合.json
5.1.2 切片.ipynb @master — view markup · raw · history · blame
切片¶
字符串序列及列表、元组和range等序列类型数据都支持切片操作,切片是从一个序列中获取一个__子序列__,切片结果的__数据类型与原序列相同__。
切片的方法是:
seq[start: __end__: step]
seq为字符串及列表、元组或range等序列类型数据对象名。
start:
表示切片开始的位置元素序号,是第一个要返回的元素的索引号,即切片结果包含seq[start]元素。
__正向索引start缺省值为0__,切片从第一个元素开始时,start可以省略。
逆向索引start缺省值为负的序列长度,即 -len(seq);
还可以这样理解切片,索引指向的是字符之间 ,第一个字符的左侧标为 0,最后一个字符的右侧标为 n ,n 是字符串长度。例如:

s = 'Hello Python!'
print(s[6:12]) # 根据序号[6:12]切片,输出字符串'Python!'
print(s[:5]) # 'Hello'
print(len(s[:5]))
print(s[:-7]) # 输出'Hello '
print(len(s[:-7]))
end:
表示是切片结束位置元素序号。
正向索引最后一个元素序号为序列长度减1,即: len(seq)-1; 逆向索引最后一个元素序号为 -1;
切片结果不包括seq[end]元素,即切片取不到右边界。
s = 'Hello Python!'
print(s[:-7]) # 从序号-12向后到-7切片,输出'Hello'
print(s[-6:-1]) # 输出'ython'
print(s[6:-1]) # 混用正负索引,输出'Python'
print(len(s)) # 字符串长度12,最后一个元素序号11
print(s[:11]) # Hello Pytho,未切取到最后字符 “n!”
切片到最后一个元素时,__end 省略__或__设为序列长度__(确保取到最后一个元素)。
想返回包含最后一个元素(len(s)-1)的切片时,结束位置的序号end应该设为len(s)或省略结束位置序号,即应该使用切片seq[start: len(s)] 或seq[start: ]。
s = 'Hello World!'
print(len(s)) # 字符串长度12,最后一个元素序号11
print(s[:12]) # Hello World!
print(s[:]) # Hello World!
print(s[6:]) # World!,未切取到最后字符 “!”
s = 'Hello World!'
print(s[:-7]) # 从序号-12向后到-7切片,输出'Hello'
print(s[6:]) # 从序号6向后到最后一个字符切片,输出'World!'
print(s[-6:-1]) # 负向索引,不包含右边界元素,输出'World'
print(s[6:-1]) # 混用正负索引,输出'World'
step:
表示取值的步长,默认为1,步长值可以为负值,但__步长不能为0__。
步长为正时正向切片,__步长为负时逆向切片__。
s = 'Hello World!'
print(s[::2]) # 步长为2,输出序号为偶数的元素,输出'HloWrd'
print(s[1::2]) # 步长为2,输出序号为奇数的元素,输出'el ol!'
设置__步长为 -1__可实现逆向切片,可用于__字符串的逆序__。
s = 'Hello World!'
print(s[-1::-1]) # 按步长为-1进行切片,输出'!dlroW olleH'
print(s[::-1]) # 按步长为-1进行切片,输出'!dlroW olleH'
实例 6.3 回文字符串¶
一个字符串,如果各字符逆序排列与原字符串相同,则称为回文,如“12321”、“上海自来水来自海上”,用户输入一个字符串,判断该字符串是否为回文,如是回文输出“True”,否则输出“False”。
判断输入的字符串是否是回文,可以从前到后将字符串的每一个字符与从后向前每一个字符一一比较,如果都一一相同,则是回文。Python在处理字符串方面有更灵活的方法,可以利用切片方法(s [start: end: step]),令步长step值为-1,从最后一个字符开始,到字符串开始字符结束进行切片,即构造切片s[-1::-1]或s[::-1] ,可以获得反转后的字符串。比较反转后的字符串与原字符串是否相同,相同则是回文。
s = input() # 输入一个字符串
if s == s[-1::-1]: # s[-1::-1]将字符串反转,判断反转后是否与原字符串相等
print('True')
else:
print('False')
可以将其定义为函数,利用比较运算结果为布尔值的特性,直接返回比较运算表达式,避免使用分支语句。
def palindromic(s):
"""接收一个字符串为参数,判定其是否为回文,返回布尔值。"""
return s == s[::-1] # 比较运算结果为布尔值True或False,可直接做为函数返回值
练一练1
回文素数是指一个数既是素数又是回文数。例如,131,既是素数又是回文数。 用户输入一个正整数 n , 编程在一行内从小到大输出小于n的回文素数,数字后后面用一个空格进行分隔。
输入:
输入一个正整数
输出:
符合要求的回文素数
# 补充你的代码
def is_prime(n):
"""判断素数的函数,接收一个正整数为参数,参数是素数时返回True,否则返回False
减小判定区间,减少循环次数,提升效率。
"""
# 补充你的代码
def palindromic(num):
"""接收一个数字为参数,判定其是否为回文数,返回布尔值。"""
# 补充你的代码
def output_prime(num):
"""接收一个正整数num为参数,在一行中从小到大输出小于n的回文素数。函数无返回值"""
# 补充你的代码
# 主函数
if __name__ == "__main__":
n = int(input())
output_prime(n)
切片的过程是从第一个要返回的元素开始,到第一个不想返回的元素结束。
切片操作会将按照给定的索引和步长,截取序列中的对象组成的新的片段。
# 列表类型
scores = ['李明', 84, 80, 95, 88, 96, 76, 65, 85, 98, 55]
print(scores[5:]) # 从5到序列结束的元素,输出[96, 76, 65, 85, 98, 55]
print(scores[1:-1]) # 混用索引[84, 80, 95, 88, 96, 76, 65, 85, 98]
print(scores[1::2]) # 步长为2,隔一个,输出[84, 95, 96, 65, 98]
print(max(scores[1:])) # 切片返回除序号0的列表,max返回其最大值
print(sum(scores[1:])) # 利用sum()函数对切片获取的序列求和,输出822
# len()获得切片后的列表元素个数,输出切片后的序列元素的平均值82.2
print(sum(scores[1:])/len(scores[1:]))
练一练2
列表['李明', 84, 80, 95, 88, 96, 76, 65, 85, 98, 55]中存储的是李明同学若干门课程的成绩。
请按输出示例格式输出该同学的最高分、最低分、总分和平均分。
# 补充你的代码
# range类型,切片结果仍为range
r = range(10) # 获得0,1,2,3,4,5,6,7,8,9的序列
print(r[3:6]) # 对range(10)切片,返回新对象range(3, 6)
print(sum(r[1::2])) # 输出序号为奇数的元素的和 25
print(sum(r[0::2])/len(r[0::2])) # 输出序号为偶数的元素的平均值 4.0
# 包含字符串、数字、元组和列表等多种类型数据的列表
# 无论元素是什么,列表切片结果一定是列表
cv = ['李明', 35, ('博士','副教授'), [96, 92, 85]]
print(cv[2:4]) # 切片得到新列表[('博士', '副教授'), [96, 92, 85]]
__切片的序号不存在越界的问题,__超出范围的序号或是步长为正时start大于end值时,结果都是空序列
print('Hello World!'[100:4]) # 切片得到空字符串''
print(cv[10:4]) # 切片得到空列表[]
print(cv[10:20]) # 切片得到空列表[]
print(range(10)[100:200]) # 从最大序号向后切片到最大序号,结果range(10, 10),空
实例 6.4 提取身份号码中的日期与性别¶
中国的居民身份证号是一个18个字符的字符串:
第7--14位数字表示出生年、月、日
第17位数字表示性别,奇数表示男性,偶数表示女性。
输入一个合法的身份证号,输出其出生年月日。(注:本书测试所用身份证号是用程序模拟生成的虚拟号码)
id_number = input() # 测试数据是合法的18位身份证号
year = id_number[6:10] # 序号6-9的字符串,年份
month = id_number[10:12] # 序号为10-11的字符串,月份
date = id_number[12:14] # 序号为12-13的字符串,日期
if id_number[16] in '13579': # 若第17位数字在'13579'中存在,为奇数
gender = '男'
else:
gender = '女'
print('出生: ' + year + '年' + month + '月' + date + '日') # 字符串拼接
print(f'出生: {year}年{int(month)}月{int(date)}日') # int()转整数去除前导0
print(f'性别: {gender}')
在这个程序中,通过字符串切片id_number[6:10]、id_number[10:12]、id_number[12:14]分别获取出生年份、月份和日期。
在切片时,切分出来的子字符串包括左边界,但不包括右边界。
语句print('出生于'+year+'年'+month+'月'+day+'日')的括号里,采用6个“+”将4个字符串和3个字符串变量拼接成一个新的字符串并输出。
这里也可以用“f”前缀格式化字符串输出,这种方法不限制变量类型,使用更为方便。
此处可用int()函数转为整数,去除月份或日期前导0,保持与身份证上的输出一致。