• python-code-10


    函数作业:
    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)
    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('
    ').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()
    View Code

    编写用户验证函数,实现功能
    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
    View Code

    明日默写:
    1、什么是形参?什么是实参?形参与实参的关系是什么?
    形参:在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名
    实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参,本质就是变量的值
    形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定
    View Code

    2、介绍所有形参与实参及其特点
    1、位置参数:按照从左到右的顺序定义的参数
            位置形参:必选参数
            位置实参:按照位置给形参传值
    2、关键字参数:按照key=value的形式定义的实参
            无需按照位置为形参传值
            注意的问题:
                    1. 关键字实参必须在位置实参右面
                    2. 对同一个形参不能重复传值
    3、默认参数:形参在定义时就已经为其赋值
            可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
            注意的问题:
                    1. 只在定义时赋值一次
                    2. 默认参数的定义应该在位置形参右面
                    3. 默认参数通常应该定义成不可变类型
    4、可变长参数:
            可变长指的是实参值的个数不固定
            而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs
    5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递
    可以保证,传入的参数中一定包含某些关键字
    View Code
  • 相关阅读:
    “二柱子四则运算”终结版
    “睡眠猴子”团队项目及成员介绍
    最大联通子数组的和
    构建之法阅读笔记04
    构建之法阅读笔记03
    “进度条”博客——第五周
    构建之法阅读笔记02
    构建之法阅读笔记01
    “进度条”博客——第四周
    课后实验6--二维数组最大联通子数组的和
  • 原文地址:https://www.cnblogs.com/xujinjin18/p/9157936.html
Copyright © 2020-2023  润新知