Python实验

一、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])

 

        3.⽤集合完成实验内容2的要求
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.编写程序,实现磁盘垃圾⽂件清理功能。要求程序运⾏时,通过命令⾏参数指定要清理的

⽂件夹,然后删除该⽂件夹及其⼦⽂件夹中所有扩展名为 tmp、log、obj、txt 以及⼤⼩为0的⽂件
#测试文档建立
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("保存成功!")

 

 

       

 

  • 16
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊hii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值