Python面向对象实验

目录

实验一、面向过程编程(字符串操作)

实验二、文件操作与异常处理

 实验三、面向对象编程(栈操作)

实验四、多线程与多进程编程

实验一、面向过程编程(字符串操作)

请设计如下功能的 Python 代码并进行验证:

1、 要求输入多个字符串,字符串中包含各种数字以及字母的组合,每个组合以“,” 隔开;

2、 输入的字符串中只能包含数字和字母以及“,”,否则抛出异常并给出提示,并要求 用户重新输入;

3、 将输入的字符串按“,”进行分割,并将数字串和非数字串进行分离,如有空串则 要删除空串,并给出提示信息;

4、 数字串请按照数字的大小由大到小进行排序,非数字串请按照长度有短到长进行排 序,若长度相等,则按照字符串的固有排序准则降序排序,并进行输出;

5、 将数字串放在前面,非数字串放在后面,依次输出。

示例(加粗字体表示用户输入): 请输入字符串,每个字符串以“,”隔开:abx,2as,234,456,23,1,b,Ac,56,sd,%5

输入格式不正确,请重新输入!

请输入字符串,每个字符串以“,”隔开:abx,2as,234,456,23,1,b,Ac,56,sd

你输入的数字串有:234,456,23,1,56

你输入的非数字串有:abx,2as,b,Ac,sd

最终的输出结果为:456,234,56,23,1,b,sd,Ac,abx,2as

程序运行完毕!

代码如下:

list1=[]
while True:
    flag=0                              #用flag = 0作为输入的格式正确的标记,如果格式错误,则无法退出while循环,继续输入
    list1=input("请输入字符串,用','进行分隔:").split(',')
    for i in list1:
        if str.isalnum(i) != True:
            flag=1
    if flag == 1:
        print("输入的格式有误,请重新输入")
    else:
        break
list2=[]
list3=[]
for i in list1:
    if i =='':
        del list1[i]
        print('空串已被删除')
    elif str.isdigit(i):                #数字串
        list2.append(i)
    else:                               #非数字串
        list3.append(i)
print('你输入的数字串有:',','.join(str(i) for i in list2))
print('你输入的非数字串有:',','.join(str(i) for i in list3))

out_list1=list(map(int,list2))          #将列表中的字符型数字转化为整型数字

out_list1.sort(reverse=True)            #对只包含数字的列表进行降序排列
list3.sort( key=lambda x: len(x),reverse=True)#对只有非字符型的列表按其长度排列
list3.reverse()

print(','.join(str(i) for i in out_list1 + list3))#join将列表的中括号去除

运行结果(截图):

实验二、文件操作与异常处理

请设计如下功能的 Python 代码并进行验证(以下每个步骤均需要考虑异常!):

1、 请在 D 盘(Windows 系统)或者/usr/local(Linux)下创建一个新的文件 test.txt,若 文件存在则需要给出是否要进行删除的提示,若用户输入 y,则删除原来的 test.txt, 并新建一个新的 test.txt,否则转步骤 3;

2、 在 test.txt 文件中随机写入 10 个-1-1 的小数,保留 2 位小数点,并进行检查,若随 机生成的数据中没有负数则重新随机,直到序列中至少有 2 个负数,文件中每行写 1 个数字,写完之后,安全关闭文件,并给出完成提示;

3、 请打开按上述方法生成的 test.txt 文件,读取该文件中每行的小数,并将这些数字 按照从大到小的顺序进行排列形成一个字符串,并输出该字符串;

4、 将 3 中得到的字符串中的小数点”.”以及小数点之前的“0”全部删除,得到一个新 的字符串,并输出该字符串;

5、 计算 4 中得到的字符串对应的表达式的值,将该值以”,”进行格式化后输出并追加到 test.txt 的最后,安全关闭 test.txt,并给出提示。

6、 将 test.txt 移动至当前目录,并改名为 test_solved.txt,给出提示。

示例(加粗字体表示用户输入): 已创建文件 D:\test.txt 并已写入 10 个随机数据!

从 D:\test.txt 中读取到的数据为: 0.23,0.21,0.89,0.78,-0.98,-0.45,0.23,0.11,-0.78,-0.66

排序之后得到的字符串为: 0.890.780.230.230.210.11-0.45-0.66-0.78-0.98

经过处理之后的字符串为: 897823232111-45-66-78-98

最终得到的值为:897,823,231,824

已追加该数值!

已移动到当前目录!

已改名!

程序运行完毕 

代码如下:

import tempfile,random
import os
import shutil
if os.path.exists("D:\ test.txt"):
    while True:
        x = input('文件已经存在,是否要进行删除[y]/n:')
        flag = 0
        if x == 'y':
            os.remove("D:\ test.txt")                              #删除指定文件
            fp = open('D:\ test.txt','w')
            fp.close()
            print('文件已删除\n文件重新创建成功')
        elif x == 'n':
            pass
        else:
            print('输入有误,请重新输入')
            flag = 1
        if flag == 0:
                break
list1 = []
list2 =[]
count = 0
with open('D:\ test.txt', 'w') as fp:
    while True:
        for i in range(10):
            data = random.uniform(-1, 1)
            data1 = round(data, 2)            #保留两位小数round()
            if data1 <0:
                count+=1#保留两位小数
            list1.append(data1)
        if count >= 2 :
            list2 = list1
            flag = 0
        else:
            list1.clear()                    #将列表置空,重新装入符合的数据(至少两个负数)
            flag =1
        if flag == 0:
            break
    fp.write(str(','.join(str(i) for i in list2)))
print('已创建文件D:\ test.txt并已经写入10个随机数据!')
with open('D:\ test.txt', 'r') as fp:  # 读取test文本文件
    print('从D:\ test.txt中读取到的数据为:')
    print('\t', ','.join(str(i) for i in fp.readlines()) )

list1.sort(reverse=True)                                        # 排序
print('排序之后的字符串为:')
print('\t', ''.join(str(i) for i in list1))

list3 = []                                                      # 将”.“以及小数点之前的"0"全部删除,得到一个新的字符串
for i in list1:
    j = str(i).replace('0.', '')  # 将”0.“去掉
    j = int(str(j))                                             #将整数前面的‘0’去掉
#    j = str(j).replace('0', '')  # 将数字前面的”0“去掉
    list3.append(j)
str1 = ''.join(str(i) for i in list3)
print('处理之后的字符串为:')
print('\t', str1)
                                                               # 计算字符串表达式的值,将该值进行格式化后输出并追加到test.txt的最后
str2 = eval(str1)                                              # 用eval函数实现计算字符串表达式的值
str3 = format(str2, ',')
print('最终得到的值:')
print(str3)
with open('D:\ test.txt', 'a') as fp:                          #将计算出的结果追加到文件中
    if fp.write(','+str3):
        print('已追加该数值!')
                                                               # 移动文件并改名:
f1 = 'D:\ test.txt'
f2 = os.getcwd()
if os.path.exists('D:\Mianxiangduixiang_hw\ test.txt'):        #若当前路径已经有这个文件,将原本存在的文件删除,将移动进来的文件改名
    os.remove('D:\Mianxiangduixiang_hw\ test.txt')

shutil.move(f1, f2)
print('已经将文件移动到当前目录')
#print(f2)                                                      #当前路径

if os.path.exists('D:\Mianxiangduixiang_hw\ test_solved.txt'):
    os.remove('D:\Mianxiangduixiang_hw\ test_solved.txt')
#    print("已将原文件删除")
os.renames('D:\Mianxiangduixiang_hw\ test.txt','D:\Mianxiangduixiang_hw\ test_solved.txt')
print('已改名!')
print('程序运行完毕!')

运行结果:

 实验三、面向对象编程(栈操作)

请利用面向对象的思想完成栈这种数据结构的编写,编写一个类 Stack,实现入栈、出 栈、判栈空、判栈满的操作!Stack 类须包含如下成员:

1、私有成员 content,为一个列表,代表栈里的数据;

2、私有成员 size,要求为整型,代表栈的容量,请定义为固定值 10;

3、私有成员 current,要求为整型,代表栈当前数据的个数;

4、方法 isempty,判断栈是否为空,返回 True/False;

5、方法 empty,置空栈;

6、方法 isFull,判断栈是否为满,返回 True/False;

7、方法 push,入栈,输入参数为新的元素;

8、方法 pop,出栈;

9、方法 show,打印当前栈的数据。 设计完该类之后,请将所有功能放开供用户调试,用户界面应如如下示例:

示例(加粗字体表示用户输入):

        当前栈状态(0/10):

        empty 请输入需要的操作(0、退出 1、入栈 2、出栈):2

        错误操作!当前栈为空,无可出元素!

        请输入需要的操作(0、退出 1、入栈 2、出栈):1

        请输入数据:3

        当前栈状态(1/10):[3]

        请输入需要的操作(0、退出 1、入栈 2、出栈):1

        请输入数据:6

        当前栈状态(2/10):[3,6] 请输入需要的操作(0、退出 1、入栈 2、出栈):2

        已出栈:6

         当前栈状态(1/10):[3]

        请输入需要的操作(0、退出 1、入栈 2、出栈):0

        程序运行完毕

代码如下:(这里我将Stack类作为一个模块,使用的时候直接调用)

class Stack():
    # 初始化栈为空列表
    def __init__(self, size=10):
        self.__content = []  # 使用列表存放栈的元素
        self.__size = size  # 栈的大小
        self.__current = 0  # 栈中元素的个数

    # 判断栈是否为空,返回布尔值
    def empty(self):
        self.__content = []
        self.__current = 0

    def isempty(self):
        return not self.__content

    def setSize(self, size):
        # 如果缩小栈的空间,则删除指定大小之后已有的元素
        if size < self.__current:
            for i in range(size, self.__current)[::-1]:
                del self.__current[i]
            self.__current = size
        self.__size = size

    # 栈满
    def isFull(self):
        return self.__current == self.__size

    def size(self):
        return self.__size
    # 入栈
    def push(self, x):
        if len(self.__content) < self.__size:
            self.__content.append(x)
            self.__current += 1  # 栈中元素加一
        else:
            print('栈满')

    # 出栈
    def pop(self):
        if self.__content:
            self.__current -= 1
            return self.__content.pop()
        else:
            print('栈空')
    def showcurrent(self):
        return self.__current
    # 栈的元素个数
    def show(self):
        return self.__content

    def showRemainderSpace(self):  # 当前栈的大小
        print('栈还可以输入', self.__size - self.__current,'个数据')


if __name__ == '__main__':
    print('Please use me as a module')
import Stack1
if __name__ == '__main__':
    # 初始化一个栈对象
    s = Stack1.Stack()
    if s.isempty():
        print("当前栈状态(0/10):empty")
    while True:
        x = input ('请输入需要的操作(0、退出 1、入栈 2、出栈):')
        if x == '0':
            print("程序运行完毕!")
            break
        elif x == '1':
            info = eval(input('请输入数据'))
            s.push(info)
            print('栈当前状态(',s.showcurrent(),'/',s.size(),'):',s.show())
        elif x == '2':
            if s.isempty():
                print('错误操作!当前栈为空,无可出元素!')
            else:
                print('已出栈:',s.pop())
                print('栈当前状态(', s.showcurrent(), '/', s.size(),'):', s.show())
        else:
            print("你输入的操作有误,请重新输入!")

实验四、多线程与多进程编程

请分别利用线性算法、多线程编程(开 10 个线程)以及多进程编程(开 10 个进程) 计算 1 到 500000000(5亿)的连加的和,并比较这 3 者的运行时间! 请分别编写线性运算、多线程运算以及多进程运算的相应函数,并分别输出 3 种运算最 终的运行结果以及运行需要的时间(结果精确到秒)

代码如下:


import threading
from multiprocessing.dummy import Pool
from multiprocessing import pool
import time

result = 0
tasklist = []

                                                               # 判断线程是否结束
def isThreadingsEnd(tasklist):
    for t in tasklist:
        if t.is_alive() == True:
            return False
    return True

                                                         # 线程/进程单位任务
def sum_task(start):
    global result
    sum = 0
    for i in range(start, 500000001, 10):
        sum += i
    result += sum

                                                             # 线性计算方法
def sum_linear():
    global result
    t1 = time.time()
    for i in range(1, 500000001):
        result += i
    t2 = time.time()
    print('线性计算:', result, 'time =', round(float(t2 - t1), 6), '\bs')

                                                                 # 线程计算方法(10线程)
def sum_threading():
    global result
    t1 = time.time()
    for i in range(10):
        t = threading.Thread(target = sum_task, args = (i + 1,))  #判断线程是否结束
        tasklist.append(t)
        t.start()
    while isThreadingsEnd(tasklist) == False:
        pass
    t2 = time.time()
    print('多线程计算:', result, 'time =', round(float(t2 - t1), 6), '\bs')

                                                    # 进程计算方法(10进程)
def sum_process():
    global result
    pool = Pool(10)
    t1 = time.time()
    for i in range(10):
        pool.apply(sum_task, args = (i + 1,))
    pool.close()
    pool.join()
    t2 = time.time()
    print('多进程计算:', result, 'time =', round(float(t2 - t1), 6), '\bs')


result = 0
sum_linear()                                   #线性计算
result = 0
sum_threading()                                #线程计算
result = 0
tasklist = []
sum_process()                                  #进程计算

不同的电脑运行时间不一样,好的会快一点:

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@简单就好

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

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

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

打赏作者

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

抵扣说明:

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

余额充值