Python 编程实训测验 基础篇 1. 从键盘输入两个数字,求这两个数字的最大公约数和最小公倍数。 import math a,b =map(int,input('输入 a,b 空格隔开:').split()) print('最大公约数',math.gcd(a,b)) x=a*b//math.gcd(a,b) print('最小公倍数',x) 2. 字符分类统计:从键盘输入一行字符串(字符串长度小于等于 1000),统计出 其中的英文字母、空格、数字和其它字符的个数。 str1= input('请输入字符串:') alpha=0 num=0 space=0 ch=0 for i in str1: if i.isalpha(): alpha+=1 elif i.isnumeric(): num+=1 elif i.isspace(): space+=1 else: ch +=1 print('数字',num,'英文字母',alpha,'空格',space,'字符',ch) 3. 求 s=a+aa+aaa+aaaa+….的值,其中,a 是 0~9 范围内的一个数字。输入 n 和 a,其中 n 表示累加的项数。例如,当 n=5,a=2 时, s=2+22+222+2222+22222。 a,n=map(int,input('输入 a,n 空格隔开:').split()) sum1=0 sum2=0 j=1 for i in range(1,n+1): sum1=sum1+a*j j*=10 sum2=sum2+sum1 print('sum=',sum2) 4. 利用随机函数产生 50 个 0-20 之间的随机整数,存放在序列中,再通过键盘 输入一个整数 key,查找 50 个随机整数中是否有 key 值,如果存在,则输出 他们所有的位置。 from random import randint x=[randint(0,20) for i in range(50)] list1=list(x) key=int(input()) print(list1) print('输出位置') for i in range(0,50): n=list1[i] if n==key: print(i,end=' ') 5. 回文数判断:设 n 是一任意自然数,如果 n 的各位数字反向排列所得自然数 与 n 相等,那么 n 就是一个回文数。从键盘输入一个数字,判断这个数字是 不是回文数。 str1=input() str2=str1[::-1] if (str1==str2): print('yes') else : print('no') 6. 输入一句英文英语,求其中最长的单词长度。 x=input().split() list1=list(x) max1=0 for i in list1: if max1<len(i): max1=len(i) print(max1)拓展篇 7. 判断[ k1,k2]之间有多少个素数(包含 k1 和 k2),并输出这些素数。 ( 1 <= k1 < k2 <= 1000 ) def prime(x): for i in range(2, x): if x % i == 0: return 2 #不是 return 1 #是 a,b=map(int,input('输入 a,b 空格隔开:').split()) for i in range(a,b+1): if (prime(i)==1): print(i) 8. 判断用户输入的变量名是否合法,要求如下: ①变量名可以由字母,数字或者下划线组成; ②变量名只能以字母或者下划线开头; 最后结果需要展示合法与不合法两种结果,另外实验截图时要求变量名中出现 自己名字的英文。 zhangjiaqi=input() if zhangjiaqi[0].isnumeric(): print('no') else: for i in zhangjiaqi: if i.isalpha() or i == '_': print('True') break else: print('False') 8. 为了加强居民的节水意识,某地区制定了以下生活用水收费标准:每户每月 用水未超过 7 吨时,每吨收费 1.0 元,并加收 0.2 元每吨的城市污水处理 费;用水若超过 7 吨(含 7 吨),则每吨收费 1.5 元,并加收 0.4 元每吨的 城市污水处理费(注:非分段计费)。编写一个水费计算函数,实现输入用 水量并计算应交水费的功能,并在主函数中调用验证。 def water(x): if (x<7): return x+0.2 elif (x>=7): return 1.5*x+0.4 x=int(input()) print(water(x)) 10. 编写代码实现快速排序,输入为自定义的一个列表,输出为经过排序后的 列表。 def mysort(list1): n=len(list1) for i in range(1,n): temp=list1[i] j=i-1 while (j>0 and list1[j]>temp): list1[j+1]=list1[j] j-=1 list1[j+1]=temp list1=list(input()) mysort(list1) print(list1) 11. 利用递归函数调用方式,输入自己的学号,以相反顺序打印出来。 def fun(list1,n): if (n==0): return 0; print(list1[n-1],end=' ') fun(list1,n-1) list1=input() n=len(list1) fun(list1,n) 12. 编写程序,产生 20 个 0-100 之间的随机整数,打印出来,并将奇数存储在 f1.txt 中,将偶数存储在 f2.txt 中。 from random import randint x=[randint(0,100) for i in range(20)] list1=list(x) list2=[] list3=[] for i in list1: if i%2!=0: list2.append(i) else : list3.append(i) str2=" ".join('%s' %id for id in list2) str3=" ".join('%s' %id for id in list3) with open('f1.txt', 'w') as fp: fp.write(str2) with open('f2.txt', 'w') as fp: fp.write(str3) 13. 创建文件 data.txt,文件共 1000 行,每行存放一个 1~100 之间的整数,写完 后读取文件内容。 import random with open('data.txt', 'w') as fp: for i in range(1,1001): n=random.randint(1,100) n=str(n) fp.write(n+"\n") with open('data.txt') as fp: print(fp.read()) 14. 输入一个二维嵌套列表,即矩阵,将其行和列互换(转置)后存放到另一个列 表中,并打印新的列表。例如:a=[[1,3,5],[2,4,6]],则转置后为 b=[[1,2], [3,4],[5,6]] a=[] x=int(input('矩阵有几行')) y=int(input('矩阵有几列')) for i in range(0,x): temp=[] for j in range(0,y): x=int(input('输入一个')) temp.append(x) a.append(temp) b=[] for i in range(0,x): temp=[] for j in range(0,y): temp.append(a[j][i]) b.append(temp) print(a) print(b) 15. 编写一个程序,接受一系列空格分隔的单词作为输入,并在删除所有重复 的单词并按字母数字排序后打印这些单词。 假设向程序提供以下输入: hello world and practice makes perfect and hello world again 则输出为: again and hello makes perfect practice world x=input().split() list1=list(x) list1.sort() for i in list1: if (list1.count(i)>1): list1.remove(i) print(list1) 16. 有一行电文,已经按下面的规律译成密码 A—>Z a—>z B—>Y b—>y C—>X c—>x 即把第一个字母变成第 26 个字母,第 i 个字母变成第(26-i+1)个字母,非字 母的字符保持不变。输入已经按上述方式加密的字符串电文(电文的长度不超 过 1000),要求输出其原文,其中可能有空格。 Sample Input R droo erhrg Xsrmz mvcg dvvp. Sample Output I will visit China next week. str1=input() for i in str1: if i.islower(): x=219-ord(i) print(chr(x),end='') elif i.isupper(): x=155-ord(i) print(chr(x),end='') else : print(i,end='') 17. 对于一个十进制的正整数, 定义 f(n)为其各位数字的平方和,如: f(13) = 1**2 + 3**2 = 10 f(207) = 2**2 + 0**2 + 7**2 = 53 下面给出三个正整数 k,a, b,你需要计算有多少个正整数 n 满足 a<=n<=b, 且 k*f(n)=n 范例:输入: 51 5000 10000,输出: 3 def f(n): s=str(n) sum1=0 for i in s: sum1=sum1+int(i)**2 return sum1 a,b,c=map(int,input().split()) coun=0 for i in range (b,c+1): if (a*f(i)==i): coun+=1 print(coun) 应用篇 18. 创建两个文件 cats.txt 和 dogs.txt,在第一个文件中至少存储三只猫的名 字,在第二个文件中至少存储三条狗的名字。编写一个程序,尝试读取这些文 件,并将其内容打印到屏幕上。将这些代码放在一个 try-except 代码块中,以 便在文件不存在时捕获 FileNotFound 错误,并打印一条反馈消息。 filename=input() try: with open(filename) as fp: content = fp.read() print(content) fp.close() except FileNotFoundError: print('cant find',filename) 19. 编写函数, 接收一个列表(包含 15 个整数)和一个整数 k, 返回一个新列表。 函数需求: - 将列表下标 k 之前对应(不包含 k)的元素逆序; - 将下标 k 及之后的元素逆序; - 若 k 不合理,则返回 ’error key’; 在主函数中调用并验证编写的函数,将新列表打印。 def f(list1,x): if (k<0 and k>15): print('wrong') a=[] b=[] a=list1[:k][::-1] b=list1[k:][::-1] print(a,'and',b) k=int(input('输入 k')) list1=map(int,input('输入 list').split()) list1=list(list1) f(list1,k) k=int(input('输入 k')) list1=map(int,input('输入 list').split()) print(list1) 20. 二千多年前希腊的天文学家希巴克斯命名十二星座,它们是水瓶座、 双鱼座、白羊座、金牛座、双子座、巨蟹座、狮子座、处女座、天秤座、天蝎 座、射手座、魔蜗座。给出一个 CSV 文件(SunSign.csv),内容示例如下: 序号,星座,开始月日,结束月日, Unicode 1,水瓶座,120,218,9810 2,双鱼座,219,320,9811 3,白羊座,321,419,9800 4,金牛座,420,520,9801 5,双子座,521,621,9802 …(略) 以第 1 行为例,120 表示 1 月 20 日,218 表示 2 月 18 日, 9810 是 Unicode 码。 (1) 编写代码,读入 CSV 文件中数据,获得用户输入。根据用户输入的星 座名称,输出此星座的出生日期范围。 参考输入和输出示例格式如下: 请输入星座中文名称(例如,双子座):双子座 双子座的生日位于 521-621 之间 (2) 编写代码,读入 CSV 文件中数据,获得用户输入。用户键盘输入一组 范围是 1-12 的整数作为序号,序号间采用空格分隔,以回车结束。屏幕输出这 些序号对应的星座的名称、字符编码以及出生日期范围,每个星座的信息、一 行。本次屏幕显示完成后,重新回到输入序号的状态。 参考输入和输出示例格式如下: 请输入星座序号(例如,5):5 10 双子座(9802)的生日是 5 月 21 日至 6 月 21 日之间 天蝎座(9807)的生日是 10 月 24 日至 11 月 22 日之间 请输入星座序号(例如,5 ) : (3) 在问题(2)的基础上,修改代码,对键盘输入的每个序号做合法性处理。 如果输入的数字不不合法,请输出”输入星座编号有误!",继续输出后续信 息,然后重新回到输入序号的状态。