• 路飞学城Python-Day14(practise)


    本章总结

    练习题

    1.logging模块有几个日志级别?
    5个,按级别从高到低分别是 CRITICAL(灾难)>ERROR(错误)>WARNING(警示)>INFO(信息)>DEBUG(调试)

    2.请配置logging模块,使其在屏幕和文件里同时打印以下格式的日志
    2017-10-18 15:56:26,613 - access - ERROR - account [1234] too many login attempts
    import logging
     
    # 生成logger对象
    log = logging.getLogger('access.log')
    # 生成handler对象
    ch = logging.StreamHandler()
    # ch.setLevel(logging.error)
    fh = logging.FileHandler('access.log')
    # fh.setLevel(logging.error)
    # 把handler对象绑定到logger
    log.setLevel(logging.DEBUG)
    log.addHandler(ch)
    log.addHandler(fh)
    # 生成formatter对象
    file = logging.Formatter('%(asctime)s-%(filename)s-%(levelname)s-%(message)s')
    console = logging.Formatter('%(asctime)s-%(filename)s-%(levelname)s-%(message)s')
    # 把formatter对象绑定handler对象
    ch.setFormatter(console)
    fh.setFormatter(file)
    log.error('account [1234] too many login attempts')

    3.json、pickle、shelve三个区别是什么?
    首先,这三个模块都是序列化工具。
    1. json是所有语言的序列化工具,优点跨语言、体积小.只能序列化一些基本的数据类型。intstrlist upledict
    pickle是python语言特有序列化工具,所有数据都能序列化。只能在python中使用,存储数据占空间大.
    shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式。
    2. 使用方式,json和pickle用法一样,shelve是f = shelve.open('shelve_test')

    4.json的作用是什么?
    序列化是指把内存里的数据类型转变成字符串,
    以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes

    5.subprocess执行命令方法有几种?
    有三种方法,他们分别是run()方法;call()方法;Popen()方法
     

    6.为什么要设计好目录结构?
    1.可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等。从而非常快速的了解这个项目。
    2.可维护性高: 定义好组织规则后,维护者就能很明确地知道,新增的哪个文件和代码应该放在什么目录之下。这个好处是,随着时间的推移,
    代码/配置的规模增加,项目结构不会混乱,仍然能够组织良好。

    7.打印出命令行的第一个参数。例如:
    python argument.py luffy
    打印出 luffy
    str = 'python argument.py luffy'
    import re
    str1 = re.findall('luffy',str)
    print(str1)

    8.代码如下:
    '''
    Linux当前目录/usr/local/nginx/html/
    文件名:index.html
    '''
    import os
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(index.html)))
    print(BASE_DIR)
    i.打印的内容是什么?
    /usr/local/nginx
    ii.os.path.dirname和os.path.abspath含义是什么?
    os.path.dirname:指定文件的目录
    os.path.abspath:找到该文件的绝对路径

    9.通过configparser模块完成以下功能
    文件名my.cnf
    [DEFAULT]
     
    [client]
    port = 3306
    socket = /data/mysql_3306/mysql.sock
     
    [mysqld]
    explicit_defaults_for_timestamp = true
    port = 3306
    socket = /data/mysql_3306/mysql.sock
    back_log = 80
    basedir = /usr/local/mysql
    tmpdir = /tmp
    datadir = /data/mysql_3306
    default-time-zone = '+8:00'
    i.修改时区 default-time-zone = '+8:00' 为 校准的全球时间 +00:00
    con = configparser.ConfigParser()
    con.read('my.cnf')
    con.set('mysqld','default-time-zone','+00:00')
    con.write(open('my.cnf', "w"))
    print(con['mysqld']['default-time-zone'] )
     
    ii.删除 explicit_defaults_for_timestamp = true
    con = configparser.ConfigParser()
    con.read('my.cnf')
    con.remove_option('mysqld','explicit_defaults_for_timestamp')
    con.write(open('my.cnf', "w"))
     
    iii.为DEFAULT增加一条 character-set-server = utf8
    con = configparser.ConfigParser()
    con.read('my.cnf')
    con.set('DEFAULT','character-set-server','utf-8')
    con.write(open('my.cnf', "w"))
     

     
    10.写一个6位随机验证码程序(使用random模块),要求验证码中至少包含一个数字、一个小写字母、一个大写字母.
    import random
    import string
    str1 = []
    for i in range(6):
    str = ''.join(random.choice(string.ascii_lowercase + string.digits + string.ascii_uppercase))
    str1.append(str)
    print(','.join(str1).replace(',',''))
     
    11.利用正则表达式提取到 luffycity.com ,内容如下
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>luffycity.com</title>
    </head>
    <body>
    </body>
    </html>
    str = '''
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>luffycity.com</title>
    </head>
    <body>
    </body>
    </html>
    '''
    import re
    find_str = re.findall('luffycity.com',str)
    print(find_str)
    1. 写一个用户登录验证程序,文件如下
      1234.json
      {"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}
      1. 用户名为json文件名,密码为 password。
      2. 判断是否过期,与expire_date进行对比。
      3. 登陆成功后,打印“登陆成功”,三次登陆失败,status值改为1,并且锁定账号。
    # 写一个用户登录验证程序,文件如下
    # 1234.json
    # {"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}
    # 用户名为json文件名,密码为 password。
    # 判断是否过期,与expire_date进行对比。
    # 登陆成功后,打印“登陆成功”,三次登陆失败,status值改为1,并且锁定账号。
    import json
    import time
    with open('1234.json','r+',encoding='utf-8') as f:
        count = 0
        user_dict = json.loads(f.read())
        if time.mktime(time.struct_time(time.strptime(user_dict['expire_date'],'%Y-%m-%d')))>time.mktime(time.struct_time(time.strptime(time.strftime('%Y-%m-%d'),'%Y-%m-%d'))):
            while count < 3:
                username = input('请输入用户名>>>').strip()
                pwd = input('请输入密码>>>').strip()
                if user_dict['status'] == 1:
                    print('该账户已经被锁定')
                    break
                elif count == 2:
                    user_dict['status'] = 1
                    f = open('1234.json','r+',encoding='utf-8')
                    json.dump(user_dict, f)
                    f.close()
                elif username == str(user_dict['id']) and pwd ==user_dict['password'] and user_dict['status'] == 0:
                    print('欢迎登录')
                    break
                else:
                    print('登录失败')
                count += 1
        else:
            print('账户已过期')
    View Code
    把第12题三次验证的密码进行hashlib加密处理。即:json文件保存为md5的值,然后用md5的值进行验证。
    # 写一个用户登录验证程序,文件如下
    # 1234.json
    # {"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}
    # 用户名为json文件名,密码为 password。
    # 判断是否过期,与expire_date进行对比。
    # 登陆成功后,打印“登陆成功”,三次登陆失败,status值改为1,并且锁定账号。
    # 把第12题三次验证的密码进行hashlib加密处理。即:json文件保存为md5的值,然后用md5的值进行验证
    import json
    import time
    import hashlib
    with open('1234.json','r+',encoding='utf-8') as f:
        hash = hashlib.md5()
        count = 0
        user_dict = json.loads(f.read())
        hash.update(user_dict['password'].encode('utf-8'))
        user_dict['password'] = hash.hexdigest()
        if time.mktime(time.struct_time(time.strptime(user_dict['expire_date'],'%Y-%m-%d')))>time.mktime(time.struct_time(time.strptime(time.strftime('%Y-%m-%d'),'%Y-%m-%d'))):
            while count < 3:
                username = input('请输入用户名>>>').strip()
                pwd = input('请输入密码>>>').strip()
                hash_pwd = hashlib.md5()
                hash_pwd.update(pwd.encode('utf-8'))
                pwd = hash_pwd.hexdigest()
                if user_dict['status'] == 1:
                    print('该账户已经被锁定')
                    break
                elif count == 2:
                    user_dict['status'] = 1
                    f = open('1234.json','r+',encoding='utf-8')
                    json.dump(user_dict, f)
                    f.close()
                elif username == str(user_dict['id']) and pwd ==user_dict['password'] and user_dict['status'] == 0:
                    print('欢迎登录')
                    break
                else:
                    print('登录失败')
                count += 1
        else:
            print('账户已过期')
    View Code
      1. 最近luffy买了个tesla,通过转账的形式,并且支付了5%的手续费,tesla价格为75万。文件为json,请用程序实现该转账行为。
        需求如下:
        1. 目录结构为
      2. .
        ├── account
        │ ├── luffy.json
        │ └── tesla.json
        └── bin
        └── start.py
    当执行start.py时,出现交互窗口
    1. ------- Luffy Bank ---------
      1. 账户信息
      2. 转账
      • 选择1 账户信息 显示luffy的当前账户余额。
      • 选择2 转账 直接扣掉75万和利息费用并且tesla账户增加75万
    2. 对上题增加一个需求:提现。
      目录结构如下
      .
      ├── account
      │ └── luffy.json
      ├── bin
      │ └── start.py
      └── core
      └── withdraw.py
      当执行start.py时,出现交互窗口
      ------- Luffy Bank ---------
      1. 账户信息
      2. 提现
      • 选择1 账户信息 显示luffy的当前账户余额和信用额度。
      • 选择2 提现 提现金额应小于等于信用额度,利息为5%,提现金额为用户自定义。
    3. 尝试把上一章的验证用户登陆的装饰器添加到提现和转账的功能上。
    4. 对第15题的用户转账、登录、提现操作均通过logging模块记录日志,日志文件位置如下
      .
      ├── account
      │ └── luffy.json
      ├── bin
      │ └── start.py
      └── core
      | └── withdraw.py
      └── logs
      └── bank.log

    本章作业:

    模拟实现一个ATM + 购物商城程序
    1. 额度 15000或自定义
    2. 实现购物商城,买东西加入 购物车,调用信用卡接口结账
    3. 可以提现,手续费5%
    4. 支持多账户登录
    5. 支持账户间转账
    6. 记录每月日常消费流水
    7. 提供还款接口
    8. ATM记录操作日志
    9. 提供管理接口,包括添加账户、用户额度,冻结账户等。。。
    10. 用户认证用装饰器
     
    Win a contest, win a challenge
  • 相关阅读:
    【我所认知的BIOS】—&gt; uEFI AHCI Driver(4) — 第一个Protocol真难搞
    IOS Core Animation Advanced Techniques的学习笔记(四)
    Redhat 7改动默认执行级别方法 --RHEL7使用systemd创建符号链接指向默认执行级别
    CF1088F Ehab and a weird weight formula
    2018-2-13-win10-uwp-csdn-博客阅读器
    2018-2-13-win10-uwp-csdn-博客阅读器
    2018-2-13-win10-UWP-九幽数据分析
    2018-2-13-win10-UWP-九幽数据分析
    2019-9-2-win10-uwp-获得焦点改变
    2019-9-2-win10-uwp-获得焦点改变
  • 原文地址:https://www.cnblogs.com/pandaboy1123/p/9300171.html
Copyright © 2020-2023  润新知