Python每日一练 07
admin
2024-03-04 21:37:24
0

Python每日一练 07

文章目录

  • Python每日一练 07
    • 一、切片
    • 二、实例:回文字符串
    • 三、实例:回文素数
    • 四、实例:输出成绩
    • 五、实例:提取身份号码中的日期与性别

一、切片

字符串序列及列表、元组和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 Falsefor i in range(2, n):if n % i == 0:return Falseelse:return Truedef 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,保持与身份证上的输出一致。

相关内容

热门资讯

挂风铃真的是招魂的么? 挂风铃真的是招魂的么?其实这个问题没有正确的答案,因为没人知道这个世界到底有没有鬼,但是很多东西使用...
传统菜肴新魅力,江西臊子蹄筋软... 江西臊子蹄筋是一道极具地方特色的传统菜肴,以其软糯弹牙的口感和浓郁的酸辣风味深受食客喜爱。这道菜以蹄...
43岁张萌,顶级熟透的水蜜桃! 这哪是孩子妈?分明是刚摘的水蜜桃! 这哪是孩子妈?分明是刚摘的水蜜桃! 这哪是孩子妈?分明是刚摘...
原创 三... 老话说“湿气不除,百病缠身”,可你知道吗?这难熬的三伏天,恰恰是老天爷给的“祛湿黄金期”!天地间阳气...
原创 丹... 和朋友张彩琴参观完秦岭博物馆后,大概是十点多一点,她说,快到饭点了,我们去吃饭吧。我说,饭是要吃的,...
原创 空... 夏季餐桌上的空心菜总因发黑、出水而让家庭主妇头疼,明明买回时鲜嫩翠绿,下锅后却迅速变黑,口感绵软如烂...
什么时候给宝宝断奶最科学?断奶... 什么时候给宝宝断奶最科学?断奶有什么办法?一般来说一岁以后给宝宝断奶最好了,因为这个时候母乳已经没有...
云南元阳阿者科村第十二次分红 ... 夏日蝉鸣中,云南省元阳县阿者科村的梯田如层层绿绸环绕村落,生机盎然。7月8日,这个坐落于红河州的哈尼...
张家界康养之旅,张家界五天四晚... 人到中年,总觉得身体越来越差,想找个地方好好放松一下,张家界成了我的首选。这里空气清新,负氧离子含量...
沿着纬度听中国︱四川德阳:“川... 央广网成都7月9日消息(记者 昌思荣 见习记者 唐诗敏)当神秘的北纬30°线如一条隐秘的脉络横穿四川...
西北旅游必备攻略!西北七天六晚... 第一天:兰州集结 - 黄河风情初体验 清晨抵达兰州中川国际机场,扑面而来的是西北特有的干燥空气与灿烂...
绿光森林全集哪有的看? 绿光森林全集哪有的看?现在好像湖南台有,之前就是星空,不然买碟也OK
《文艺心理学》课程讲什么内容? 《文艺心理学》课程讲什么内容?《文艺心理学》是一门运用心理学和文艺学的跨学科方法来研究古今中外的文艺...
老舍先生的文章有那些? 老舍先生的文章有那些?长篇小说《骆驼祥子》、《赵子日》、《老张的哲学》、《四世同堂》、《二马》、《小...
女主角冷酷无情的小说 女主角冷酷无情的小说一直冷酷最好你没问题吧,一般情况下都是男主角冷酷无情的说。献给爱米丽的一朵花
皇子归来之欢喜知府和皇子归来之... 皇子归来之欢喜知府和皇子归来之欢喜县令是一部戏吗我个人觉得是,只是属于不同的章节
古人为何远比现代人重视后世史书... 古人为何远比现代人重视后世史书对自己的评价?其实现代人也比较重视史书,因为人更爱追求长生之道,如果不...
我放学后做作业英文怎么写? 我放学后做作业英文怎么写?I do homework after shool.I do my ho...
请是学者的看过来,帮看看我还有... 请是学者的看过来,帮看看我还有可能成为一名学者吗虽然我不是学者,我还是想说:既然已经做了,也坚持了,...
这是犬夜叉里的第几集? 这是犬夜叉里的第几集?是犬夜叉第65集:再见了,青春的每一天。冥加爷爷的未婚妻日向奶奶跳到犬夜叉身上...