标签:
一、内置函数
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("你的输入有误")
四、代码流程图
标签:
原文地址:http://www.cnblogs.com/xuanouba/p/5557952.html