登录


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\n'%(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))        #打印

 

posted @ 2019-03-29 18:41  learnacode  阅读(257)  评论(0编辑  收藏  举报