创建一个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()
# 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)
具体要求:
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)
具体要求:
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)
具体要求:
服务端 创建一个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()