一、PYTHON 开发环境搭建与编程基础
1.编写程序,输⼊任意⼤的⾃然数,输出各位数字之和
a = input("请输入一个自然数:")
b = 0
for i in a:
b = b + int(i)
print('该整数和为:',b)
2.编写程序,输⼊⼀个⾃然数,输出它的⼆进制、⼋进制、⼗六进制表⽰形式
print('请输入一个整数:',end = '')
x = input()
print('十进制数为: ' + x)
print('二进制数为: ' + bin(int(x)))
print('八进制数为: ' + oct(int(x)))
print('十六进制数为: ' + hex(int(x)))
二、PYTHON 序列结构
1.编写程序,输⼊两个集合 setA 和 setB,分别输出它们的交集、并集和差集 setA-setB
setA = eval(input('请输入一个集合:'))
setB = eval(input('再输入一个集合:'))
print('交集:',setA & setB)
print('并集:',setA | setB)
print('差集:',setA - setB)
2.编写程序,输⼊⼀个⼤于 2 的⾃然数,然后⽤筛选法输出⼩于该数字的所有素数组成的列
def isprime(n): # 判断素数函数
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
else:
return True
def f(n): # 找小于n的素数并求和
ls = []
count = 0
sum = 0
for i in range(n, 1, -1):
if isprime(i):
count += 1
if count <= 10:
ls.append(i)
sum += i
else:
break
return ls, sum
p = int(input())
result = f(p)
result[0].sort()
for item in result[0]:
if result[0].index(item) != len(result[0]) - 1:
print(item, end='+')
else:
print(item, end='=')
print(result[1])
print(result[0])
maxNumber = int(input('请输入一个大于 2 的自然数:'))
numbers = set(range(2, maxNumber+1))
# 最大数的平方根,以及小于该数字的所有素数
m = int(maxNumber**0.5)+1
primesLessThanM = [p for p in range(2, m)
if 0 not in [p%d for d in range(2, int(p**0.5)+1)]]# 遍历最大整数平方根之内的自然数
for p in primesLessThanM:
for i in range(2, maxNumber//p+1):
# 在集合中删除该数字所有的倍数
numbers.discard(i*p)
print(numbers)
sum=0
i=2
for i in numbers:
sum+=i
print(sum)
1.假设⼀段楼梯共 15 个台阶,⼩明⼀步最多能上 3 个台阶。编写程序计算⼩明上这段楼 梯
def climbStairs1(n):
# 递推法
a = 1 # 上一个台阶只有一种方法
b = 2 # 上两个台阶有两种方法
c = 4 # 上三个台阶有四种方法
for i in range(n - 3):
c, b, a = a + b + c, c, b
return c
def climbStairs2(n):
# 递归法
first3 = {1:1,2:2,3:4}
if n in first3.keys():
return first3[n]
else:
return climbStairs2(n-1)+climbStairs2(n-2)+climbStairs2(n-3)
print(climbStairs1(15))
print(climbStairs2(15))
2.编写程序,模拟抓狐狸⼩游戏。假设⼀共有⼀排 5 个洞⼜,⼩狐狸最开始的时候在其中 ⼀
个洞⼜,然后玩家随机打开⼀个洞⼜,如果⾥⾯有狐狸就抓到了。如果洞⼜⾥没有狐狸就第⼆天再
来抓,但是第⼆天狐狸会在玩家来抓之前跳到隔壁洞口里
from random import choice, randrange
def catchMe(n=5, maxStep=10):
'''
抓狐狸游戏
:param n: 洞口的个数,默认为5
:param maxStep: 最大抓取次数,默认允许抓10次
:return: null
'''
# 共有n个洞口,设有狐狸的为1,没有的为0
positions = [0] * n
# 狐狸的随机初始位置
oldPos = randrange(0, n)
positions[oldPos] = 1
# 抓maxStep次
while maxStep >= 0:
maxStep -= 1
# 这个循环是为了保证用户输入是否是有效的洞口
while True:
try:
x = input("今天打算打开哪个洞口?(0-{0}):".format(n - 1))
# 如果输入的不是数字,会跳转到except部分
x = int(x)
# 如果输入的洞口有效,结束这个循环,否则继续输入
assert 0 <= x < n, "要按套路来啊,再给你一次机会哈!"
break
except:
# 如果输入的不是数字,就执行这里的代码
print("你要按套路来啊!再给你一次机会!")
if positions[x] == 1:
print("成功!我抓到狐狸了!")
break
else:
print("今天没有抓到狐狸。")
# 如果这次没抓到,则狐狸就会跳到隔壁的洞口
# 分三种情况:如果在最左边,则只能往右边洞口跳
# 如果在最右边,则只能往左边洞口跳
# 如果在中间三个洞头则随机向左右两边洞口跳
if oldPos == n-1: # 在最右边
newPos = oldPos -1
elif oldPos ==0: # 在最左边
newPos = oldPos + 1
else:
newPos = oldPos + choice((-1,1))
positions[oldPos],positions[newPos] = 0,1
oldPos = newPos
else:
print("十天了!放弃吧!你这样抓是没有希望的!")
# 启动游戏
catchMe()
3.定义⼀个三维向量类,并定义相应的特殊⽅法实现两个该类对象之间的加、减运算(要求支
持运算符+、-),实现该类对象与标量的乘、除运算(要求⽀持运算符*、/),以及向量长度的计算(要
求使⽤属性实现)
class MyArray:
def __init__(self, x, y, z):
self.__x = x
self.__y = y
self.__z = z
def add(self, a):
x = self.__x + a.__x
y = self.__y + a.__y
z = self.__z + a.__z
print("和=({},{},{})".format(x, y, z))
def sub(self, a):
x = self.__x - a.__x
y = self.__y - a.__y
z = self.__z - a.__z
print("差=({},{},{})".format(x, y, z))
def mul(self, a):
x = self.__x * a
y = self.__y * a
z = self.__z * a
print("乘积=({},{},{})".format(x, y, z))
def truediv(self, a):
x = self.__x / a
y = self.__y / a
z = self.__z / a
print("商=({},{},{})".format(x, y, z))
def length(self):
a = pow(pow(self.__x, 2) + pow(self.__y, 2) + pow(self.__z, 2), 0.5)
print("长度为:{}".format(round(a, 3)))
print('请输入六个数a,b,c,d,e,f:')
a, b, c, d, e, f = map(int, input().split())
print('N1:', (a, b, c))
print('N2:', (d, e, f))
n1 = MyArray(a, b, c)
n2 = MyArray(d, e, f)
n1.add(n2)
n1.sub(n2)
n1.mul(2)
n1.truediv(2)
n1.length()
1.编写程序,要求输⼊⼀个字符串,然后输⼊⼀个整数作为凯撒加密算法的密钥,然后输出
import string
def kaisa(s, k):
lower = string.ascii_lowercase
upper = string.ascii_uppercase
before = string.ascii_letters
after = lower[k:] + lower[:k] + upper[k:] + upper[:k]
table = ''.maketrans(before, after)
return s.translate(table)
s = input("请输入一个字符串:")
k = int(input("请输入一个整数密钥:"))
print(kaisa(s, k))
2.编写程序,模拟打字练习程序的成绩评定。假设 origin 为原始内容,userInput 为⽤户练习
时输⼊的内容,要求⽤户输⼊的内容长度不能⼤于原始内容的长度,如果对应位置的字符⼀致则认
为正确,否则判定输⼊错误。最后成绩为:正确的字符数量/原始字符串长度, 按百分制输出,要求
保留 2 位⼩数
def CountAccuracy(originalContent,matchContent):
origin =list(originalContent)
userInput = list(matchContent)
if origin == userInput:
print("准确率为","100%")
else:
counts =0
if len(userInput) <= len(origin):
for i in range(len(userInput)):
if origin[i] == userInput[i]:
counts += 1
print("准确率为","{:4.2f}%".format((counts/len(origin))*100))
else:
print("超出原始长度")
if __name__ == "__main__":
origin ="设计程序,编写函数,origin cute process Finish。以打字练习程序为例"
userInput = input("请输入:")
CountAccuracy(origin,userInput)
3.编写程序,使⽤正则表达式查找txt⽂件中AABB形式的词语
import re
file = open("实验4.3.txt","r",encoding='utf8')
str1 = file.read()
file.close()
#re.finditer(pattern, string, flags=0)
#搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
#pattern : 正则表达式的字符串或原生字符串表示
#string : 待匹配字符串
#flags : 正则表达式使用时的控制标记
strings1 = re.finditer(r'(.)\1(.)\2', str1)
strings2 = re.finditer(r'(([\u4e00-\u9fa5])\2([\u4e00-\u9fa5])\3)', str1)
for i in strings1:
print(i.group())
# for i in strings2:
# print (i.group())
1.编写⼀个程序 demo.py,要求运⾏该程序后,⽣成 demo_new.py ⽂件,其中内容与
demo.py ⼀样,只是在每⼀⾏的后⾯加上⾏号。要求⾏号以#开始,并且所有⾏的#符号垂直对齐
filename = 'demo.py'
with open(filename, 'r') as fp:
lines = fp.readlines()
maxLength = len(max(lines, key=len))
lines = [line.rstrip().ljust(maxLength)+'#'+str(index)+'\n'
for index, line in enumerate(lines)]
with open(filename[:-3]+'_new.py', 'w') as fp:
fp.writelines(lines)
2.假设某学校所有课程每学期允许多次考试,学⽣可随时参加考试,系统⾃动将每次成绩添加
到 Excel ⽂件(包含 3 列:姓名,课程,成绩)中,现期末要求统计所有学⽣每门课程的最⾼成绩。编
写程序,模拟⽣成若⼲同学的成绩并写⼊ Excel ⽂件,其中学⽣姓名和课程名称均可重复,也就是
允许出现同⼀门课程的多次成绩,最后统计所有学⽣每门课程的最⾼成绩, 并写⼊新的 Excel ⽂
件
import openpyxl
from openpyxl import Workbook
import random
# 生成随机数据到文件
def generateRandomInformation(filename):
workbook = Workbook()
worksheet = workbook.worksheets[0] # 设置工作表
worksheet.append(['姓名', '课程', '成绩'])
# 中文名字中的第一第二第三个字
first = tuple('赵陈孙李')
middle = tuple('伟志子东')
last = tuple('坤楠恙')
# 课程名字
subjects = ('语文', '数学', '英语')
# 随机生成200个数据
for i in range(200):
line = []
r = random.randint(1, 100)
name = random.choice(first)
if r > 50: # 按一定概率生成只有两个字的名字
name = name + random.choice(middle)
name = name + random.choice(last) # 生成3个字的名字
# 依次生成姓名、课程名称和成绩
line.append(name)
line.append(random.choice(subjects))
line.append(random.randint(0, 100))
worksheet.append(line)
# 保存数据,生成Excel2007格式的文件
workbook.save(filename)
def get_result(oldfile, newfile):
"""获取旧文件的数据,添加新增数据并把数据打包到新的文件下"""
result = dict() # 用于存放结果数据的字典
# 打开原始数据
workbook = openpyxl.load_workbook(oldfile)
worksheet = workbook.worksheets[0]
# 遍历原始数据
for row in list(worksheet.rows)[1:]: # 第一行是标题行,后面的行才是数据行
# 姓名,课程名称,本次成绩
name, subject, grade = row[0].value, row[1].value, row[2].value
# 获取当前姓名对应的课程名称和成绩信息
# 如果result字典中不包含,则返回空字典
t = result.get(name, {})
# 获取当前学生当前课程的成绩,若不存在返回0
f = t.get(subject, 0)
# 只保留该学生该课程的最高成绩
if grade > f:
t[subject] = grade
result[name] = t
# 创建Excel文件
workbook1 = Workbook()
worksheet1 = workbook1.worksheets[0]
worksheet1.append(['姓名', '课程', '成绩'])
# 将result字典中的结果数据写入Excel文件
for name, t in result.items():
for subject, grade in t.items():
worksheet1.append([name, subject, grade])
workbook1.save(newfile)
if __name__ == '__main__':
oldfile = r'E:\PYTHON\WorkSpace\py_case\实验5\2\test.xlsx'
newfile = r'E:\PYTHON\WorkSpace\py_case\实验5\2\result.xlsx'
generateRandomInformation(oldfile)
get_result(oldfile, newfile)
3.编写程序,读取 Word ⽂件中的所有段落⽂本,然后输出其中所有红⾊的⽂本和加粗的 ⽂
from docx import Document
from docx.shared import RGBColor
boldText = []
redText = []
doc = Document('test.docx')
for p in doc.paragraphs:
for r in p.runs:
# 加粗字体
if r.bold:
boldText.append(r.text)
# 红色字体
if r.font.color.rgb == RGBColor(255,0,0):
redText.append(r.text)
result = {'red text': redText, 'bold text': boldText, 'both': set(redText) & set(boldText)}
# 输出结果
for title in result.keys():
print(title.center(30, '='))
for text in result[title]:
print(text)
4.编写程序,实现磁盘垃圾⽂件清理功能。要求程序运⾏时,通过命令⾏参数指定要清理的
#测试文档建立
import os
os.chdir("cleartest")
f = open('zero.doc', "w") # 创建空文件
f.close()
list_file = ['tmp', 'log', 'obj', 'txt']
for i in list_file:
filename = "{0}file.{0}".format(i)
f = open(filename, "w")
f.write("12345(不是0KB)")
f.close()
#磁盘垃圾清理
from os.path import isdir, join, splitext, getsize
from os import remove, listdir
import sys
# 指定要删除的文件类型
directory1="E:\PYTHON\WorkSpace\py_case\实验5"
filetypes = ['.tmp', '.log', '.obj', '.txt']
def delCertainFiles(directory):
if not isdir(directory):
return#判断文件是否存在
for filename in listdir(directory):
temp = join(directory, filename)#子文件添加路径
if isdir(temp):
delCertainFiles(temp)#如果存在子文件夹进入子文件夹
elif splitext(temp)[1] in filetypes or getsize(temp)==0:
# 删除指定类型的文件或大小为 0 的文件
remove(temp)
print(temp, ' deleted........ ')
directory = sys.argv[0]
delCertainFiles(directory1)
1.爬取百度指定关键字搜索结果前⼗页信息
# 根据搜索字进行爬取
import requests
from urllib.request import urlopen
if __name__ == '__main__':
headers = {
"Accept: text / html, application / xhtml + xml, application / xml;q = 0.9, image / avif, image / webp, image / apng, * / *;q = 0.8, application / signed - exchange; v = b3;q = 0.9,",
"Cookie": "sts = 0;wc = 57006;lc2 = 57006;wc_n = % 25u5929 % 25u6C34;bdUid = 5FDB635F2A2B0001C3CE7A9C0000;__bid_n = 1842bbccb7dc9dd50f4207;FPTOKEN = 30$9WkKH / BxECoru1eQV91xkOVOGR50qz2JVHwojGM7881n7gWVimlhVtnIuWoKfH9R5HnkmjrfcbZClBv6LiQ8kMRzdmdNbbJ6S10kB2Tkqsfcq7SuTJDwyPImFcN83OCOchjPt4hkky / 7xWR3gJA / hlQbJu9m8TzPqXnCBiFwtcnEbFakufv5Srb4Obo0TuQTmLlQHlDSIgd + dd4iajf1U1KZUwdI7cugYsYvAOFYCUNSWnCAJrc + 4Csi5gksegFJntViGUTM57Q558msYZDNKeJu3JOm8aVR7aK70515uNlrDvwkoflFsC3O5beKlsTnaRK2w7k + oYQ7yjJ + kSFmhixo2JaxvbodWXzX8lA9vnoMa8O / 12stf4q9ioig4omhLIZde6TJsYzHqsEl + 0fFrLVHmC8i12urwhrQq9U4Og4 = | OMmSlCpdpYWU3v4EZdvSxIiYDkkkMhb5BITV5MO9qT4 = | 10 | 5d23ac11f54ec8d08ef59ced94382832;FEID = v10 - 3b25a647a06756a78264fe53520c95e973f0d18b;Hm_lvt_d7c7037093938390bc160fc28becc542 = 1670730677, 1670931576, 1671026431, 1671176687;__xaf_fpstarttimer__ = 1671358575005;__xaf_ths__ = {"data": {"0": 1, "1": 43200, "2": 60}, "id": "e088755c-5d92-4e02-9214-002126e86a68"};__xaf_thstime__ = 1671358577169;FPTOKEN = cLVIkxaCrXChxrsJ6DaeKOEHUcExTa4z1K4Bmo7bn22qG1E596z3oW9 + eEpuYbwS9p + SAGfcpZD3X8u2dYdZkH87wYtkfdkuyYoIZvtH + MEZgwKXB5xn50eRafyvmsMKGa / lg1Th8fgBANduhR4DxSBkt3A030R9vKY4CkaIrj9HPiiFkEJsvpyyVWxPOFjTIvQ98PKZNK / TIY2rL5QV2Rw5xzrg8xEUNGHo5gHoQOvq / SqzRZrFWLVzyixNsiibmclK6sgRtLbTKBqiEHDY2dzDh9lFxqyHNE4fXSoXwZfolUm5lk0xloDcR0TAL / kCaAZ1IZSxf1Qc6ZSE5PvD7TLUr8krPn52C / 6ZXJOETWLAWWwGdenHgdXqk9z4vQkeho013P2qg9D5vNnyt8Pm3Qd3guafNA3g8aqYpSed7ZjXonxQ3lKgFWgGFz1 / 41fH | YUfyuifYerbjfrWEP9nY0TwgQgDLPVZs0MIabms3Yw8 = | 10 | f90f94d903a0f9ca826b0c591f08a4bd;__xaf_fptokentimer__ = 1671358577455;Hm_lpvt_d7c7037093938390bc160fc28becc542 = 1671429427",/
"User-Agent": "Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 104.0.0.0Safari / 537.36",
}
# //不同浏览器的形式也不全是后面加‘/s’ 搜狗的后面加‘/web’
url = 'https://www.baidu.com/s'
kw = input("enter a word that you want to know:")
for i in range(10):
param = {
'kw': kw,
'pn':i*10
}
response = urlopen(url)
# response.encoding = response.apparent_encoding
# page_text = response.text
fileName = kw+str(i)+'.html'
with open(fileName,mode = 'wb') as fp:
fp.write(response.read())
print("保存成功!")