函数作业:
1、复习函数参数的使用
2、实现如下功能
编写用户注册函数,实现功能
1、在函数内接收用户输入的用户名、密码、余额
要求用户输入的用户名必须为字符串,并且保证用户输入的用户名不与其他用户重复
要求用户输入两次密码,确认输入一致
要求用户输入的余额必须为数字
2、要求注册的用户信息全部存放于文件中
import os def read_from_db(name): """ 从文件中读数据 :return: """ is_exist = os.path.exists('db.txt') # print(is_exist) if is_exist: with open('db.txt', 'r') as f: content = f.read() if name in content: print('该用户已存在!') return False else: return else: # 创建文件 with open('db.txt', 'w'): pass # return True def save_to_db(*args, **kwargs): print(args) """ 将数据保存到数据库 :return: """ with open('db.txt', 'a') as f: f.write('{},{},{} '.format(*args, **kwargs)) msg = '注册成功' return msg def register(): """ 注册功能 :return: """ while 1: name = input('>>请输入用户名>>') # 判断输入值是否合法 if not name.isalpha(): print('用户名非法') continue # 用户是否已经注册过 name_exist = read_from_db(name) if name_exist: pwd = input('>>请输入密码>>') re_pwd = input('>>请确认密码>>') if pwd != re_pwd: print('两次密码不一致!') continue balance = input('>>请输入余额>>') if not balance.isdigit(): print('输入余额非法!') continue msg = save_to_db(name, pwd, balance) print(msg) else: continue if __name__ == '__main__': register() # read_from_db() # save_to_db('c', 1, 1)
编写用户转账函数,实现功能
1、传入源账户名(保证必须为str)、目标账户名(保证必须为str)、转账金额(保证必须为数字)
2、实现源账户减钱,目标账户加钱
def func_transfer(): import os tag = True #取出当前文件内所有的用户名,用于后面判断账号名是否存在 line_name = [] with open('db', 'rt', encoding='utf-8') as f_name: for line in f_name: line = line.strip(' ').split(':') line_name.append(line[0]) while tag: #验证转出账号名的合法性 name_s = input('转出账户名>>: ').strip() if not name_s.isalpha(): print('必须为纯字母') continue if name_s not in line_name: print('转出账户名不存在') continue #取出此账号名转账前的账号余额,用于后面判断后面转账金额是否足够 with open('db','rt',encoding='utf-8') as f_b: for line in f_b: line = line.strip(' ').split(':') if name_s == line[0]: balance = line[2] balance = int(balance) print('当前余额:%s' %balance) while tag: #验证转入账号名的合法性 name_d = input('转入账户名>>: ') if not name_d.isalpha(): print('必须为纯字母') continue if name_d not in line_name: print('转出账户名不存在') continue while tag: #验证转账金额是否充足 transfer_amount = input('转账金额>>: ') if not transfer_amount.isdigit(): print('转账金额必须为整数') continue transfer_amount = int(transfer_amount) if transfer_amount > balance: print('余额不足,从新输入') continue #上面的条件都符合,则修改文件 with open('db','rt',encoding='utf-8') as read_f, open('db.swap','wt',encoding='utf-8') as write_f: for line in read_f: line = line.strip(' ').split(':') if name_s == line[0]: line[2] = int(line[2]) - transfer_amount line[2] = str(line[2]) if name_d == line[0]: line[2] = int(line[2]) + transfer_amount line[2] = str(line[2]) line_new = ':'.join(line) line_new = line_new +' ' write_f.write(line_new) os.remove('db') os.rename('db.swap','db') print('转账完成') tag = False func_transfer()
编写用户验证函数,实现功能
1、用户输入账号,密码,然后与文件中存放的账号密码验证
2、同一账号输错密码三次则锁定
3、这一项为选做功能:锁定的账号,在五分钟内无法再次登录
提示:一旦用户锁定,则将用户名与当前时间写入文件,例如: egon:1522134383.29839
实现方式如下:
import time
current_time=time.time()
current_time=str(current_time) #当前的时间是浮点数,要存放于文件,需要转成字符串
lock_user='%s:%s ' %('egon',current_time)
然后打开文件
f.write(lock_user)
以后再次执行用户验证功能,先判断用户输入的用户名是否是锁定的用户,如果是,再用当前时间time.time()减去锁定的用户名后
的时间,如果得出的结果小于300秒,则直接终止函数,无法认证,否则就从文件中清除锁定的用户信息,并允许用户进行认证
import time import os name_info = [] with open('db','rt',encoding='utf-8') as f0: for line0 in f0: line0 = line0.strip(' ').split(':') name_info.append(line0[0]) # print(name_info) lock_users = [] with open('db_lock','rt',encoding='utf-8') as f_lock: for line1 in f_lock: line1 = line1.strip(' ').split(':') lock_users.append(line1[0]) # print(lock_users) tag = True while tag: name_inp = input('username>>: ').strip() if name_inp not in name_info: print('用户名不存在') continue if name_inp in lock_users: current_time = time.time() # print('用户已被锁定') with open('db_lock', 'rt', encoding='utf-8') as f_lock_time: for line2 in f_lock_time: line2 = line2.strip(' ').split(':') if name_inp == line2[0]: name_lock_time = line2[1] name_lock_time = float(name_lock_time) # print(name_lock_time,type(name_lock_time)) valid_time = current_time - name_lock_time #时间戳差值转为秒 if valid_time < 300: print('锁定状态') tag = False else: with open('db_lock','rt',encoding='utf-8') as f3, open('db_lock.swap','wt',encoding='utf-8') as f4: for line3 in f3: line3_new = line3.strip(' ').split(':') if name_inp != line3[0]: f4.write(line3) os.remove('db_lock') os.rename('db_lock.swap','db_lock') with open('db', 'rt', encoding='utf-8') as f1: for line in f1: line = line.strip(' ').split(':') if name_inp == line[0]: name_pwd = line[1] break count = 1 while count <= 3: pwd_inp = input('password>>: ') if pwd_inp == name_pwd: print('验证成功') tag = False break else: print('密码错误') count += 1 if count == 4: current_time = time.time() current_time = str(current_time) lock_user = '%s:%s ' % (name_inp, current_time) with open('db_lock','at',encoding='utf-8') as f2: f2.write(lock_user) print('%s 用户已被锁定五分钟' %name_inp) tag = False
明日默写:
1、什么是形参?什么是实参?形参与实参的关系是什么?
形参:在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名
实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参,本质就是变量的值
形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定
2、介绍所有形参与实参及其特点
1、位置参数:按照从左到右的顺序定义的参数 位置形参:必选参数 位置实参:按照位置给形参传值 2、关键字参数:按照key=value的形式定义的实参 无需按照位置为形参传值 注意的问题: 1. 关键字实参必须在位置实参右面 2. 对同一个形参不能重复传值 3、默认参数:形参在定义时就已经为其赋值 可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参) 注意的问题: 1. 只在定义时赋值一次 2. 默认参数的定义应该在位置形参右面 3. 默认参数通常应该定义成不可变类型 4、可变长参数: 可变长指的是实参值的个数不固定 而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs 5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递 可以保证,传入的参数中一定包含某些关键字