易出错的代码

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)
原文地址:https://www.cnblogs.com/Doner/p/10621957.html