码迷,mamicode.com
首页 > 编程语言 > 详细

Python学习day04

时间:2016-06-04 00:30:43      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:

一、内置函数

divmod()     divmod(a,b)方法返回的是a//b(除法取整)以及a对b的余数,返回结果类型为tuple
callable()    可否被调用
chr()   将一个数字转换为ascii表中的字符
ord()   将一个字符转换为ascii表中的数字位置
compile()   将字符串编译成Python代码
exec()      执行上面编译完成的Python代码,不返回结果
evel()     执行表达式,并返回结果
isinstance()  判断对象是否为某个类的实例
filter(函数,可迭代对象)   循环第二个参数(可迭代对象),让每个元素作为第一个参数(函数)的参数执行一侧函数,如果函数的返回值为True,表示元素合法,将元素添加到filter()的返回值中
map(函数,可迭代对象)   循环第二个参数(可迭代对象),让每个元素作为第一个参数(函数)的参数执行一侧函数,如果函数的返回值为True,则返回True
globals()    所有的全局变量
locals()     所有的局部变量
len()  关于len函数,Python3里默认按照字符的长度来计算,可以通过bytes()函数将字符转换为字节,从而计算出字符的字节长度,而在Python2里默认是按照字节长度来计算的,不能求出字符的长度

二、装饰器

def deco(func):
    
    print func
    
    return func

@deco
 
def foo():pass

foo()

#第一个函数deco是装饰函数,它的参数就是被装饰的函数对象。我们可以在deco函数内对传入的函数对象做一番“装饰”,然后返回这个对象(记住一定要返回 ,不然外面调用foo的地方将会无函数可用。实际上此时foo=deco(foo))

#有参数装饰器

def decomaker(arg):  
    通常对arg会有一定的要求  
    """由于有参数的decorator函数在调用时只会使用应用时的参数  
       而不接收被装饰的函数做为参数,所以必须在其内部再创建  
       一个函数  
    """  
    def newDeco(func):    #定义一个新的decorator函数  
        print func, arg  
        return func  
    return newDeco  
@decomaker(deco_args)  
def foo():pass  
foo()  

#第一个函数decomaker是装饰函数,它的参数是用来加强“加强装饰”的。由于此函数并非被装饰的函数对象,所以在内部必须至少创建一个接受被装饰函数的函数,然后返回这个对象(实际上此时foo=decomaker(arg)(foo))

三、作业代码

# -*- coding:utf-8 -*-
#下方字典保存的是当前是否有用户登录,登录的用户名及所登录用户是否为管理员(默认无用户登录)
LOGIN_USER_INFO = {"is_login": False, "corrent": None, "admin": 2}


def outer(func):
    """
    装饰器,用来在用户改密码或者查看用户信息时判断当前是否有用户登录,无用户登录的话提示用户先登录
    :param func:
    :return:
    """
    def inner(*args, **kwargs):
        if LOGIN_USER_INFO[is_login]:    #如果当前有用户登录,正常进行函数运行
            r = func(*args, **kwargs)
            return r
        else:     #若果当前没有用户登录,返回请先登录提示
            return ("请先登录")
    return inner


def login(user,passwd):
    """
    登录接口
    :param user: 用户输入的用户名
    :param passwd: 用户输入的密码
    :return:
    """
    with open(UserInfoFile,r) as user_info:
        for line in user_info:
            temp_list = line.split("|")   #将文件中的用户信息切割成一个列表
            if user == temp_list[0] and passwd == temp_list[1]:   #如果用户名及密码正确,更改是否有用户登录字典中的相关信息
                LOGIN_USER_INFO["is_login"] = True
                LOGIN_USER_INFO["corrent"] = user
                LOGIN_USER_INFO["admin"] = temp_list[-2]
                return 欢迎访问
            elif user == temp_list[0] and passwd != temp_list[1]:  #如果密码错误
                return "用户名或密码错误"
        else:   #循环结束后没有找到用户名的情况
            return "该用户名不存在"


def register(user, passwd_one, passwd_two, email, tel_num, id_info,admin):
    """
    注册账号接口
    :param user:         用户输入的用户名
    :param passwd_one:   用户第一次输入的密码
    :param passwd_two:   用户输入的第二次密码
    :param email:        用户输入的email地址
    :param tel_num:      用户输入的电话号码
    :param id_info:      用户输入的身份证号码
    :return:
    """
    if passwd_one != passwd_two:
        return "两次密码不一致"
    elif "@" not in email or list(email).count("@") != 1:
        return "邮箱地址格式不合法"
    elif len(tel_num) != 11 or not tel_num.isdigit():
        return "电话号码不合法"
    elif len(id_info) != 18 or not id_info.isdigit():
        return "身份证号码不合法"
    elif admin not in [1,2]:
        return "选择是否为管理员账号时输入错误,请按照提示输入"
    else:    #如果用户输入条件全部正确
        temp_list = [user, passwd_one, email, tel_num, id_info,admin, \n]  #将用户输入内容保存在一个临时列表中
        with open("UserInfoFile",r+) as user_info:
            for line in user_info:
                exist_user = line.split("|")      #将用户信息文件打开并将每行内容按照‘|’分隔为一个临时列表
                if user == exist_user[0]:      #然后判断用户输入的用户名是否已存在
                    return "用户名已存在"
            else:          #如果用户输入的用户名不存在,将新用户信息写入到文件中,并返回注册成功
                temp_info = "|".join(temp_list)
                user_info.write(temp_info)
                return "恭喜,注册成功"


@outer               #使用装饰器判断当前是否有用户登录
def changepwd(user):
    """
    更改密码接口
    :param user:  当前登录的用户
    :return:
    """
    passwd_old = input("请输入当前密码:")
    passwd_new_one = input("请输入新密码:")
    passwd_new_two = input("确认新密码:")
    id_info = input("请输入身份证号码:")
    all_user_list = []    #用户信息文件中的信息按照行添加到该列表中
    with open("UserInfoFile",r+) as user_info:
        for line in user_info:
            all_user_list.append(line)
    for per_line in all_user_list:    #将所有用户信息列表中的信息循环
        temp_list = per_line.split("|")     #进行分割
        if user == temp_list[0]:        #找到用户输入的用户名的那一行
            if passwd_old != temp_list[1]:
                return "密码错误"
            elif passwd_new_one != passwd_new_two:
                return "两次密码不一致"
            elif id_info != temp_list[4]:
                return "身份证号码错误"
            elif passwd_old == temp_list[1] and id_info == temp_list[4]:  #如果用户输入的信息无误
                temp_list[1] = passwd_new_one    #先改变临时列表中的旧密码
                temp_info = "|".join(temp_list)    #将临时列表按照|拼接为一个字符串
                all_user_list[all_user_list.index(per_line)] = temp_info    #更新所有用户信息列表
    with open("UserInfoFile",w) as new_user_info:
        for line in all_user_list:                        #打开用户信息文件,将更新后的内容写入,并返回成功信息
            new_user_info.write(line)
        return "更改密码成功"


@outer                #使用装饰器判断当前是否有用户登录
def checkinfo(user):
    """
    查看用户信息接口
    :param user:   当前登录的用户名
    :return:
    """
    with open("UserInfoFile",r) as user_info:         #打开文件
        for line in user_info:                   #按照行循环文件
            temp_list = line.split("|")      #并将这行按照|分割为一个列表
            if user == temp_list[0]:          #找到当前用户的那一行,并返回用户信息
                return (‘‘‘用户名:%s \n邮箱地址:%s \n电话号码:%s \n身份证号码:%s‘‘‘)                       % (temp_list[0],temp_list[2],temp_list[3],temp_list[4])


def deluser(user):
    """
    删除普通用户接口
    :param user:  管理员输入的普通用户的用户名
    :return:
    """
    all_user_list = []         #用户信息文件中的信息按照行添加到该列表中
    with open("UserInfoFile",r+) as UserFile:
        for line in UserFile:              #打开用户信息文件将每行添加到所有用户信息列表中
            all_user_list.append(line)
    for line in all_user_list:            #循环所有用户信息列表,
        temp_list = line.split(|)          #按照|分割
        if user == temp_list[0]:           #找到管理员输入的用户名
            if temp_list[-2] == 2:         #如果用户输入的用户名是普通用户
                all_user_list.remove(line)       #在所有用户信息列表文件中删除
                with open("UserInfoFile",w) as NewUserFile:   #将跟新后的所有用户信息列表写入到用户信息文件中,并返回信息
                    for line in all_user_list:
                        NewUserFile.write(line)
                    return ("用户删除成功")
            else:              #如果用户输入的用户名的管理员用户,返回以下信息
                return "该用户为管理员用户,你没有权限删除"
    else:             #如果循环结束,代表为找到管理员输入的用户名,返回以下信息
        return "该用户名不存在"


def modpwd(user,new_passwd_one,new_passwd_two):
    """
    修改普通用户密码接口
    :param user:               管理员输入的普通用户的用户名
    :param new_passwd_one:     管理员输入的新密码
    :param new_passwd_two:     管理员再次输入的新密码
    :return:
    """
    all_user_info = []      #用户信息文件中的信息按照行添加到该列表中
    if new_passwd_one == new_passwd_two:    #如果用户输入的两次密码一致
        with open(UserInfoFile,r) as file:    #打开用户信息文件将每行添加到所有用户信息列表中
            for line in file:
                all_user_info.append(line)
        for line in all_user_info:          #循环所有用户信息列表,
            temp_list = line.split(|)            #按照|分割
            if user == temp_list[0]:           #找到管理员输入的用户名
                if temp_list[-2] == 1:      #如果管理员输入的用户名为管理员用户,提示以下信息
                    return "该用户为管理员用户,你没有权限更改管理员用户的密码"
                else:                 #如果管理员输入的用户名为普通用户
                    temp_list[1] = new_passwd_one        #更改临时列表中用户的密码为新密码
                    all_user_info[all_user_info.index(line)] = "|".join(temp_list)   #更新到所有用户信息列表中
                    with open("UserInfoFile",w) as new_user_info:   #将更新后的所有用户信息列表写入到用户信息文件中,并返回信息
                        for line in all_user_info:
                            new_user_info.write(line)
                        return "更改密码成功"
        else:         #如果循环结束,代表为找到管理员输入的用户名,返回以下信息
            return "该用户名不存在"
    else:        #如果管理员输入的两次密码不一致
        return "两次密码输入不一致"


def proauth(user):
    """
    提升普通用户为管理员接口
    :param user:    管理员输入的用户名
    :return:
    """
    all_user_info = []                  #用户信息文件中的信息按照行添加到该列表中
    with open(UserInfoFile,r) as file:         #打开用户信息文件将每行添加到所有用户信息列表中
        for line in file:
            all_user_info.append(line)
    for line in all_user_info:           #循环所有用户信息列表,
        temp_list = line.split(|)        #按照|分割
        if user == temp_list[0]:          #找到管理员输入的用户名
            if temp_list[-2] == 2:      #如果管理员输入的用户名为普通用户,在临时列表中更改为管理员用户
                temp_list[-2] = 1
                all_user_info[all_user_info.index(line)] = "|".join(temp_list)  #并将更新写到所有用户信息列表中
                with open("UserInfoFile",w) as new_user_info:
                    for line in all_user_info:            #将更新后的所有用户信息列表写入到用户信息文件中,并返回信息
                        new_user_info.write(line)
                    return "提升用户权限成功"
            else:          #如果管理员输入的用户名为管理员,提示以下信息
                return "该用户已为管理员用户"
    else:           #如果循环结束,代表为找到管理员输入的用户名,返回以下信息
        return "该用户名不存在"


def sear_res(choice,enter):
    """
    精确搜索并返回用户信息接口
    :param choice:
    :param enter:
    :return:
    """
    all_user_info = []                   #用户信息文件中的信息按照行添加到该列表中
    last_res = []  #该列表为查找到的用户信息,格式为[[‘an‘, ‘sdfa@sdf‘, ‘17654378900‘, ‘000000000000000001‘],[...],...]
    with open(UserInfoFile,r) as file:
        for line in file:                   #打开用户信息文件将每行添加到所有用户信息列表中
            all_user_info.append(line)
    for line in all_user_info:              #循环所有用户信息列表,
        temp_list = line.split(|)         #按照|分割
        if temp_list[-2] == 2:             #如果是普通用户
            if enter in temp_list[choice]:        #如果匹配到用户搜索的内容
                temp_list.remove(temp_list[1])      #将用户信息中的密码删除
                temp_list.remove(temp_list[-1])     #删除最后的换行符
                temp_list.remove(temp_list[-1])      #删除是否为管理员用户的标志位
                last_res.append(temp_list)           #将该用户信息添加到列表中
    if not last_res:            #如果列表最后为空,代表未匹配到任何内容
        return "不存在该用户"
    else:
        return last_res


def acc_search():
    """
    管理员精确搜索用户信息接口,但该接口只用来判断用户的输入内容,搜索通过sear_res函数来接行
    :return:
    """
    sea_item = input("1、用户名\n2、邮箱\n3、手机号\n4、身份证号码\n你要查找哪一项:")
    if sea_item == 1:
        enter = input("请输入用户名:")
    elif sea_item == 2:
        enter = input("请输入邮箱地址:")
    elif sea_item == 3:
        enter = input("请输入手机号:")
    elif sea_item == 4:
        enter = input("请输入身份证号码")
    else:             #如果用户的输入为其他内容,提示以下信息
        return "你的输入错误"
    if sea_item == 1:           #在所有用户信息列表中用户名的索引为0
        return sear_res(0,enter)
    elif sea_item in [2,3,4]:     #在所有用户信息列表中邮箱,手机号,身份证号码分别对应的索引为2,3,4
        return sear_res(int(sea_item),enter)


def fuz_search(content):
    """
    管理员模糊搜索普通用户信息接口
    :return:
    """
    all_user_info = []                  #用户信息文件中的信息按照行添加到该列表中
#下列表为查找到的用户信息,格式为[[‘chenxuanliang‘, ‘chenxuanliang@sunladns.com‘, ‘18765434562‘, ‘198765437819019987‘],[...]]
    last_res = []
    with open(UserInfoFile,r) as file:         #打开用户信息文件将每行添加到所有用户信息列表中
        for line in file:
            all_user_info.append(line)
    for line in all_user_info:           #循环所有用户信息列表,
        temp_list = line.split(|)        #按照|分割
        if temp_list[-2] == 2:         #如果是普通用户,
            temp_list.remove(temp_list[1])      #将用户信息中的密码删除
            temp_list.remove(temp_list[-1])     #删除最后的换行符
            temp_list.remove(temp_list[-1])      #删除是否为管理员用户的标志位
            temp_str = "".join(temp_list)      #将临时用户信息列表中内容连接
            if enter in temp_str:            #如果在临时字符串中匹配到管理员输入的内容
                last_res.append(temp_list)    #将临时列表添加到最终结果列表中
    if not last_res:            #如果列表最后为空,代表未匹配到任何内容
        return "不存在该用户"
    else:
        return last_res


while True:
    if LOGIN_USER_INFO["is_login"]:           #如果当前有用户登录
        if LOGIN_USER_INFO["admin"] == "2":       #如果当前登录的用户为普通用户
            user_choice = input("1、改密码\n2、查看本用户信息\n请输入你的选择(输入‘q‘退出):")
        else:           #如果当前登录的用户为管理员用户
            user_choice = input("1、改密码\n2、查看本用户信息\n3、删除普通用户\n"
                                "4、添加普通用户\n5、更改普通用户密码\n"
                                "6、提升普通用户权限\n7、精确查找用户\n8、模糊查找用户\n请输入你的选择(输入‘q‘退出):")
        if user_choice.isdigit():    #如果当前有用户登录,那么下方的用户输入判断要忽略前两个判断
            user_choice = str(int(user_choice) + 2)
    else:   #如果当前无用户登录
        user_choice = input("1、登录\n2、注册\n3、改密码\n4、查看本用户信息\n请输入你的选择(输入‘q‘退出):")

    if user_choice == 1:
        username = input("请输入用户名: ")
        pwd = input("请输入密码: ")
        result = login(username,pwd)        #调用登录接口
        print(result)
    elif user_choice == 2:
        username = input("请输入用户名:")
        pwd_one = input("请输入密码:")
        pwd_two = input("请再次输入密码:")
        mail_addr = input("请输入邮箱地址:")
        tele_num = input("请输入电话号码:")
        ID = input("请输入身份证号:")
        admin = input("是否为管理员账户(是输入1,不是输入2):")
        result = register(username,pwd_one,pwd_two,mail_addr,tele_num,ID,admin)   #调用注册函接口
        print(result)
    elif user_choice == 3:
        result = changepwd(LOGIN_USER_INFO["corrent"])       #调用更改密码接口
        print(result)
    elif user_choice == 4:
        result = checkinfo(LOGIN_USER_INFO["corrent"])   #调用查看本用户信息接口
        print(result)
    elif user_choice == 5:
        user = input("请输入要删除的用户名:")
        result = deluser(user)            #调用删除用户接口
        print(result)
    elif user_choice == 6:
        username = input("请输入用户名:")
        pwd_one = input("请输入密码:")
        pwd_two = input("请再次输入密码:")
        mail_addr = input("请输入邮箱地址:")
        tele_num = input("请输入电话号码:")
        ID = input("请输入身份证号:")
        admin = 2
        result = register(username,pwd_one,pwd_two,mail_addr,tele_num,ID,admin)   #调用添加普通用户接口
        print(result)
    elif user_choice == 7:
        username = input("请输入用户名:")
        passwd_one = input("请输入密码:")
        passwd_two = input("请再次输入密码:")
        result = modpwd(username,passwd_one,passwd_two)    #调用更改普通用户密码接口
        print(result)
    elif user_choice == 8:
        username = input("请输入用户名:")
        result = proauth(username)          #调用提升普通用户权限接口
        print(result)
    elif user_choice == 9:
        result = acc_search()           #调用精确查找用户接口
        if type(result) == list:          #如果返回值是一个列表说明是返回值是正确值,按照以下格式输出
            print({:<30}.format("用户名"),{:<30}.format("邮箱地址"),{:<20}.format("手机号"),{:<20}.format("身份证号码"))
            for line_list in result:
                print({:<30}.format(line_list[0]),{:<30}.format(line_list[1]),{:<30}.format(line_list[2]),{:<30}.format(line_list[3]))
        else:   #否则直接输入返回值
            print(result)
    elif user_choice == 10:
        enter = input("请输入关键字:")
        result = fuz_search(enter)
        if type(result) == list:          #如果返回值是一个列表说明是返回值是正确值,按照以下格式输出
            print({:<30}.format("用户名"),{:<30}.format("邮箱地址"),{:<20}.format("手机号"),{:<20}.format("身份证号码"))
            for line_list in result:
                print({:<30}.format(line_list[0]),{:<30}.format(line_list[1]),{:<30}.format(line_list[2]),{:<30}.format(line_list[3]))
        else:   #否则直接输入返回值
            print(result)
    elif user_choice == q:
        break
    else:
        print("你的输入有误")

四、代码流程图

技术分享

Python学习day04

标签:

原文地址:http://www.cnblogs.com/xuanouba/p/5557952.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!