Python练习题及答案
1.编写一个程序,找到2000年至3200年(包括在内)中所有可被7整除但不能被5整除的所有数字,得到的数字按逗号分隔,打印在一行上。
Lista =[]
for i in range(2000,3201):
if(i%7) and (i%5 !=0):
print(i)
Lista.append(str(i))
print(','.join(Lista)) #将数组中的元素连接成一行
2.编写一个可以计算给定数阶乘的程序,结果以逗号分隔,打印在一行上。
from functools import reduce
from math import factorial
#Way1:普通for循环
a = int(input('please input a integer:'))
num = 1
if a <0:
print('负数没有阶乘!')
elif a ==0:
print('0的阶乘为1!')
else:
for i in range(1,a+1):
num *=i
print(num)
#Way2:使用递归来计算
def num(n):
if n ==0:
return 1
else:
return n * num(n-1)
print(num(6))
#Way3:reduce函数
#从functools中调用reduce()函数
num = reduce(lambda x,y:x*y,range(1,7))
print(num)
#Way4:factorial()函数
num = factorial(6)
print(num)
3.使用给定的整数n,编写程序生成一个包含(i,ixi)的字典,该字典包含从1到n之间的整数(两者都包含),然后打印字典。假设向程序提供以下输入:8,
则输出为{1:1,2:4,3:9,4:16,5:25,6:36,7:49,8:64}
print(a)
d = dict() #定义一个字典
for i in range(1,a+1):
d[i] = i*i
print(d)
4.编写一个程序,该程序接受控制台以逗号分隔的数字序列,并生成包含每个数字的列表和元组,假设,向程序提供以下输入:34岁,67岁,55岁,33岁,12日,98年;则输出为:
['34, '67','55','33','12','98'] ('34, '67','55','33','12','98')
import re
#请输入一组数字
a = input('请输入一组数字:') #34岁,67岁,55岁,33岁,12日,98年
List1 = a.split(',')
k = re.findall(r'[0-9]+',a) #findall()需导入re包
Tuple1 = tuple(k)
print(List1)
print(Tuple1)
5.定义一个至少有两个方法的类:以、getString:从控制台输入获取字符串;二、printString:打印大写字母的字符串,并写出简单的测试函数来测试类方法。
class IOString(object):
# def __int__(self):
# self.s = ""
def getString(self):
self.s = input('请输入字符串:') #欢迎来学习Python,期待早日成功
def printString(self):
print(self.s.upper())
strObj = IOString()
strObj.getString()
strObj.printString()
6.编写一个程序,根据给定的公式计算并打印值:Q=[(2*C*D)/H]的平方根,其中,假设C=50,H=30,D是一个变量,它的值应该以逗号分隔的序列输入到程序中。
例:程序的输入序列为(以逗号分隔):100,150,180;则程序输出为:18,22,24;
import math
C = 50
H = 30
#Q = math.sqrt[(2 * C * D) / H]
Value = []
print('please input numbers:')
items = [x for x in input().split(',')]
for D in items:
Value.append(str(int(round(math.sqrt(2*C*float(D)/H)))))
print(','.join(Value))
7.编写一个程序,X,Y作为输入,生成一个二维数组,数组的第i行和第j列的元素应该为ixj.
print('请输入两个数字')
input_str = input()
dimensions = [int(x) for x in input_str.split(',')]
rowNum = dimensions[0]
colNUM = dimensions[1]
multilist = [[0 for col in range(colNUM)] for row in range(rowNum)]
for row in range(rowNum):
for col in range(colNUM):
multilist[row][col] =row*col
print(multilist)
8.编写一个程序,以逗号分隔的单词序列作为输入,按照字母顺序对每个单词进行排序,并通过逗号分隔的序列来打印单词。
假设向程序输入:without,hello,bag,world;则输出为:bag,hello,without,world;
print('请输入单词序列:')
# input_str =input()
items = [x for x in input().split(',')]
items.sort()
print(','.join(items))
9.编写一个程序,接收一行序列作为输入,并将句子中的所有字符大写后打印行。
print('请输入字符序列:')
input_str = input()
items = [x for x in input_str.split(',')]
for i in items:
print(i.upper())
10.编写一个程序,以一系列空格分隔的单词作为输入,并在删除所有重复的单词后,按字母顺序排序后打印这些单词。假设向程序输入:
hello world and practice makes perfect and hello world again,则输出为:again and hello makes perfect practice world.
import numpy as np
# Way1
print('请输入一系列空格分隔的单词序列:')
InputStr = input()
items = [x for x in InputStr.split(' ')]
print(' '.join(sorted(list(set(items))))) #用set删除重复的数据
# Way2 用numpy中的函数unique()
print('请输入一系列空格分隔的单词序列:')
InputStr = input()
items = [x for x in InputStr.split(' ')]
print(' '.join(np.unique(list(items)))) #unique()函数有自动排序功能?
11.编写一个程序,接收一系列以逗号分隔的4位二进制数作为输入,然后检查它们是否可被5整除,可被5整除的数字将以逗号分隔的顺序打印。
from numpy import intp
# 一系列以逗号分隔的4位二进制数
# Way1
Value =[]
print('一系列以逗号分隔的4位二进制数:')
# InputStr = input()
Items = [x for x in input().split(',')]
for i in Items:
intp= int(i,2)
if not intp%5:
#if i%5 == 0:
Value.append(i)
print(','.join(Value)) #问题出在哪里呢 0100,1011,1000,1010
# Way2
# print(','.join([_ for _ in input('输入一组二制数:').split(',') if int(_,2)%5==0])) #0100,1011,1000,1010
12.编写一个程序,找到1000到3000之间并且所有位数均为偶数的所有数字,比如2000,2002等;获得的数字都以逗号分隔的顺序,打印在一行上。
# Way1
# ListEven = []
# for i in range(1000,3001):
# s = str(i)
# if(int(s[0])%2==0) and (int(s[1])%2==0) and (int(s[2])%2==0) and (int(s[3])%2==0):
# ListEven.append(s)
# print(','.join(ListEven)) #如何实现打印自动换行
# Way2
print([i for i in range(1000, 3001) if all([int(_) % 2 == 0 for _ in str(i)])])
13.问题:编写一个接受句子并计算字母和数字的程序。假设程序输入:Hello world! 123,则输出应该是:字母10 数字3
# Way1
# print('请输入句子:') #Hello world! 123
# s = input()
# judgeCas = {"LETTERS":0, "Digital":0} #定义一个字典
# for c in s:
# if c.isalpha():
# judgeCas["LETTERS"]+=1
# elif c.isdigit():
# judgeCas["Digital"]+=1
# else:
# pass
# print("LETTERS:", judgeCas["LETTERS"])
# print("Digital:", judgeCas["Digital"])
# Way2
print('请输入句子:')
s = input()
print('字母的个数为:',sum(1 for _ in s if _.isalpha())) #'_'表示任意元素
print('数字的个数为:',sum(1 for _ in s if _.isdigit())) #'_'表示任意元素
14.问题:编写一个接收句子的程序,并计算大写字母和小写字母的数量。假设为程序提供了以下输入:Hello world!则输出应该是:UPPER CASE 1;LOWER CASE 9
# Way1
# print('请输入句子:')
# s = input()
# judgeCas = {"UPPER CASE":0, "LOWER CASE":0}
# for c in s:
# if c.isupper():
# judgeCas["UPPER CASE"]+=1
# elif c.islower():
# judgeCas["LOWER CASE"]+=1
# else:
# pass
# print("UPPER CASE", judgeCas["UPPER CASE"])
# print("LOWER CASE", judgeCas["LOWER CASE"])
# Way2
print('请输入句子:')
s = input()
print('大写字母的个数为:',sum(1 for _ in s if _.isupper())) #'_'表示任意元素
print('小写字母的个数为:',sum(1 for _ in s if _.islower())) #'_'表示任意元素
15.编写一个程序,计算a + aa + aaa + aaaa的值,给定的数字作为a的值。假设为程序提供了以下输入:9;输出应该是:11106
# 1. 对于字符串来说,+ 为直接拼接
# 2. %s的应用
# Way1
# print('请输入一个数字:')
# a = input()
# N1 = int("%s" %a)
# N2 = int("%s%s" %(a,a))
# N3 = int("%s%s%s" %(a,a,a))
# N4 = int("%s%s%s%s" %(a,a,a,a))
# print(N1)
# print(N2)
# print(N3)
# print(N4)
# print(N1+N2+N3+N4)
# Way2
print(eval('a+aa+aaa+aaaa'.replace('a',input('请输入一位数字:')))) #eval()用法
16.使用列表推导输出列表中的每个奇数,该列表由一系列逗号分隔的数字输入。假设程序输入:1,2,3,4,5,6,7,8,9 输出应该是:1,3,5,7,9
# Way1
# ListOddsNum = []
# print('请输入一系列逗号分隔的数字:') #1,2,3,4,5,6,7,8,9
# Nums = input()
# items = [x for x in Nums.split(',')]
# for i in items:
# if int(i)%2 !=0:
# ListOddsNum.append(i)
# print(','.join(ListOddsNum)) #1,3,5,7,9
# Way2
print('请输入一系列逗号分隔的数字:') #1,2,3,4,5,6,7,8,9
Values = input()
numbers = [x for x in Values.split(",") if int(x)%2!=0]
print(",".join(numbers))
17.编写一个程序,根据控制台输入的事务日志计算银行帐户的净金额。事务日志格式如下所示:(没懂!!!!!!)
D 100 W 200
D表示存款,而W表示提款。
假设向程序依次输入:D 300;D 300;W 200;D 100;
则输出应该为:500
D = 100 #D表示存款
W = 200 #W表示取款
list = []
print('请输入:')
while True:
x = input()
if len(x) == 0:
break
list.append(x)
balance = 0
for item in list:
if 'D' in item:
balance +=int(item.strip('D'))
if 'W' in item:
balance -= int(item.strip('W'))
print(balance)
18.网站要求用户输入用户名和密码进行注册。编写程序以检查用户输入的密码有效性。
以下是检查密码的标准:
1 [a-z]之间至少有1个字母
2 [0-9]之间至少有1个数字
3 [A-Z]之间至少有一个字母
4 [$#@]中至少有1个字符
5 最短交易密码长度:6
6 交易密码的最大长度:12
您的程序接收一系列逗号分隔的密码,并将根据上述标准进行检查,将打印符合条件的密码,每个密码用逗号分隔。
例:如果以下密码作为程序的输入:ABd1234@1,a F1#,2w3E*,2We3345
则程序的输出应该是:ABd1234@1
# Way1
value = []
print("请输入:") #ABd1234@1,a F1#,2w3E*,2We3345
items = [x for x in input().split(',')]
for i in items:
if len(i)<6 or len(i)>12:
continue
else:
pass
if not re.search("[a-z]",i):
continue
elif not re.search("[0-9]",i):
continue
elif not re.search("[A-Z]",i):
continue
elif not re.search("[$#@]",i):
continue
elif re.search("\s",i):
continue
else:
pass
value.append(i)
print(",".join(value)) #ABd1234@1
# Way2
pas =['[a-z]','[0-9]','[A-Z]','[$#@]']
password = ['ABd1234@1','a F1#','2w3E*','2We3345']
print([s for s in password if 6<=len(s)<=12 and all([re.findall(p,s) for p in pas])])
19.问题:您需要编写一个程序,按升序对(名称,年龄,高度)元组进行排序,其中name是字符串,age和height是数字, 元组由控制台输入。
排序标准是:
1:根据名称排序;
2:然后根据年龄排序;
3:然后按分数排序。
优先级是name > age > 得分。
如果给出以下元组作为程序的输入:Tom,19,80;John,20,90;Jony,17,91;Jony,17,93;Json,21,85
然后,程序的输出应该是:[('John','20','90'),('Jony','17','91'),('Jony','17','93'),('Json','21 ','85'),('Tom','19','80')]
from operator import itemgetter
l = []
print("请输入元组:")
while True:
x = input() #Tom,19,80,John,20,90,Jony,17,91,Joy,17,93,Json,21,85
if not x:
break
l.append(tuple(x.split(",")))
# print(sorted(l, key=itemgetter(0,1,2)))
print(sorted(l,key=itemgetter(0)))
# print()
20.问题:使用生成器定义一个类,该生成器可以在给定范围0和n之间迭代可被7整除的数字。
提示:考虑使用yield.
def InputNums(n):
i = 0
while i<n:
j=i
i=i+1
if j%7 ==0:
yield j
for i in InputNums(100):
print(i)
21.问题:编写一个程序,来计算每个单词出现的频率,按字母顺序对键进行排序后输出。
假设程序输入:
New to Python or choosing between Python 2 and Python 3? Read Python 2 or Python 3.
则输出应该是:
2:2
3.:1
...
# Way1
freq = {}
print('请输入单词:')
InputStr = input().split(' ')
for word in InputStr:
freq[word] = freq.get(word,0)+1
words = sorted((freq.keys()))
for w in words:
print("%s:%d"%(w,freq[w]))
# Way2
x = {}
b = input('enter:')
a = b.split(' ')
c = set(a)
for i in c:
x[i] = b.count(i)
for k in sorted(x):
print(k,':',x[k])
# Way3 根据字典的键值进行排序,
# 利用key排序
# d = {'d1':2,'d2':4,'d4':1,'d3':3}
# for k in sorted(d):
# print(k,':',d[k])
# 利用value排序:__getitem__
# d = {'d1':2,'d2':4,'d4':1,'d3':3}
# for k in sorted(d,key=d.__getitem__):
# print(k,':',d[k])
22.问题:写一个可以计算数字平方值的方法。
提示:使用**运算符
import math
import numpy as np
# Way1
# def CalQuarter(n): #计算数字平方的方法
# return n**2
# print(CalQuarter(9))
# Way2 使用函数求平方
# num =5
# square = pow(num,2)
# print(square)
# Way3 使用math模块求平方
num =5
square = math.pow(num,2)
print(square)
# Way4 使用numpy模块求平方
num =5
square = np.square(num)
print(square)
23.问题:Python中有许多内置函数,如果不知道如何使用它,可以在线阅读文档或查找一些书籍。请编写一个程序来打印一些Python内置函数文档,例如abs(),int()
提示:内置文档方法是doc:
print(abs.__doc__)
print(int.__doc__)
print(input.__doc__)
24.问题:定义一个类,它具有类似参数并具有相同的实例参数。
提示:定义一个实例参数,需要在init方法中添加它。您可以使用构造参数初始化对象,也可以稍后设置该值。
from operator import itemgetter,attrgetter
class Student:
name = '小明'
age = '年龄'
stuno = "学号"
def __int__(self,name,age,stuno):
self.name = name
self.age = age
self.stuno = stuno
claire = Student()
claire.name = "Claire"
claire.age = 18
claire.stuno = "N0231019"
print("%s name is %s" %(Student.name,claire.name),'\n'
"%s age is %s" %(Student.age,claire.age),'\n'
"%s stuno is %s" %(Student.stuno,claire.stuno),'\n' #可再优化看看
)
print(f'姓名:{claire.name}\n年龄:{claire.age}\n学号:{claire.stuno}\n')
# sufei = Student()
# sufei.name = "Sufei"
# print("%s name is %s" %(Student.name,sufei.name))
25.问题:定义一个可以计算两个数之和的函数。
提示:定义一个带有两个数字作为参数的函数。可以在函数中计算和并返回值。
def SumofTwoPara(a,b):
return a+b
print(SumofTwoPara(3,6))
# if __name__ =='__main__':
# print(SumofTwoPara(9,6))
26.打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。
for i in range(100,1000): #“水仙花数”是指一个三位数,其各位数字立方和等于该数本身
a = i%10
b = i//10%10
c = i//100
if(a*a*a+b*b*b+c*c*c == 100*c+10*b+a):
print(i,end='\n')
27.利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
# Way1
# print('请输入数字:')
# score = (int)(input()) #score = int(input('input score:'))
# if score>=90:
# print('Grade is A')
# elif 60<= score <=89:
# print('Grade is B')
# elif score <60:
# print('Grade is C')
# else:
# print('不在评判范围!')
# Way2
score = int(input('input score:'))
if score>=90:
Grade = 'A'
elif 60<= score <=89:
Grade = 'B'
elif score <60:
Grade = 'C'
else:
print('不在评判范围!')
print('%d belongs to %s' %(score,Grade))
28.定义一个可以将整数转换为字符串并在控制台中打印的函数。
提示:使用str()将数字转换为字符串。
def tt(n):
print(str(n))
tt(3)
29.输入一串数字,以逗号为分隔符,将其转换成列表和元组输入:34,67,55,33,12,98
输出: ['34', '67', '55', '33', '12', '98'] ('34', '67', '55', '33', '12', '98')
value = input('请输入一串数字:')
a = value.split(',')
print(a)
b = tuple(a) #直接用函数tuple()
print(b)
30.字符串、列表、元组、字典每个常用的5个方法?
字符串:repleace,strip,split,reverse,upper,lower,join.....
列表:append,pop,insert,remove,sort,count,index.....
元组:index,count,__len__(),__dir__()
字典:get,keys,values,pop,popitems,clear,update,items....
31.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
if(value % n==0 and n !=90 and n!=1)
print(n)
32.打印各种三角形和矩形
# for i in range (1,6): #打印5行左下角实心三角形
# for j in range(1,i+1):
# print('*',end=' ')
# print('\n')
# n = int(input()) #打印左下角实心三角形
# for i in range(1,n+1):
# for j in range(1,i+1):
# print("*", end=" ")
# print()
# n = int(input()) #打印左下空心三角形
# for i in range(1,n+1):
# for j in range(1,i+1):
# if(i==n or i==j or j==1):
# print("*",end=" ")
# else:
# print(" ",end=" ")
# print()
# n = int(input()) #打印实心矩形
# for i in range(1,n+1):
# for j in range(1,n+1):
# print("*",end=" ")
# print()
# n = int(input()) #打印空心矩形
# for i in range(1,n+1):
# for j in range(1,n+1):
# if(i==1 or j==1 or i==n or j==n):
# print("*",end=" ")
# else:
# print(" ",end=" ")
# print()
# n= int(input()) #打印右下角实心三角形
# for i in range(n+1):
# for j in range(0,(n+1)-i):
# print(" ", end=" ")
# for k in range((n+1)-i,n+1):
# print("*",end=" ")
# print("")
# n = int(input()) #打印右下角空心三角形
# for i in range(1,n+1):
# for j in range(1,n+1):
# if(i==n or j==n or (i+j-1==n)):
# print("*",end=" ")
# else:
# print(" ",end=" ")
# print()
#打印右上角实心三角形
# n = int(input())
# for i in range(n):
# for j in range(0,i):
# print(" ",end=" ")
# for k in range(i,n):
# print("*",end=" ")
# print(" ")
# #打印右上角空心三角形 ?????
# n = int(input())
# for i in range(1,n+1):
# for j in range(1,n+1):
# if(i==1 or j ==n or i==j):
# print("*",end=" ")
# else:
# print("",end=" ")
# print(" ")
# #打印左上角实心三角形
# n = int(input())
# for i in range(0,n+1):
# for j in range(0,n-i):
# print("*",end=" ")
# print()
#打印左上角空心三角形
# n = int(input())
# for i in range(0,n+1):
# for j in range(0,n-i):
# if(i==0 or j==0 or i+j+1==n):
# print("*",end=" ")
# else:
# print(" ",end=" ")
# print()
#打印正等边三角形
# n = int(input())
# for i in range(n+1):
# for j in range(0,(n+1)-i):
# print(end=" ")
# for j in range((n+1)-i,(n+1)):
# print("*",end=" ")
# print("")
#打印倒等边三角形
# n = int(input())
# for i in range(n):
# for j in range(0,i):
# print(end=" ")
# for j in range(i,n):
# print("*",end=" ")
# print(" ")
#打印正等边空心三角形
# n = int(input())
# for i in range(1,n*2):
# if i==n:
# print("*")
# break
# else:
# print(" ",end="")
# for j in range(n-1,1,-1):
# for i in range(1,n*2):
# if i==j:
# print("*",end="")
# elif i==n*2-j:
# print("*")
# break
# else:
# print(" ",end="")
# for i in range(1,n*2):
# if i%2 !=0:
# print("*",end="")
# else:
# print(" ",end="")