字符串序列及列表、元组和range等序列类型数据都支持切片操作,切片是从一个序列中获取一个子序列,切片结果的数据类型与原序列相同。
切片的方法是:
seq[start: end: step]
seq:为字符串及列表、元组或range等序列类型数据对象名。
start:表示切片开始的位置元素序号,是第一个要返回的元素的索引号,即切片结果包含seq[start]元素。
正向索引start缺省值为0,切片从第一个元素开始时,start可以省略。逆向索引start缺省值为负的序列长度,即 -len(seq);
s = 'Hello World!'
print(s[6:12]) # 根据序号[6:12]切片,输出不包括序号12的字符串'World!'
print(s[:5]) # 从起点到序号为5的位置切片,不包括5,'Hello'
print(s[:-7]) # 从序号-12向后到-7切片,输出'Hello'
World!
Hello
Hello
end:表示是切片结束位置元素序号。正向索引最后一个元素序号为序列长度减1,即: len(seq)-1; 逆向索引最后一个元素序号为 -1;切片结果不包括seq[end]元素,即切片取不到右边界。
s = 'Hello World!'
print(s[:-7]) # 从序号-12向后到-7切片,输出'Hello'
print(s[-6:-1]) # 负向索引,不包含右边界元素,输出'World'
print(s[6:-1]) # 混用正负索引,输出'World'
print(len(s)) # 字符串长度12,最后一个元素序号11
print(s[:11]) # Hello World,未切取到最后字符 “!”
Hello
World
World
12
Hello World
切片到最后一个元素时,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!,未切取到最后字符 “!”
12
Hello World!
Hello World!
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'
Hello
World!
World
World
step:表示取值的步长,默认为1,步长值可以为负值,但步长不能为0。步长为正时正向切片,步长为负时逆向切片。
s = 'Hello World!'
print(s[::2]) # 步长为2,输出序号为偶数的元素,输出'HloWrd'
print(s[1::2]) # 步长为2,输出序号为奇数的元素,输出'el ol!'
HloWrd
el ol!
设置步长为 -1可实现逆向切片,可用于字符串的逆序。
s = 'Hello World!'
print(s[-1::-1]) # 按步长为-1进行切片,输出'!dlroW olleH'
print(s[::-1]) # 按步长为-1进行切片,输出'!dlroW olleH'
!dlroW olleH
!dlroW olleH
一个字符串,如果各字符逆序排列与原字符串相同,则称为回文,如“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,可直接做为函数返回值
回文素数是指一个数既是素数又是回文数。例如,131,既是素数又是回文数。 用户输入一个正整数 n , 编程在一行内从小到大输出小于n的回文素数,数字后后面用一个空格进行分隔。
输入:
输入一个正整数
输出:
符合要求的回文素数
def is_prime(n):
"""判断素数的函数,接收一个正整数为参数,参数是素数时返回True,否则返回False
减小判定区间,减少循环次数,提升效率。
"""
if n < 2:
return False
for i in range(2, n):
if n % i == 0:
return False
else:
return True
def palindromic(num):
"""接收一个数字为参数,判定其是否为回文数,返回布尔值。"""
return str(num) == str(num)[::-1]
def output_prime(num):
"""接收一个正整数num为参数,在一行中从小到大输出小于n的回文素数。函数无返回值"""
for i in range(num):
if palindromic(i) is True and is_prime(i):
print(i, end=' ')
# 主函数
if __name__ == "__main__":
n = int(input())
output_prime(n)
200
2 3 5 7 11 101 131 151 181 191
切片的过程是从第一个要返回的元素开始,到第一个不想返回的元素结束。切片操作会将按照给定的索引和步长,截取序列中的对象组成的新的片段。
# 列表类型
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:]))
[96, 76, 65, 85, 98, 55]
[84, 80, 95, 88, 96, 76, 65, 85, 98]
[84, 95, 96, 65, 98]
98
822
82.2
列表[‘李明’, 84, 80, 95, 88, 96, 76, 65, 85, 98, 55]中存储的是李明同学若干门课程的成绩。按输出示例格式输出该同学的最高分、最低分、总分和平均分。
提示:
max()、min()可获得序列的最大值和最小值
sum()可获得序列元素的和
len()可获得序列长度,即元素的个数
注意:
计算成绩和统计时,要略过姓名,可用切片方法实现。
输出格式控制可用以下格式,第一个大括号中加入姓名对象,第二个大括号中加入成绩对象:f’{}同学成绩最高分为{}’
ls = ['李明', 84, 80, 95, 88, 96, 76, 65, 85, 98, 55]
name = ls[0]
score = ls[1:]
max_score = max(score)
min_score = min(score)
sum_score = sum(score)
avg_score = sum_score/len(score)
print(f'{name}同学成绩最高分为{max_score}')
print(f'{name}同学成绩最低分为{min_score}')
print(f'{name}同学成绩总分为{sum_score}')
print(f'{name}同学平均成绩为{avg_score}')
李明同学成绩最高分为98
李明同学成绩最低分为55
李明同学成绩总分为822
李明同学平均成绩为82.2
# 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
range(3, 6)
25
4.0
# 包含字符串、数字、元组和列表等多种类型数据的列表
# 无论元素是什么,列表切片结果一定是列表
cv = ['李明', 35, ('博士','副教授'), [96, 92, 85]]
print(cv[2:4]) # 切片得到新列表[('博士', '副教授'), [96, 92, 85]]
[('博士', '副教授'), [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),空
[]
[]
range(10, 10)
中国的居民身份证号是一个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}')
530126193303150409
出生: 1933年03月15日
出生: 1933年3月15日
性别: 女
在这个程序中,通过字符串切片id_number[6:10]、id_number[10:12]、id_number[12:14]分别获取出生年份、月份和日期。
在切片时,切分出来的子字符串包括左边界,但不包括右边界。
语句print(‘出生于’+year+‘年’+month+‘月’+day+‘日’)的括号里,采用6个“+”将4个字符串和3个字符串变量拼接成一个新的字符串并输出。
这里也可以用“f”前缀格式化字符串输出,这种方法不限制变量类型,使用更为方便。
此处可用int()函数转为整数,去除月份或日期前导0,保持与身份证上的输出一致。