python进阶--月考四

python进阶--月考四

  • (一)创建my_web.py,使用socket以及多线程,完成以下需求
  • (二)创建my_gen.py,使用python装饰器完成如下需求
  • (三)创建my_process.py,使用python多进程完成如下需求,文件批量复制
  • (四)创建my_test.py,完成以下推导式

(一)创建my_web.py,使用socket以及多线程,完成以下需求

1.创建数据库,表自定义,字段包括ip,port,记录时间
2.实现简单的web静态服务器
3.定义入库函数to_sql,将客户端的ip,端口port,写入到mysql中
4.定义查询函数read_sql,将表内的所有信息进行返回,并根据时间进行排序
5.以多线程的方式运行所有函数
6.根据浏览器的不同接口返回对应的信息
	import datetime
import multiprocessing
import socket
import threading

import pymysql

#web
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='12345678',
    db='chat'
)
cursor = conn.cursor()

def to_sql(ip,port,time1):
    sql = f"insert month_4(ip,port,time1) values('{ip}','{port}','{time1}')"
    cursor.execute(sql)  #执行sql语句
    conn.commit()

    #给浏览器一个回复
    str1 = 'HTTP/1.1 200 Ok\nServer:zb\n\n成功'
    cliet.send(str1.encode(encoding='gbk'))

def read_data():
    sql = "select * from month_4 order by time1;"  # 查询
    cursor.execute(sql)  # 执行
    datastr = cursor.fetchall()  # 取结果

    # 给浏览器一个回复
    str1 = f'HTTP/1.1 200 Ok\nServer:zb\n\n{datastr}'
    cliet.send(str1.encode(encoding='gbk'))

if __name__ == '__main__':
    #1.服务器
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.bind(('127.0.0.1',9008))
    server.listen(128)
    # while True:
    #ip里存的是客户端的ip地址和端口号 ('127.0.0.1',9008)
    cliet,ip = server.accept()

    #请求报文
    requst = cliet.recv(1024).decode()
    print(requst)

    path = requst.split(' ')[1]  #地址['get'0,'/'1,'HTTP/1.1']
    if path == '/to_sql':
        thre1 = threading.Thread(target=to_sql,args=(ip[0],ip[1],datetime.datetime.now()))
        thre1.start()
        thre1.join()

    elif path == '/read_sql':
        #读数据库
        thre1 = threading.Thread(target=read_data)
        thre1.start()
        thre1.join()



(二)创建my_gen.py,使用python装饰器完成如下需求

1.定义一个读取附件test.txt的函数,依次读取文件,每次只能读取一行内容
2.定义一个记录函数执行次数的装饰器,将执行的次数写入到本地文件中,格式为函数名称,执行的次数为xx
3.定义一个日志装饰器,将1中的函数执行的结果写入到本地文件中
4.定义一个让函数变慢的装饰器,装饰日志装饰器即可,参数为需要变慢的时间
5.先需要执行2装饰器,3装饰器后执行,保证执行效果
import time
from functools import wraps
count1 = 0
flag = 0  #从哪儿开始读文件
#次数
def count(fn):
    @wraps(fn)
    def inner(*args,**kwargs):
        global count1
        str1 = fn(*args,**kwargs)
        with open('次数.txt','w') as f:
            f.write(f'{count1}')
		count1+=1
        return str1
    return inner

#变慢
def slow(mytime):
    def outer(fn):
        @wraps(fn)
        def inner(*args, **kwargs):
            time.sleep(mytime)
            str1 = fn(*args, **kwargs)
            return str1
        return inner
    return outer

#日志
@slow(mytime=3)
def loggin(fn):
    @wraps(fn)
    def inner(*args,**kwargs):
        str1 = fn(*args,**kwargs)
        with open('日志.txt','a') as f:
            f.write(f'{str1}')
        return str1
    return inner


@loggin
@count
def show():
    #读文件
    global flag
    with open('test.txt','r') as f:
        f.seek(flag)
        str1 = f.readline()
    flag += len(str1)+1
    return str1

if __name__ == '__main__':
     while True:
        str1 = show()
        if not str1:  #空
            break

(三)创建my_process.py,使用python多进程完成如下需求,文件批量复制

1.读取附件中文件的详细信息,合理的方式进行存储
2.创建一个新的文件夹,多次创建需要捕获异常
3.获取待复制的文件的名字
4.创建多进程开始复制功能
5.文件复制的函数需要单独定义
import multiprocessing
import os

#文件复制的函数
def copy_file(i):
    with open(f'复制/{i}', 'rb') as f:
        with open(f'b/{i}', 'wb') as f2:
            f2.write(f.read())


if __name__ == '__main__':
    #创建文件夹b
    try:
        os.mkdir('b')
    except FileExistsError as e:
        print('文件夹已存在')

    files = os.listdir('复制')  # 列表

    for i in files:  # 每个字符串-文件的名字
        print(f'要复制的文件名是:{i}')
        pro1 = multiprocessing.Process(target=copy_file, args=(i,))
        pro1.start()
        pro1.join()





(四)创建my_test.py,完成以下推导式

# 1.构建如下列表[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
l1=[(i,i+1) for i in range(5)]
print(l1)
# 2.求出50以内能被3整除的数的平方,并放入到一个列表中
l2=[i**2 for i in range(50) if i%3==0]
print(l2)
# 3.[{“科目”:“政治”, “成绩”:98}, {“科目”:“语文”, “成绩”:77}, {“科目”:“数学”, “成绩”:99}, {“科目”:“历史”, “成绩”:65}]去除列表中成绩小于70的字典
set3=[{'科目':'政治', '成绩':98}, {'科目':'语文', '成绩':77}, {'科目':'数学', '成绩':99}, {'科目':'历史', '成绩':65}]
l3=[i for i in set3 if i.get('成绩')>=70]
print(l3)
# 4.给定列表[[1,2,3],[4,5,6],[7,8,9]],期望输出[1,5,9]
list4=[[1,2,3],[4,5,6],[7,8,9]]
l4=[list4[i][i] for i in range(3)]
print(l4)
# 5.有三个数字:1、2、3、组成互不相同且无重复数字的三位数并打印
l5=[f'{a}{b}{c}' for a in range(1,4) for b in range(1,4) for c in range(1,4) if a!=b and a!=c and b!=c]
print(l5)
# 6.获取字典{"a":10,"B":20,"C":True,"D":"hello world","e":"python教程"}中key值是小写字母的键值对
set6={"a":10,"B":20,"C":True,"D":"hello world","e":"python教程"}
s6={k:v for k,v in set6.items() if k.islower()}
print(s6)
# 7.cookies = "anonymid=jy0ui55o-u6f6zd; depovince=GW; _r01_=1;"将上述部分cookies信息转为字典存储,每一项作为一个键值对
cookies = "anonymid=jy0ui55o-u6f6zd;depovince=GW;_r01_=1;"
  s7 = {i.split('=')[0]: i.split('=')[1] for i in cookies.split(';') if i!=''}
    print(s7)
# 8.将dict_a = {'a': 2, 'B': 5, 'A': 7, 'C': 10}的key中大小写相同的字母的value值求和
dict_a = {'a': 2, 'B': 5, 'A': 7, 'C': 10}
l8={k.upper():dict_a.get(k.upper(),0)+dict_a.get(k.lower(),0) for k,v in dict_a.items()}
print(l8)
# 9.将两个长度相同的列表合并成字典
name = ['zhangsan', 'lisi', 'wangwu', 'maliu']
sign = ['双鱼座', '天蝎座', '水瓶座', '巨蟹座']
l9={name[i]:sign[i] for i in range(len(name))}
print(l9)
# 10.使用生成器推导式计算1-100中所有数的平方根,并转为列表存储
l10=(i**0.5 for i in range(1,101))
print(list(l10))

你可能感兴趣的:(python,python)