Python的练习题(归纳)

Python
函数题:(def)
1、 水仙花数:
水仙数的统计1
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。 例如:153=1×1×1+5×5×5+3×3×3。
本题要求编写程序,计算所有N位水仙花数的个数与和。

def sxh(n):
    num=0
    s=0
    for i in range(10**(n-1),10**n):
        sum=0
        for j in range(0,n):
            a=i//pow(10,j)%10
            sum+=pow(a,n)
        if(sum==i):
          num+=1
          s+=sum
return num,s

2、 黑洞数:
本题要求实现一个函数,判断某整数是否是黑洞数,如果是,返回True,否则返回False。黑洞数指的是,若某整数各个位上的数字组成的最大数减去各个位上数字组成的最小数等于该数本身,则称该数为黑洞数。比如495=954-459。

def isHd(n):
    a = str(n)
    max=""
    min=""
    for tt in sorted(a, reverse=True):
        max += str(tt)
    for tt in sorted(a):
        min += str(tt)
    if int(max)-int(min) == n:
        return True
    else:
        return False

1、计算统计值类 (15分)
在python中statistics模块实现常用的统计公式,允许使用python的各种数值类型(int,float,Decimal和Fraction)来完成高效计算。 本题为了加强同学们对列表、类设计,不采用直接调用statistics模块相应方法来完成输入一组数据的基本统计值统计值。

from math import *
class CalStatisticsValue:
    def __init__(self):
        self.Datas=[]
        self.Mean=0.0
        self.Dev=0.0
        self.Median=0
        
    def GetData(self):
        s=input()
        self.Datas=list(eval(s))
        

    def CauMean(self):
        self.Mean=0.0
        for i in self.Datas:
            self.Mean+=i
        self.Mean=self.Mean/(len(self.Datas))
        return self.Mean

    def CauDev(self):
        self.Dev=0.0
        for i in self.Datas:
            self.Dev+=(i-self.CauMean())**2
        self.Dev=sqrt(self.Dev/(len(self.Datas)-1))
        return self.Dev

    def CauMedian(self):
        self.Datas.sort()
        self.Median=len(self.Datas)
        if(self.Median % 2 ==0):
            self.Median=(self.Datas[self.Median//2-1]+self.Datas[self.Median//2])/2
        else:
            self.Median=self.Datas[self.Median//2]
        return self.Median



2、学生成绩统计分析 (15分)
在python中statistics模块实现常用的统计公式,允许使用python的各种数值类型(int,float,Decimal和Fraction)来完成高效计算。 本题为了加强同学们对列表、类设计,不采用直接调用statistics模块相应方法来完成输入一组数据的基本统计值。
class CourseScore:
    def __init__(self,Name):
        self.Name=Name
        self.Scorelist=[]

    def InputScore(self):
        self.Scorelist=list(map(eval,input().split(",")))

    def GetAverage(self):
        average=0
        for i in self.Scorelist:
            average+=i
        average=average/len(self.Scorelist)
        return average

    def GetStatistics(self):
        dic=['满分','优秀','良好','中等','及格','不及格']
        num=[0]*6
        for i in self.Scorelist:
            if i<60:
                num[5]+=1
            elif i>100 or i<0:
                continue
            else:
                num[10-i//10]+=1
        return dict(zip(dic,num))
            
    def Show(self):
        print("课程:{}".format(self.Name))        #输出课程名
        print("共有{}人参加考试".format(len(self.Scorelist)))   #输出参加考试的学生人数
        print("最高分:{},最低高分:{}".format(max(self.Scorelist),min(self.Scorelist)))                                                                                     #:---请补充---输出最高最高分与最低高分
        print("平均分:{:.2f}".format(self.GetAverage())) #输出平均分
        print(self.GetStatistics())   #输出统计的字典

编程题(4题):
1、7-3 统计单词数-应用 (10分)
在需要统计若干段文字(英文)中的单词数量,并且还需统计每个单词出现的次数。 注1:单词之间以空格(1个或多个空格)为间隔。 注2:忽略空行或者空格行。
要求:
统计前,需要从文字中删除指定标点符号!.,😗?#和0至9的数字。 注意:所谓的删除,就是用1个空格替换掉相应字符。 统计单词时需要忽略单词的大小写。 单词个数为0时。只需显示“0”。
输入格式:
若干行英文,最后以%%%为结束。。
#统计单词数
#根据单词数量 出现次数排名前6的单词

words=""
while True:
    a=input()
    if a=="%%%":
        break
    a=a.lower()
    for i in "!.,:*?,#,0,1,2,3,4,5,6,7,8,9":
        a=a.replace(i,' ')
    words=words+" "+a
words=words.split()
s={}
for i in words:
    if i in s:
        s[i]+=1
    else:
        s[i]=1
s=list(s.items())

s.sort(key=lambda x:x[0])
s.sort(key=lambda x:x[1],reverse=True)
print(len(s))
for i in range(6):
    word,count=s[i]
print("{}={}".format(word,count))

2、7-4 集合应用2 (10分 必考)
输入a,b班的名单,并进行如下统计。
输入格式:
第1行::a班名单,一串字符串,每个字符代表一个学生,1个或多个空格分隔,可能有重复字符。数字代表男生,字母代表女生。
第2行::b班名单,一串字符串,每个字符代表一个学生,1个或多个空格分隔,可能有重复学生。数字代表男生,字母代表女生。
第3行::参加数学竞赛的学生,一串字符串,每个学生名称以1个或多个空格分隔。

a = input()
seta = set(a.split())    
b = input()
setb = set(b.split())  
join_math = input() 
setjoin_math = set(join_math.split())
join_it = input() 
setjoin_it = set(join_it.split())
total = seta.union(setb)
male=[]
female=[]
for i in total:
    if ord(i)>=48 and ord(i)<58:
        male.append(i)
    elif (ord(i)>=65 and ord(i)<=90) or (ord(i)>=97 and ord(i)<=122):
        female.append(i)
female1=set(female)
race_total = setjoin_it.union(join_math) 
math_jsj = setjoin_math.intersection(setjoin_it)
onlymath = setjoin_math.difference(setjoin_it)  
jsj_female=female1.intersection(race_total)
x1=sorted(seta.union(setb))

x1_1=[list(map(str,i)) for i in x1]
print("Total: %s%c%s%d"%(x1,',',' num: ',len(x1)))
x2=sorted(math_jsj)
print("Math and jsj: %s%c%s%d"%(x2,',',' num: ',len(x2)))
x3=sorted(jsj_female)
print("FeMale in race: %s%c%s%d"%(x3,',', ' num: ',len(x3)))
print("Only Math:",sorted(onlymath))

3、7-5 求解字符串数字组合 (15分)
Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数,其中combinations, permutations是用求解组合和排列的函数。 请输入一个有由数字大小写字母组成的字符串 与 一个整数 n,去掉字符串中大小字母仅保留数字的字符串,输出去重后数字符串的n位全组合。

from itertools import combinations

a = input()
b = []
e = []
c = set()
d = ""
t = 0
for i in a:
    if i.isdigit():
        b.append(eval(i))
for i in b:
    c.add(i)
n = eval(input())
if n <= len(c):
    for i in combinations(c,n):
        i = list(i)
        i.sort(reverse=True)
        while t < len(i):
            d = d + str(i[t])
            t = t+1
        e.append(eval(d))
        t = 0
        d = ""
    e.sort(reverse=True)
    for i in e:
         print(i)
4、7-4判断身份证号码与出生日期(题目1)
中国的居民身份证有18位。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 也可以说前17位是信息码,最后1位是校验码。每位信息码可以是0-9的数字,而校验码可以是0-9或X,其中X表示10。 (本题中不考虑 六位数字地址码 有意义;一位数字校验码是否按公安部按相应算法得出的有意义校验码只判断是由是数字或字母X)
import re

card = input("")
id_card = str(card)

if  len(card) != 18:
    print("Error,长度必须是18位")
    exit()

if not(card[:17].isdigit()):
    print("Error,前17位信息码必须是数字")
    exit()
x = card[-1:]
if (ord(x) >= 48 and ord(x) <= 57 or x == 'X' or x == 'x'):
    WJ = 0
else:
    print("Error,校验码只能是数字或X")
    exit()

if len(id_card) == 18:
    # 出生日期的合法性检查
    if int(id_card[6:10]) % 4 == 0 or (int(id_card[6:10]) % 100 == 0 and int(id_card[6:10]) % 4 == 0):
        e_reg = re.compile(
            '[1-9][0-9]{5}(19[0-9]{2}|20[0-9]{2})((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)'
            '(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$')
    else:
        
        e_reg = re.compile(
            '[1-9][0-9]{5}(19[0-9]{2}|20[0-9]{2})((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)'
            '(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$')

    if re.match(e_reg, id_card):
        print(id_card[6:10] + "年" + id_card[10:12] + "月" + id_card[12:14] + "日")

    else:
        print("Error,日期不合法")

# 18位身份号码检测

#身份证校验
idcard=list(map(int,input().split(" ")))
s=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
s1=['1','0','10','9','8','7','6','5','4','3','2']
count=0
for i in range(17):
	count+=idcard[i]*s[i]
count=count%11
print(s1[count])


身份证号判断性别与出生日期
import time
def is_date(str_date):
    try:
        time.strptime(str_date, "%Y%m%d")
        return True
    except:
        return False
S=input()
if len(S)==18:
    Date =S[6:14]
    x=S[-2]
elif len(S)==15:
    Date ='19'+S[6:12]
    x=S[-1]

if not is_date(Date):
    print("Error,日期不合法")
else:
    if eval(x)%2==0:
        print('女',end=',')
    else:
        print('男',end=',')
    print(Date[:4]+"年"+Date[4:6]+"月"+Date[6:]+"日")

5、Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数,
其中combinations, permutations是用求解组合和排列的函数。 请输入
一个有由数字大小写字母组成的字符串 与 一个整数 n,去掉字符串中大
小字母仅保留数字的字符串,输出去重后数字符串的n位全组合。
from itertools import combinations
a=input()
b=[]
e=[]
c=set()
d=""
t=0
for i in a:
    if i.isdigit():
        b.append(eval(i))
for i in b:
    c.add(i)
n=eval(input())
if n<=len(c):
   for i in combinations(c,n):
        i=list(i)
        i.sort(reverse=True)
        while t<len(i):
           d+=str(i[t])
           t+=1
        e.append(eval(d))
        t=0
        d=""
e.sort(reverse=True)
for i in e:
    print(i)

输入圆半径计算圆周长、圆面积、圆球表面积,结果保留3位小数。 
注意:输入的半径可能是整数,也可能是小数
from math import *
r=eval(input())
C=2*pi*r
S=pi*(r**2)
Sr=4*pi*(r**2)
print("%.3f"%C)
print("%.3f"%S)
print("%.3f"%Sr)


#生日悖论
import random
x,n=map(int,input().split(" "))
count=0
random.seed(x)
for i in range(n):
    birthday=[]
    for j in range(23):
        birthday.append(random.randint(1,365))
    if(len(set(birthday))<len(birthday)):
        count+=1
rate=float(count)/n
print("rate=%.2f"%rate)
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值