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

python-code-03

时间:2018-06-09 00:08:42      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:span   特点   时间   display   ide   swap   for   合法性   line   

函数作业:
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({},{},{}\n.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)
View Code

编写用户转账函数,实现功能
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(\n).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(\n).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(\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秒,则直接终止函数,无法认证,否则就从文件中清除锁定的用户信息,并允许用户进行认证
技术分享图片
import time
import os

name_info = []
with open(db,rt,encoding=utf-8) as f0:
    for line0 in f0:
        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 in f_lock:
        line1 = line1.strip(\n).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(\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 = 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(\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 in f1:
            line = line.strip(\n).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\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,**kwargs
5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递
可以保证,传入的参数中一定包含某些关键字
View Code

 

python-code-03

标签:span   特点   时间   display   ide   swap   for   合法性   line   

原文地址:https://www.cnblogs.com/xujinjin18/p/9157936.html

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