python进阶--月考三

python进阶--月考三

  • (一)装饰器
  • (二)创建名为express.py文件,编写以下推导式
  • (三)创建一个process_study.py 编写一个多进程程序
  • (四)创建一个thread_study.py 编写一个多线程程序
  • (五)根据需求进行socket编程

(一)装饰器

创建一个decorator.py的文件用来写2个装饰器 一个统计函数运行时间,一个记录函数的日志
(15分)
具体要求:
1)装饰器要求做到通用,可以装饰定长,不定长各种参数的函数.(4分)
2)装饰器可以正常实现功能。(4分)
3)创建文件first_aunser.py 导入 decorator.py中写好的装饰器,编写函数并装饰,函数功能自定义 函数需抛出异常,(4分)
4)时间装饰器打印函数运行时间 日志装饰器把函数运行中的信息写入本地txt文件。(3分)

import time
from functools import wraps
def get_time(fn):
    @wraps(fn)  #保护函数名不被改掉
    def inner(*args,**kwargs):
        start= time.time()
                #show()
        str1 = fn(*args,**kwargs)  #str1里存的是返回值
        end = time.time()
        print(f'函数执行时间是:{end-start}')
        return str1
    return inner

def loggin(fn):
    @wraps(fn)  #保护函数名不被改掉
    def inner(*args,**kwargs):
        str1= fn(*args,**kwargs)  #str1也是被装饰函数的返回值
        with open('日志.txt','a') as f:
            f.write(f'{str1}')
        return str1
    return inner

first_aunser.py

from  decorator import get_time,loggin

@get_time  #装饰器
@loggin  #装饰器
def show(): #函数 函数名 show  无参
    try:
         return 'hello'
    except BaseException as e:
        # print(e)
        return e
        #没有return

if __name__ == '__main__':
    show()

(二)创建名为express.py文件,编写以下推导式

# 1)求100以内所有除以3余数 为1,2,3,5,8,9 的数   (2分)
l1 = [i for i in range(100) if i%3 in [1,2,3,5,8,9]]
print(l1)
# 2)求100以内所有能被3整除的数的立方(2分)
l2 = [i**3 for i in range(100) if i%3==0]
print(l2)
# 3)取出列表list1=['aaa','test','monging',’like’]中长度大于3的数据(2分)
list1=['aaa','test','monging','like']
l3 = [i for i in list1 if len(i)>3]
print(l3)
# 4)List2= ['i','want','to','sleep','goodbey']  去除列表中包含 ‘e’ 且长度大于3的数据(2分)
list2= ['i','want','to','sleep','goodbey']
l4 = [i for i in list2 if i.count('e')==0 or len(i)<=3]
print(l4)
# 5)计算出1-10之间,11-20之间的数据组成的元祖列表(2分)
l5 = [(a,b) for a in range(1,10) for b in range(11,20)]
print(l5)
# 6)List3 = [[‘test’, ‘sleep’, ‘good’], [‘computer’,‘os’,‘threading’], [‘process’,‘queue’]] 取出列表中长度大于3且包含 ‘e’的元素(2分)
list3 = [['test', 'sleep', 'good'], ['computer','os','threading'], ['process','queue']]
l6 = [j for i in list3 for j in i if j.count('e') and len(j)>3]
print(l6)
# 7)List4=['T', 'D', 'K',],list5=['t', 'd', 'K',]把2个列表的元素相+组成一个新的列表(2分)
list4=['T', 'D', 'K',]
list5=['t', 'd', 'K',]
l7 = [f'{list4[i]}{list5[i]}' for i in range(3)]
print(l7)
# 8)Dict1 = {'name':‘david’,'age': 34, 'money': 7, 'score': 30} 把字典的key,value互换(2分)
Dict1 = {'name':'david','age':34,'money':7,'score':30}
d8 = {k:v for v,k in Dict1.items()}
print(d8)
# 9)Set1 = ['test’','computer','hight','hand','queue',threading] 用集合推导式统计字符串的长度 (2分)
Set1 = ['test','computer','hight','hand','queue','threading']
d9 = {len(k) for k in Set1}
print(d9)
# 10)List5= [[‘testpip’, ‘sleep’, ‘good’], [‘computer’,‘os’,‘threading’], [‘processp’,‘queue’]],取出列表中长度大于5且包含2个以上 p的元素 包含2个(2分)
List5= [['testpip', 'sleep', 'good'], ['computer','os','threading'], ['processp','queue']]
l10 = [j for i in List5 for j in i if len(j)>5 and j.count('p')>=2]
print(l10)
# 11)List7= ["{‘name’:’david’,‘age’:20}", “[20,30,40,50]”]将列表中的数据转换成正常格式(2分)
List7= ["{'name':'david','age':20}", "[20,30,40,50]"]
l11 = [eval(i) for i in List7]
print(l11)
# 12)List8=['陈百彤','王老大','孙晓红',‘王彤彤’]取出列表中包含彤的元素(3分)
List8=['陈百彤','王老大','孙晓红','王彤彤']
l12 = [i for i in List8 if i.count('彤')]
print(l12)

(三)创建一个process_study.py 编写一个多进程程序

具体要求:
1)开启4个进程 ,用循环的方式
2)进程 平均分配任务 计算1-1000能被2和3整除的数据
3)每个进程的结果以列表的格式放入队列中
4)把每个进程的结果写入到txt文件中
5)读取txt文件最后输出结果以 [[进程1的数据],[ 进程2的数据],[ 进程3的数据]] 格式

import multiprocessing

def get_num1(start,end,que):  #重复使用
    #1-250  #250-500  #500-750  #750-1000
    # print(start,end)
    listnum = []
    for i in range(start,end):
        if i%2 == 0 and i%3 == 0:
            listnum.append(i)
    que.put(listnum)  #把列表放到队列


if __name__ == '__main__':

    que = multiprocessing.Queue()
    list1 = [1,251,501,751]  #开始
    list2 = [251,501,751,1001]  #结束
    listmax = []
    for i in range(4):  #0-3
        pro1 = multiprocessing.Process(target=get_num1,args=(list1[i],list2[i],que))
        pro1.start()
        pro1.join()

    #队列里就有内容,4个列表
    while not que.empty():
        listmax.append(que.get())

    with open('进程.txt','a') as f:
        f.write(f'{listmax}')
    with open('进程.txt','r') as f:
        str1 = f.read()
    print(str1)


(四)创建一个thread_study.py 编写一个多线程程序

具体要求:
1)做一个要是用户名统计的程序,随机生成3000个8位数用户名包含大小写字母
2)把生成的用户名去重后放入队列中。 列表变集合
3)程序至少启动5个线程平均分配处理数据。
4)子线程分别统计用户名中每个字符出现的次数。
5)把每个线程的结果存入到txt文件中
6)读取txt文件,最后以字典格式输出结果[{线程1的id:[{}{}{}{}{}{}…600个字典]},{ {线程2的id:[结果]}……]。

import random
import string
import threading
from queue import Queue

#show属于线程
def show():
    thread_list = []  #600个字典
    dict2 = {}
    for i in range(600):
        str1 = que.get()
        # BntBUcWD  {'B':2,'n':1}  str1 = 张成磊磊   j =张  成   磊    磊    {张:1,成:1,磊:2}
        dict1 = {j:str1.count(j) for j in str1}  #str1是字符串  j是字母
        thread_list.append(dict1)  #列表里放字典
    # dict2[键] = 值    给字典赋值添加键值
    dict2[threading.currentThread().name] = thread_list
    last_list.append(dict2)


if __name__ == '__main__':
    set2 = set()  #集合,集合无序去重   列表有序支持重复
    que = Queue() #队列(线程)
    last_list = []

    for i in range(3000):
        str_num = ''.join(random.choices(string.ascii_letters,k=8))
        set2.add(str_num)  #实现去重
    for i in set2:  #i是字符串
        que.put(i)

    for i in range(5):
        thread1 = threading.Thread(target=show)
        thread1.start()
        thread1.join()

    with open('线程.txt', 'new') as f:
        f.write(f'{last_list}')

    with open('线程.txt','r') as f:
        print(f.read())

    # print(last_list)



(五)根据需求进行socket编程

具体要求:
服务端 创建一个service.py
1)以函数的格式来实现功能。
2)服务器无限循环接收客户端发过来的信息。
3)定义一个列表 ,列表中穿入一些特定字符,根据客户端发送的消息判断,r如果客户端发送的消息包含 特定字符 ,则把特定字符 替换成 ** 给用户发送过去,反之把用户发送的消息反转发送过去
4)服务器 把客户端发送的消息保存到 client.txt中
5)把客户端发送的 消息+ip+发送时间 保存到mysql数据库 表名 表结构自定义(需提供数据库截图)。
客户端 创建client.py。
1)客户端可以无限循环发送信息给服务端
2)写一个登陆装饰器 客户端只有在登陆的情况下才可以聊天。
3)客户端可以无限接受服务端发送过来的信息。
4)客户端保存服务器发送的消息到 servie.txt中。
5)当客户端发送 bey 或者exit 的时候 退出’

import socket
import threading


def msg(client):
    # 2.聊天
    while True:
        str1 = client.recv(1024).decode()
        print(str1)
        if str1 == 'bye' or str1 == 'exit':
            break

        #存文件
        #存数据库

        #过滤  循环敏 判断字符串  替换字符串
        count = 0  #统计敏感词的数量
        for i in str_list:
            if i in str1:  #hello
                str1 = str1.replace(i,'**')
                count +=1
        if count == 0:  #没有敏感词
            client.send(str1[::-1].encode())
        else:   #有敏感词
            client.send(str1.encode())



if __name__ == '__main__':
    #1.创建服务器
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.bind(('127.0.0.1',9009))
    server.listen(128)
    str_list = ['aa','boy']
    while True:
        client,ip = server.accept()

        thred1 = threading.Thread(target=msg,args=(client,))
        thred1.start()



客户端

import socket, threading
from functools import wraps

login = True  # 登录

def check_login(fn):  # msg
    @wraps(fn)
    def inner(*args, **kwargs):
        if login:   #判断  日志  统计时间
            fn(*args, **kwargs)  # msg()聊天
        else:
            print('请先登录')

    return inner


@check_login
def msg():
    while True:
        str1 = input('输入内容:')
        client.send(str1.encode())
        if str1 == 'bye' or str1 == 'exit':
            break

        str2 = client.recv(1024).decode()
        print(str2)
        # 存文件


if __name__ == '__main__':
    # 1.创建客户端
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('127.0.0.1', 9009))

    # 2.聊天
    thred1 = threading.Thread(target=msg)
    thred1.start()

你可能感兴趣的:(python,python,开发语言,数据分析)