• 易出错的代码


    md5模块

    def md5(user,pwd):
        md5 = hashlib.md5(user.encode('utf-8'))   #不是两个变量 是变量.encode(),没有等于不是encoding  也可以不加盐
        md5.update(pwd.encode('utf-8'))        #password.encode()  不是只有password
        return md5.hexdigest()            #hexdigest

     格式化

    user = 'liuda'
    pwd = '12345'
    print(f'{user}{pwd}')    #直接填在了括号里了变量,不用再在后面添加

     读取文件每一行(i)

    with open('register_txt', 'r', encoding='utf-8') as f1:
            for i in f1:             #不是f1.read()
                user, pwd = i.split('|')    #分别赋值

     管理员和用户登录模块

    # 出错点 # 之前 一直把他放里面和 if 构成一体  每一次执行 因为return 都会退出 for 循环 就不对
    def login(user,pwd):      #文件里的值(第三个写的好提供以后判断)  return随时跳出{字典}用的好  for else 好
        with open('userinfo', encoding='utf-8')as f:
            for line in f:
                username,password,ident  =  line.strip().split('|')
                # print(user , username , get_md5(user,pwd), password)    #这个可以用来判断对错
                if user == username and get_md5(user,pwd)==password:    #判断user不等 都不去判断密码
                    # if  里的 return 找到值了 返回+退出for循环
                    return {'result':True,'identify':ident,'username':username}  #默认返回元组 最好返回字典 更清晰
            else:              #返回result 做判断  返回username  做实例化  返回identify(值)对应的键 判断学生、管理员
                return {'result':False}
         #else 放在外面 和 for 构成一体  当for循环完后 还没有找到返回错误
    #另一种写法;  
    with open('userinfo', ‘rb’)as f:
       username,password,ident = line.decode('utf-8').strip().split('|')

    #因为是以字节的格式读出的,所以需要decode()解码一下

     执行函数的模块 (内存地址+())

    while flag:
        operate = [('上传',upload),('下载',download)]   #1 这个不是字符串 是内存地址啊
        for ind,opt in enumerate(operate,1):
            print(ind,opt[0])
        num = int(input('请输入o您要选择的操作 :'))
        operate[num-1][1](sk)       # ()执行    upload()   download()

    执行函数的模块  (反射(字符串)+())

    dic = {'filename':filename,'filesize':filesize,'operate':'upload'}
    dic = {'filename':filename,'operate':'download'}
    dic = {'user': username, 'passwd': password, 'operate': 'login'}
    if ret['flag']:
        while True:
            dic = pro_recv(conn)
            if hasattr(sys.modules[__name__],dic['operate']):    
                getattr(sys.modules[__name__],dic['operate'])(dic,conn)  
                #执行upload() login() download()
    #这款淡淡的颜色是 RGB(136,136,136)
    # html 模式是#888888 更深颜色是# 787878 这样 更浅颜色是#c8c8c8

     生产者消费者模型

    from multiprocessing import Process  
    from multiprocessing import Queue  #队列
    import time
    import random
    def producer(q,name):
        for i in range(5):
            food = '水果%s'%i
            q.put(food)
            time.sleep(random.uniform(1,5))
            print('%s 生产了 %s'%(name,food))
    def consumer(q,name):
        while 1:
            food = q.get()
            if not food: break          #主进程put(退出指令)退出 这里是指None
            time.sleep(random.uniform(0,1))  
            print('%s 吃了 %s'%(name,food))
    if __name__ == '__main__':
        q = Queue()
        pro_lst = ['paa','pbb','pcc']
        con_lst = ['CA','CB','CC','CD','CE']
        c_l = []
        p_l = []
        for con in con_lst:
            con1 = Process(target=consumer , args=(q,con))
            con1.start()
            c_l.append(con1)
        for pro in pro_lst:
            pro1 = Process(target=producer , args=(q,pro))
            pro1.start()
            p_l.append(pro1)
        for p in p_l:       #join()住  为了使producer 生产完所有东西才能退出
            p.join()        # 防止遗漏  
        for c in c_l:       #刚才没理解程序 把这里join住了因为子进程
            q.put(None)      #是while 所以一直没退出
                  #for 列表 发送退出 退出有while的多个con进程

     队列的阻塞和不等待

    from queue import Queue
    import queue
    q = Queue(3)
    q.put(1)
    q.put(1)
    q.put(1)
    #q.put(1) #如果有会阻塞在这,因为超出了队列的长度
    try : q.put_nowait(1)    #会丢失值,造成数据不安全的问题,因为抛异常处理了 except queue.Full: print('队列溢出,输出太多了') q.get() q.get()
    q.get()
    #q.get() #这里存在会阻塞在这,因为没有值了
    try : q.get_nowait() #有则接受,没有则抛异常 except queue.Empty:     print('没有值了,错误')

     队列不阻塞

    #from gevent import monkey;monkey.patch_all() # 不用都可以跳出queue队列输入输出
    import gevent
    from queue import Queue
    q = Queue(4)
    def f():
        q.put(1)
        q.put(2)
        q.put(3)
        q.put(4)
        q.put(5)
    def c():
        q.get()
        q.get()
        q.get()
        q.get()
    gevent.spawn(f)
  • 相关阅读:
    python字符串字典列表互转
    列表迭代器 ListIterator
    并发修改异常处理
    二月天 案例
    Calendar类
    Date类
    冒泡排序
    内部类
    python第三天
    Layui——checkbox使用
  • 原文地址:https://www.cnblogs.com/Doner/p/10621957.html
Copyright © 2020-2023  润新知