HNU计概课实训题代码日记(20230329)

又是适合被Python虐的一天~建议在开始前先学习一遍各种关于列表函数的使用方法。

关于列表的相关知识

函数用法
list.append()在列表末尾添加括号中的元素
list.insert(index,obj)在列表索引为index处插入obj
list[index]=obj将列表索引为index的元素替换为obj
del list[index]删除列表中索引为index的元素

deleted_obj=list.pop(index)

删除列表中索引为index的元素,同时将该元素返回
list.remove(obj)删除列表中的obj元素
list.sort()或list.sort(reverse=False)升序排序
list.sort(reverse=True)降序排序
range(lower,upper,step)生成系列整数
slice=list[start:end:step]生成对列表的切片

实验2.5.1 Python基础-列表

第1关:列表元素的增删改:客人名单的变化

编程要求

本关的编程任务是补全src/Step1/guests.py文件的代码,实现相应的功能。具体要求如下:

  • step 1:将guests列表末尾的元素删除,并将这个被删除的元素值保存到deleted_guest变量;

  • step 2:将deleted_guest插入到 step 1 删除后的guests列表索引位置为2的地方;

  • step 3:将 step 2 处理后的guests列表索引位置为1的元素删除;

  • 打印输出 step 1 的deleted_guest变量;

  • 打印输出 step 3 改变后的guests列表。

这关任务比较复杂,好在页面左侧已经对需要用到的函数做了比较详细的介绍。把上面表格中的函数记牢之后很容易写出来。

# coding=utf-8
# 创建并初始化Guests列表
guests = []
while True:
    try:
        guest = input()
        guests.append(guest)
    except:
        break    
# 请在此添加代码,对guests列表进行插入、删除等操作
########## Begin ##########
deleted_guest=[] #建立一个新的列表来储存原列表中被删除的元素
deleted_guest=guests.pop(-1)
guests.insert(2,deleted_guest)
guests.pop(1)
print(deleted_guest)
print(guests)  
########## End ##########

第2关:列表元素的排序:给客人排序

编程要求

本关的编程任务是补全src/step2/sortTest.py 文件中的函数部分,要求实现对输入列表source_list中的元素按照首字母从小到大的顺序进行排序,并且输出排序后的列表。

这关非常简单,自己只需要写两行代码。

# coding=utf-8
# 创建并初始化`source_list`列表
source_list = []
while True:
    try:
        list_element = input()
        source_list.append(list_element)
    except:
        break 
# 请在此添加代码,对source_list列表进行排序等操作并打印输出排序后的列表
########## Begin ##########
source_list.sort()
print(source_list)
########## End ##########

第3关:数值列表:用数字说话

编程任务是补全src/Step3/numbers_square.py文件的代码内容,实现如下功能:

  • step1:根据给定的下限数lower, 上限数upper以及步长step,利用range函数生成一个列表;

  • step2:计算该列表的长度;

  • step3:求该列表中的最大元素与最小元素之差。

这关也很简单。

# coding=utf-8
# 创建并读入range函数的相应参数
lower = int(input())
upper = int(input())
step = int(input())
# 请在此添加代码,实现编程要求
########## Begin ##########
list1= list(range(lower,upper,step))
print(len(list1))
print(max(list1) - min(list1))
########## End ##########

第4关:列表切片:你的菜单和我的菜单

编程要求

本关的编程任务是补全src/Step4/foods.py文件的代码内容,实现如下功能:

  • 利用切片方法从my_menu列表中每3个元素取1个,组成子序列并打印输出;

  • 利用切片方法获取my_menu列表的最后三个元素组成子序列并打印输出。

仍然是掌握函数用法就很简单的一关。

# coding=utf-8
# 创建并初始化my_menu列表
my_menu = []
while True:
    try:
        food = input()
        my_menu.append(food)
    except:
        break
# 请在此添加代码,对my_menu列表进行切片操作
########## Begin ##########
menu1=my_menu[::3]
print(menu1)
menu2=my_menu[-3:]
print(menu2)
########## End ##########

第5关:列表遍历:不重复客人名单

编程要求

根据提示,在右侧编辑器补充代码,在一份有重复名字的客人名单中选取非重复名字,建立新客人名单并输出。

没啥新东西,就是for_in循环与列表的结合。

# coding=utf-8
# 创建并初始化Guests列表
guests = eval(input())
# 请在此添加代码,对guests列表去重,产生并输出非重复名单列表
########## Begin ##########
a=[]
for b in guests:
    if b not in a:
        a.append(b)
print(a)
########## End ##########

第6关:列表修改:vip名单

根据提示,在右侧编辑器补充代码,在一份客人名单中指定非vip姓氏,将名单中指定姓氏的名字前加上‘vip:’字样并输出修改后的列表。

也是通过循环来解决的题,难度比上一关稍有提升。

# coding=utf-8
# 创建并初始化Guests列表
guests = eval(input())
#  指定vip姓氏
vipxs=input()
# 请在此添加代码,对客人列表中指定姓氏的名字进行修改,并输出修改后的名单
########## Begin ##########
for i in guests:
    a=str(i)
    if vipxs in a:
        n=guests.index(i)
        guests[n]='vip:'+guests[n]
print(guests)
########## End ##########

第7关:列表综合:菜单价格统计

编程要求

根据提示,在右侧编辑器补充代码,在一份输入的菜单价格列表中找出最高菜价、最低菜价,并计算平均菜价和菜价的标准差,按指定格式输出上述统计值。

标准差计算公式是每个值与平均数差的平方和除以个数再开根。我们利用列表循环来求出每个值与平均数差的平方和,剩下的就很简单了。

# coding=utf-8
# 创建并初始化Guests列表
menu_price = eval(input())
# 请在此添加代码,对菜价列表进行统计,输出最高价,最低价,平均价
########## Begin ##########
a=max(menu_price)
b=min(menu_price)
c=sum(menu_price) / len(menu_price)
d=0
for i in menu_price:
    d+=(i-c)**2
e=(d/len(menu_price))**0.5
print("最高价:{:.2f},最低价:{:.2f},平均价:{:.2f},标准差:{:.2f}".format(a,b,c,e))
########## End ##########

实验2.5.3 列表与字符串进阶

第1关:字符串基本操作

任务1 字符串拼接 依次输入两个字符串赋值给s1s2,并将s1中所有英文字母转换为大写后连接到s2后面,并将拼接的结果赋值给s3,输出s3的值。 提示:应用“+”运算和字符串的upper()方法。

任务2 根据字符串的长度确定字符串输出重复次数 输入一个字符串赋值给s4,根据s4的长度来确定将s3重复多少次,重复运算结果赋值给s5,并输出s5的值。例如:输入“A1”, 如果s3的值是123XTU,则输出123XTU123XTU提示:求字符串的长度用内置函数len(),重复运算用“*”

任务3 访问字符串以及子字符串 输入一个长度为2字符串赋值s6,判定s6s5的第2至第11个字符(包含第11个字符)之间首次出现的位置与出现次数,若s5的长度小于10,则表示从第2个字符到字符串末尾的子串。例如:输入“XT”,若s5的值是123XTU123XTU,则输出“2 2”,第2个到第11字符的子串是23XTU123XT:表示:“XT”在子串“23XTU123XT”中首次出现的起始位置是2,总共出现了2次。 提示:本任务中需要用到字符串的切片运算:[m:n],出现位置与次数分别使用序列类型的共有方法:index()count()

任务4 字符串的替换 输入一个字符串赋值给s8,将s5中所有的数字符号"2"替换成存储在s8中的字符串,并将替换结果赋值给s9,输出s9的值。例如:输入一个字符串“TO”s5123XTU123XTU,则输出替换后的结果为:1TO3XTU1TO3XTU提示:本任务中需要用到字符串的方法:replace()

任务5 字符串反转 将任务4中替换结果s9反转,输出s9反转后的值。例如:s9中存储的是:1TO3XTU1TO3XTU,则输出的反转结果是:UTX3OT1UTX3OT1 提示:本任务中需要用到字符串的切片运算:[::-1]

第一关就分了五个小任务,不过还好都有提示,只要找到对应函数的正确用法就行了。

#字符串基本操作

#任务1代码
s1=input()
s2=input()
#Begin 填写“=”右侧表达式
s3=s2+s1.upper()
#End
print(s3)

#任务2代码
s4=input()
#Begin 填写“=”右侧表达式
s5=s3*len(s4)
#End
print(s5)

#任务3代码
s6=input()
#Begin 在Begin和End间填写代码
print(s5[1:11].index(s6),s5[1:11].count(s6))    
#End

#任务4代码
s8=input()
#Begin 填写“=”右侧表达式
s9=s5.replace("2",s8)
#End
print(s9)

#任务5代码
#Begin  在Begin和End间填写代码
print(s9[::-1])
#End

第2关:列表基本操作

任务1 建立列表 输入一个表示姓名的字符串,建立一个只含有此字符串的列表lt1,并输出lt1的值,例如,输入字符串为“李海”,则输出[“李海”]

任务2 加入元素 输入3个整数,分别代表数学,语文,英语的分数,生成列表lt2,将列表lt2加到lt1后面,输出更新后的lt1。例如,输入的整数为:90 79 100,表示对应课程的分数,则输出:[“李海”,90,79,100] 提示:可以使用append(),extend(),insert()“+”运算,但是要注意他们的差别

任务3 插入元素 从键盘输入一个数字字符串,并在列表lt1的起始位置插入这个数字字符串,代表学号,输出lt1的值。例如:输入:“201705090345”,输出lt1的值为:[“201705090345”,“李海”,90,79,100] 提示:可以使用insert()在首元素前面进行插入。

任务4 列表的删除 找出列表lt1中的最小的元素,在列表lt1中删去此元素,删除后,再输出lt1的值 提示:使用内置min()函数求出lt1中元素的最小值,用列表的方法remove()pop()来移除此元素。也可以用内置函数del()来删除指定位置的元素。注意参数:remove()的参数是要删除的具体元素,而del()pop() 的圆括号中要填写整数,表示要删除的元素的索引号。

任务5 列表的反转与排序lt2列表中的元素按从小到大的顺序排列输出,再将lt1复制给lt3,将lt3反转输出。例如:lt2的值是[90,79,100],则从小到大输出为[79,90,100]lt3反转的结果为[100,90,“李海”,“201705090345”] 提示:本任务使用列表的方法有:copy()sort()reverse()

这关与上一关类似,题目中都给出了相应的函数。

#列表基本操作

#任务1代码
s1=input()
#Begin 
lt1=[s1]
#End
print(lt1)

#任务2 在begin和end间空白处填写代码
a=int(input())
b=int(input())
c=int(input())
#begin
lt2=[a,b,c]
lt1=lt1+lt2
#end
print(lt1)

#任务3 在begin和end间空白处填写代码
id=input()
#begin
lt1.insert(0,id)
#end
print(lt1)

#任务4 在begin和end间空白处填写代码
#begin
a=min(lt2)
lt1.remove(a)
print(lt1)
#end

#任务5 在begin和end间空白处填写代码
#begin
lt3=lt1.copy()
lt2.sort()
lt3.reverse()
print(lt2)
print(lt3)
#end


第3关:列表推导式

某轰炸机在ℎ(m)高空以v_0(m/s)的速度水平匀速飞行,到达A点时投下一枚无动力炸弹,不考虑空气阻力,在时间点t的纵坐标为 x=v0t,横坐标为y=h-1/2g*t**2;请生成等分时间点序列(如1s)对应的炸弹横坐标和纵坐标的列表xt,yt并输出。(g=9.8m/s^2)。 请基于列表推导式的方式编写代码。

教材上(好像)有这道题,页面左边会把提示喂到嘴边,直接照着提示把代码填上去就行了。

from math import *
h=eval(input())#初始高度
v0=eval(input())#初始速度
g=9.8
delta=1 #delta为两点间时间间隔
tmax=sqrt(2*h/g)#炸弹落地时间
T=[ i*delta for i in 
      range(int(tmax/delta)+1) ]#生成时间点列表
################begin################
xt=[v0*j for j in T]
yt=[h-(0.5*g)*l**2 for l in T]
################end################
for x in xt:
    print('%.2f'%x)
for y in yt:
    print('%.2f'%y)


第4关:列表综合运用

任务1 字符串转换成列表和元组 输入一个含有空格的字符串赋值给ss1,分别将其转换成列表和元组并依次输出。例如:输入:“My computer”,输出:

  • ['M', 'y', ' ', 'c', 'o', 'm', 'p', 'u', 't', 'e', 'r']
  • ('M', 'y', ' ', 'c', 'o', 'm', 'p', 'u', 't', 'e', 'r')-
  • *提示:**使用list()tuple()函数

任务2 字符串分割 将字符串ss1以空格作为分离符号,将其分割为多个元素的列表赋值给ss2。例如“My computer”分割为列表输出是:["My","computer"]提示:使用字符串的split()方法

任务3 将列表合并成字符串 首先将ss2通过*运算,重复3次,赋值给ss3,然后用“-”将各元素合成为一个字符串。例如,ss2重复3次后,ss3中元素为:["My","computer","My","computer","My","computer"],用“-”作为连接符进行连接后的输出为:"My-computer-My-computer-My-computer" 提示:使用字符串的join()方法

这关竟然要用到元组tuple(),要知道这玩意还没学。不过好在几乎没有影响,就这关而言直接当成列表来做就行了。

#综合运用
#任务1 在begin和end间空白处填写代码
#begin
ss1=input()
ss2=list(ss1)
ss3=tuple(ss2)
print(ss2)
print(ss3)
#end

#任务2 在begin和end间空白处填写代码
#begin
ss4=ss1.split()
print(ss4)
#end

第5关:字符串综合运用

信用卡号是否合法的判断规则为: a) 对给定的8位信用卡号码,如43589795,从最右边数字开始,隔一位取一个数相加,如5+7+8+3=23。 b) 将卡号中未出现在第一步中的每个数字乘2,然后将相乘的结果的每位数字相加。例如,对上述例子,未出现在第一步中的数字乘2后分别为(从右至左)18、18、10、8,则将所有数字相加为1+8+1+8+1+0+8=27。 c) 将上述两步得到的数字相加,如果得数个位为0,则输入的信用卡号是有效的。

请在指定位置完成函数的编写,判断用户输入的8位信用卡号码是否合法。

看上去很复杂,那我们一步一步来。先把num放进列表a。

“从最右边数字开始,隔一位取一个数相加”,先把列表a反转,这样就可以从最左边开始了。将每一个符合要求的数放入一个新的列表中,然后把列表中的元素转换成整数并求和。

a=[num]
b=[]
c=[]
a.reverse()
for i in range(0,len(a),2):
    b.append(a[i])
for j in b:
    j=int(j)
    c.append(j)
d=sum(c)

第二步将卡号未出现在第一步中的数字分别乘以2,再将各位数字相加。这次我们只需从第二个数开始重复上面的取数字步骤就可以取得第一步中未出现的数字。

然后将这些数字分别转化成整数形式并乘上2,放入新列表f里。利用//10和%10来表示出十位和个位数字。

e=[]
f=[]
k=[]
for i in range(1,len(a),2):
    e.append(a[i])
for j in e:
    j=int(j)
    j=j*2
    f.append(j)
for i in f:
    g=i//10
    h=i%10
    k.append(g)
    k.append(h)
m=sum(k)

最后两个数字相加并取个位数再判断就行了。完整代码如下:


num=int(input())
#请在下面编写代码
# ********** Begin ********** #
a=[num]
b=[]
c=[]
a.reverse()
for i in range(0,len(a),2):
    b.append(a[i])
for j in b:
    j=int(j)
    c.append(j)
d=sum(c)

e=[]
f=[]
k=[]
for i in range(1,len(a),2):
    e.append(a[i])
for j in e:
    j=int(j)
    j=j*2
    f.append(j)
for i in f:
    g=i//10
    h=i%10
    k.append(g)
    k.append(h)
m=sum(k)

n=d+m
if n%10=='0':
    vaild="True"
else:
    valid="False"
# ********** End ********** #    
    #请不要修改下面的代码
print(valid)

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值