Bootstrap

python的code函数_python-code-10

函数作业:

1、复习函数参数的使用

2、实现如下功能

编写用户注册函数,实现功能

1、在函数内接收用户输入的用户名、密码、余额

要求用户输入的用户名必须为字符串,并且保证用户输入的用户名不与其他用户重复

要求用户输入两次密码,确认输入一致

要求用户输入的余额必须为数字

2、要求注册的用户信息全部存放于文件中

importosdefread_from_db(name):"""从文件中读数据

:return:"""is_exist= os.path.exists('db.txt')#print(is_exist)

ifis_exist:

with open('db.txt', 'r') as f:

content=f.read()if name incontent:print('该用户已存在!')returnFalseelse: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('{},{},{}\n'.format(*args, **kwargs))

msg= '注册成功'

returnmsgdefregister():"""注册功能

:return:"""

while 1:

name= input('>>请输入用户名>>')#判断输入值是否合法

if notname.isalpha():print('用户名非法')continue

#用户是否已经注册过

name_exist =read_from_db(name)ifname_exist:

pwd= input('>>请输入密码>>')

re_pwd= input('>>请确认密码>>')if pwd !=re_pwd:print('两次密码不一致!')continuebalance= input('>>请输入余额>>')if notbalance.isdigit():print('输入余额非法!')continuemsg=save_to_db(name, pwd, balance)print(msg)else:continue

if __name__ == '__main__':

register()#read_from_db()

#save_to_db('c', 1, 1)

View Code

编写用户转账函数,实现功能

1、传入源账户名(保证必须为str)、目标账户名(保证必须为str)、转账金额(保证必须为数字)

2、实现源账户减钱,目标账户加钱

deffunc_transfer():importos

tag=True#取出当前文件内所有的用户名,用于后面判断账号名是否存在

line_name =[]

with open('db', 'rt', encoding='utf-8') as f_name:for line inf_name:

line= line.strip('\n').split(':')

line_name.append(line[0])whiletag:#验证转出账号名的合法性

name_s = input('转出账户名>>:').strip()if notname_s.isalpha():print('必须为纯字母')continue

if name_s not inline_name:print('转出账户名不存在')continue

#取出此账号名转账前的账号余额,用于后面判断后面转账金额是否足够

with open('db','rt',encoding='utf-8') as f_b:for line inf_b:

line= line.strip('\n').split(':')if name_s ==line[0]:

balance= line[2]

balance=int(balance)print('当前余额:%s' %balance)whiletag:#验证转入账号名的合法性

name_d = input('转入账户名>>:')if notname_d.isalpha():print('必须为纯字母')continue

if name_d not inline_name:print('转出账户名不存在')continue

whiletag:#验证转账金额是否充足

transfer_amount = input('转账金额>>:')if nottransfer_amount.isdigit():print('转账金额必须为整数')continuetransfer_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 inread_f:

line= line.strip('\n').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 +'\n'write_f.write(line_new)

os.remove('db')

os.rename('db.swap','db')print('转账完成')

tag=False

func_transfer()

View Code

编写用户验证函数,实现功能

1、用户输入账号,密码,然后与文件中存放的账号密码验证

2、同一账号输错密码三次则锁定

3、这一项为选做功能:锁定的账号,在五分钟内无法再次登录

提示:一旦用户锁定,则将用户名与当前时间写入文件,例如: egon:1522134383.29839

实现方式如下:

import time

current_time=time.time()

current_time=str(current_time) #当前的时间是浮点数,要存放于文件,需要转成字符串

lock_user='%s:%s\n' %('egon',current_time)

然后打开文件

f.write(lock_user)

以后再次执行用户验证功能,先判断用户输入的用户名是否是锁定的用户,如果是,再用当前时间time.time()减去锁定的用户名后

的时间,如果得出的结果小于300秒,则直接终止函数,无法认证,否则就从文件中清除锁定的用户信息,并允许用户进行认证

importtimeimportos

name_info=[]

with open('db','rt',encoding='utf-8') as f0:for line0 inf0:

line0= line0.strip('\n').split(':')

name_info.append(line0[0])#print(name_info)

lock_users=[]

with open('db_lock','rt',encoding='utf-8') as f_lock:for line1 inf_lock:

line1= line1.strip('\n').split(':')

lock_users.append(line1[0])#print(lock_users)

tag=Truewhiletag:

name_inp= input('username>>:').strip()if name_inp not inname_info:print('用户名不存在')continue

if name_inp inlock_users:

current_time=time.time()#print('用户已被锁定')

with open('db_lock', 'rt', encoding='utf-8') as f_lock_time:for line2 inf_lock_time:

line2= line2.strip('\n').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=Falseelse:

with open('db_lock','rt',encoding='utf-8') as f3,\

open('db_lock.swap','wt',encoding='utf-8') as f4:for line3 inf3:

line3_new= line3.strip('\n').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 inf1:

line= line.strip('\n').split(':')if name_inp ==line[0]:

name_pwd= line[1]breakcount= 1

while count <= 3:

pwd_inp= input('password>>:')if pwd_inp ==name_pwd:print('验证成功')

tag=Falsebreak

else:print('密码错误')

count+= 1

if count == 4:

current_time=time.time()

current_time=str(current_time)

lock_user= '%s:%s\n' %(name_inp, current_time)

with open('db_lock','at',encoding='utf-8') as f2:

f2.write(lock_user)print('%s 用户已被锁定五分钟' %name_inp)

tag= False

View Code

明日默写:

1、什么是形参?什么是实参?形参与实参的关系是什么?

形参:在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名

实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参,本质就是变量的值

形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定

View Code

2、介绍所有形参与实参及其特点

1、位置参数:按照从左到右的顺序定义的参数

位置形参:必选参数

位置实参:按照位置给形参传值2、关键字参数:按照key=value的形式定义的实参

无需按照位置为形参传值

注意的问题:1. 关键字实参必须在位置实参右面2. 对同一个形参不能重复传值3、默认参数:形参在定义时就已经为其赋值

可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)

注意的问题:1. 只在定义时赋值一次2. 默认参数的定义应该在位置形参右面3. 默认参数通常应该定义成不可变类型4、可变长参数:

可变长指的是实参值的个数不固定

而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递

可以保证,传入的参数中一定包含某些关键字

View Code

;