import hashlib def md5(username,password): # 可复用 多次用 md5_obj = hashlib.md5(username[::-1].encode('utf-8'))#翻转盐 md5_obj.update(password.encode('utf-8')) return md5_obj.hexdigest() def get_line(): #可复用 with open('userinfo', encoding='utf-8',mode='r') as f: for line in f: user, pwd = line.strip().split(',') yield user,pwd def register(): flag = True while flag: user1 = input('user: ') pwd1 = input('pwd: ') for user,pwd in get_line(): if user == user1: print('你输入的用户名已经存在!') break else: flag = False pwd1 = md5(user1,pwd1) with open('userinfo', encoding='utf-8',mode='a') as f: f.write('%s,%s '%(user1,pwd1)) def login(): register() user2 = input('user: ') pwd2 = input('pwd: ') for user, pwd in get_line(): if user == user2 and pwd == md5(user2,pwd2): return True ret = login() if ret: print('登陆成功')
计算器
import re # 引用正则 def mul_div(exp): # 乘法 和 除法 ''' 计算最简单的两个数之间的乘除法 :param exp: str数据类型的 两个数的乘除法表达式,例如'2.34*3.21' :return: str数据类型的计算结果 ''' if '*' in exp: # 判断‘*’是否 在其中 a,b = exp.split('*') #乘号两边相乘 return str(float(a)*float(b)) #计算两个的乘积 字符串方便之后替换 else: # 否 a, b = exp.split('/') # 判断除 return str(float(a) / float(b)) # 计算除法 def format_exp(exp): # 该算法运算符的格式 ''' 完成表达式格式整理,将一些叠在一起的符号整理成一个符号 :param exp: str数据类型的表达式 '1.23++3+-4--5' :return: 整理之后的str数据类型的字符串,'1.23+3-4+5' ''' exp = exp.replace('++','+') # ++ 的 + exp = exp.replace('-+','-') # +- 的- exp = exp.replace('+-','-') # -+ 的+ exp = exp.replace('--','+') #-- 的+ return exp #返回 字符 def cal_no_bracket(no_bracket_exp): # 计算器没有括号的函数 形参没有括号的例子 ''' 计算内部不再有其他小括号的表达式 :param no_bracket_exp:字符串数据类型的,内部不再含有其他小括号的表达式,例如:(9-2*5/3+7/3*99/4*2998+10*568/14) :return: float数据类型的结果 ''' # 再计算乘除法 while True: # 循环 mul_dic_exp = re.search('d+(.d+)?[*/]-?d+(.d+)?', no_bracket_exp) #判断传入的第一个括号 # 前面没有符号是这样3-2*-3替代是3-(-6)=9而不是3(6)=36 if mul_dic_exp: #如果括号里的东西不为空 md_exp = mul_dic_exp.group() # 结果集的东西给了新变量 res = mul_div(md_exp) #去mul里去乘 no_bracket_exp = no_bracket_exp.replace(md_exp, res) #替换 else:break #没有则跳出 # 表达式中的符号管理,把++ 编程+ ,--变成+ no_bracket_exp = format_exp(no_bracket_exp) # 格式化符号 # 再计算加减法 res_lst = re.findall('[-+]?d+(?:.d+)?',no_bracket_exp) #判断加法 前面没有的用问号 sum_n = 0 # 加入变量sum for i in res_lst: #循环出 每个元素 sum_n += float(i) #把各个数加起来 return sum_n #返回 和变量 def remove_bracket(exp): #删除 括号把括号里的都得出值来 给一个值 ''' 将表达式中所有的括号都计算出结果,替换原有的表达式,直到这个表达式内不再含有括号 :param exp:str类型带着括号的表达式'1-2*((60-30+(9-2*5/3+7/3*99/4*2998+10*568/14)*(-40/5))-(-4*3)/(16-3*2))' :return:str类型的不带括号的表达式'1-2*-1388335.8476190479' ''' # 先计算括号内的 while True: #循环 ret = re.search('([^()]+)', exp) #1-2*5 匹配出括号里的并付给一个值 if ret: #如果有 则执行下 no_bracket_exp = ret.group() # (9-2*5/3+7/3*99/4*2998+10*568/14) #结果集返回给 不要括号的 res = cal_no_bracket(no_bracket_exp) # (9-2*5/3+7/3*99/4*2998+10*568/14) #在计算没括号里计算并给一个变量 exp = exp.replace(no_bracket_exp,str(res)) #替换变量 else:break #退出循环 return exp #返回值 def calculator(exp): #计算器函数 ''' 处理原始表达式格式,去掉括号并且进行最后一步计算 :param exp:原始的字符串格式的表达式 :return:float类型的结果 ''' exp = exp.replace(' ','') #把空格 去除 ret = remove_bracket(exp) #计算括号里的值 给新变量 return cal_no_bracket(ret) #在计算器没有括号里计算 exp = '1 - 2 * ( (60-30 + (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )*(-40/5)) - (-4*3)/ (16-3*2) )' #变量 res = calculator(exp) # 计算器 变量 print(res,type(res)) #打印