Python编程实验二:字符串与列表的基本应用

目录

一、实验目的与要求

二、实验内容

三、主要程序清单和程序运行结果

第1题

第2题

第3题

第4题

四、实验结果分析与体会


一、实验目的与要求

(1)通过本次实验,学生应掌握字符串索引、切片和一些常用方法的使用; 
(2)掌握列表创建的基本方法,能实现列表元素增加、查询、排序等常见操作;
(3)能结合应用问题选择合适的数据结构进行问题求解;
(4)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果)

二、实验内容

使用Python语言在Jupyter Notebook环境下编程完成下列题目的要求:

1、通过用户输入的身份证号,输出对应的出生日期‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬程序运行的效果如下:‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬

提示:可以使用字符串切片进行年月日信息的提取。

2、自幂数是指一个n位数 (n≥3),它的每个位上的数字的n次幂之和等于它本身。例如153就是一个自幂(当n=3时也称为水仙花数),因为153=1^3+5^3+3^3。请按下面的运行结果找出用户输入范围内的所有自幂数。

提示:可以考虑把整数转换成数值字符串,再按顺序分离出各个位置上的数字字符串,并转换成整数后进行计算。例如:判断整数1234是否是自幂数,可以把它转换成字符串”1234”然后通过for循环依次取出字符“1”、“2”、“3”和“4”,再分别转换成整数就可以快速得到原来整数1234各个位置上的数字了,这样再判断是否是自幂数就比较方便了。

3、对于给定的字符串"Where there is a will, there is a way. The important point is that you must have the will to achieve success.",请统计该字符串中不重复的单词数,并把这些单词按字母顺序降序排列,输出效果如下所示:

提示:考虑使用下列处理过程:
(1)用空格替换串中的英文逗号和句号,去除标点符号的影响;
(2)用字符串对象的split()方法提取出单词;
(3)把split()方法的结果转换为集合进行自动去重;
(4)而排序时则需要把去重后的集合转换为列表来实现。

4、请按照教材教材第83页实训2中表3-5给出的数据完成食物菜单的建立与查询。建议使用一个列表存储食品大类,另一个列表存储各类食物的详细菜单。程序运行结果可以参考如下图:

提示:本题主要涉及列表元素的增加与查询

三、主要程序清单和程序运行结果

第1题

1、通过用户输入的身份证号,输出对应的出生日期‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬程序运行的效果如下:‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬

提示:可以使用字符串切片进行年月日信息的提取。

id=input("请输入身份证号:")
year=id[6:10]
month=id[10:12]
day=id[12:14]
print("出生日期:{}年{}月{}日".format(id[6:10],id[10:12],id[12:14]))

第2题

2、自幂数是指一个n位数 (n≥3),它的每个位上的数字的n次幂之和等于它本身。例如153就是一个自幂(当n=3时也称为水仙花数),因为153=1^3+5^3+3^3。请按下面的运行结果找出用户输入范围内的所有自幂数。

提示:可以考虑把整数转换成数值字符串,再按顺序分离出各个位置上的数字字符串,并转换成整数后进行计算。例如:判断整数1234是否是自幂数,可以把它转换成字符串”1234”然后通过for循环依次取出字符“1”、“2”、“3”和“4”,再分别转换成整数就可以快速得到原来整数1234各个位置上的数字了,这样再判断是否是自幂数就比较方便了。

法一:for循环 

n = int(input("请输入10的n次幂(n>=3): "))  # 使用int来确保输入的安全性
end = 10 ** n
print(f"{end}以内的自幂数包括:")

for j in range(100, end):  # 直接使用end,end已经是10**n的结果
    number_str = str(j)
    length = len(number_str)
    sum_of_powers = sum(int(digit) ** length for digit in number_str)
    if sum_of_powers == j:
        print(j)

        直接在循环内部处理每个数字,而不是调用一个单独的函数来检查它是否是自幂数。这样做简化了代码的结构,但牺牲了一些可读性和重用性。对于这个特定的任务,由于逻辑相对简单,直接在循环中实现功能并不会造成太大的问题。
        这段代码遍历从100到10**n的所有数字,对每个数字转换为字符串,然后计算其每一位数字的n次幂之和。如果这个和等于原始的数字,就打印出这个数字,表示它是一个自幂数。

法二:定义函数

n = int(input("请输入10的n次幂(n>=3): "))  # 使用int来确保输入的安全性
end = 10 ** n
print(f"{end}以内的自幂数包括:")

def is_armstrong(number_str):
    length = len(number_str)
    sum_of_powers = sum(int(digit) ** length for digit in number_str)
    if sum_of_powers == int(number_str):
        print(sum_of_powers)

for j in range(100, end):  # 直接使用end,end已经是10**n的结果
    is_armstrong(str(j))

        这个代码保持了原有的逻辑结构,同时采用了一些更安全和更清晰的代码实践。注意,这里使用列表推导式来计算幂之和,使代码更加简洁。根据题目要求和自幂数的定义(n>=3),从100开始是合理的。

第3题

3、对于给定的字符串"Where there is a will, there is a way. The important point is that you must have the will to achieve success.",请统计该字符串中不重复的单词数,并把这些单词按字母顺序降序排列,输出效果如下所示:

提示:考虑使用下列处理过程:
(1)用空格替换串中的英文逗号和句号,去除标点符号的影响;
(2)用字符串对象的split()方法提取出单词;
(3)把split()方法的结果转换为集合进行自动去重;
(4)而排序时则需要把去重后的集合转换为列表来实现。

import re

s = "Where there is a will, there is a way. The important point is that you must have the will to achieve success."

a = s.replace('.',' ')
b = a.replace(',',' ')
words = b.split()
# 这里还可以使用正则表达式移除标点符号并分割单词
# words = re.findall(r'\b\w+\b', s)

# 转换成集合去除重复单词,然后计算不重复单词的数量
unique_words = set(words)
unique_count = len(unique_words)
print("字符串中不重复的单词数:", unique_count)

# 对不重复的单词列表进行降序排序
sorted_unique_words = sorted(unique_words, key=str.lower, reverse=True)  # key=str.lower确保排序时不区分大小写
print("这些单词降序排列的结果:{}".format(sorted_unique_words))

        在这个代码中,或者可以使用正则表达式re.findall(r'\b\w+\b', s)用于找到所有单词,其中\b表示单词边界,\w+匹配一个或多个字母数字字符。这样可以直接提取出所有单词,无需手动替换标点符号。
        注意,这里在排序时使用了key=str.lower参数,这是为了确保排序过程中不区分大小写,因为默认的字符串排序是区分大小写的,可能会导致所有大写字母开头的单词排在小写字母开头的单词之前。

第4题

4、请按照教材教材第83页实训2中表3-5给出的数据完成食物菜单的建立与查询。建议使用一个列表存储食品大类,另一个列表存储各类食物的详细菜单。程序运行结果可以参考如下图:

提示:本题主要涉及列表元素的增加与查询

#s1=['汉堡类','小食类','饮料类']
#s2=[['香辣鸡腿堡','劲脆鸡腿堡','新奥尔良烤鸡腿堡','半鸡半虾堡'],['薯条','黄金鸡块','香甜粟米棒'],['可口可乐','九珍果汁','经典咖啡']]
s1=[]
s2=[]
while(True):
    menu=input("请输入食品大类(输入q退出食品输入):")
    if menu=='q':
        break
        print()
    s1.append(menu)
    details=input("请输入{}的详细食物清单,多个食物直接用空格分开:".format(menu)).split()
    s2.append(details)
print()
print("当前的食品大类包括:",s1)
print("当前的详细食品菜单是:",s2)
print()

while True:
    try:
        operation=int(input("请输入要查询的食品大类(输入0则退出程序):"))
        if operation==0:
            print("感谢使用")
            break       
        print("{}食品的详细食物菜单是{}".format(s1[operation-1],s2[operation-1]))
    except ValueError:  # 处理非数字输入
        print("请输入有效的数字")
    except IndexError:  # 处理数字不在范围内的情况
        print("请输入有效的食品大类编号")

        用户可以输入食品大类和对应的详细食物清单,随后可以通过输入食品大类的编号查询具体的食物清单。这个程序是基于列表的索引来实现的。
        代码使用了try-except语句来处理可能出现的异常,例如用户输入的不是数字(ValueError)或者输入的数字超出了列表的范围(IndexError)。这样可以提高程序的健壮性,避免因为无效输入而崩溃。

四、实验结果分析与体会

        通过本次实验,掌握了字符串索引、切片和一些常用方法的使用,以及列表创建的基本方法,能实现列表元素增加、查询、排序等常见操作,能结合应用问题选择合适的数据结构进行问题求解。在使用字符串时,我们需要注意Unicode编码的特点,即中英文字符都是一个长度单位。同时,我们可以使用strip()方法去掉字符串首尾的空格或指定字符,使用split()方法根据指定字符分割字符串。此外,字符串还支持拼接运算符+、重复操作符*、in操作符等。
        列表是一种非常灵活的数据类型,可以存储各种类型的元素,并且支持增删改查等各种操作。我们可以使用append()方法向列表中添加元素,使用pop()方法删除元素,使用sort()方法排序等。此外,列表还支持切片操作、列表推导式等高级用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Francek Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值