模块学习相关练习题

1.logging模块有几个日志级别?

loggging模块有5个日志级别,分别是 DEBUG, INFO, WARNING, ERROR, CRITICAL

 

2. 请配置logging模块,使其在屏幕和文件里同时打印以下格式的日志

2017-10-18 15:56:26,613 - access - ERROR - account [1234] too many login attempts

代码如下:

import logging

logger = logging.getLogger("access")

console_handler = logging.StreamHandler()
file_handler = logging.FileHandler("access.log")

logger.addHandler(console_handler)
logger.addHandler(file_handler)

formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s [%(lineno)d] %(message)s")

console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

logger.error("too many login attempts")

 

3. json、pickle、shelve三个区别是什么?

json 跨语言,体积小

pickle只支持python,体积大

shelve是封装的pickle,只支持python,体积大,支持k, v 的数据结构

 

4. json的作用是什么?

将内存数据转换为规则的json数据,序列化到硬盘,以供程序之后使用或提供给其他服务使用。

 

5. subprocess执行命令方法有几种?

run()

call()

Popen()

 

6. 为什么要设计好目录结构?

好的目录结构能够更清晰的组织程序结构,使程序更可读,和更可维护。

 

7. 打印出命令行的第一个参数。例如:

python argument.py luffy
打印出 luffy
import sys
print(sys.argv[1])

 

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)

1). 打印的内容是什么?

    /usr/local/nginx

2). 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'
  1. 修改时区 default-time-zone = '+8:00' 为 校准的全球时间 +00:00
  2. 删除 explicit_defaults_for_timestamp = true
  3. 为DEFAULT增加一条 character-set-server = utf8
import configparser

config_file = "my.cnf"
config = configparser.ConfigParser()
config.read(config_file)

# 1. 修改时区 default-time-zone = '+8:00' 为 校准的全球时间 +00:00
config.set("mysqld", "default-time-zone", "'+00:00'")

# 2. 删除 explicit_defaults_for_timestamp = true
config.remove_option("mysqld", "explicit_defaults_for_timestamp")

# 3. 为DEFAULT增加一条 character-set-server = utf8
config.set("DEFAULT", "character-set-server", "'utf8'")

# 将修改写回到文件
config.write(open(config_file, "w", encoding="utf-8"))

运行后最终文件如下:

[DEFAULT]
character-set-server = 'utf8'

[client]
port = 3306
socket = /data/mysql_3306/mysql.sock

[mysqld]
port = 3306
socket = /data/mysql_3306/mysql.sock
back_log = 80
basedir = /usr/local/mysql
tmpdir = /tmp
datadir = /data/mysql_3306
default-time-zone = '+00:00'

 

10. 写一个6位随机验证码程序(使用random模块),要求验证码中至少包含一个数字、一个小写字母、一个大写字母.

import random
import string

s = "".join(random.sample(string.digits + string.ascii_lowercase + string.ascii_uppercase, 6))
print(s)

 

11. 利用正则表达式提取到 luffycity.com ,内容如下

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>luffycity.com</title>
</head>
<body>
</body>
</html>

代码:

f = open("re.txt", "r", encoding="utf-8")
data = f.read()
s = re.findall("luffycity.com", data)
f.close()

 

12. 写一个用户登录验证程序,文件如下
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,并且锁定账号。

代码:

import json
import time

file_name = "1234.json"
with open(file_name, "r", encoding="utf-8") as f:
    d = json.load(f)
print(d)


def write_back_to_json():
    with open(file_name, "w", encoding="utf-8") as f:
        json.dump(d, f)


n = 0
while n < 3:
    user = input("username:")
    pwd = input("password:")
    if user == file_name.split(".")[0] and pwd == d["password"]:
        # 判断账户是否锁定
        if d["status"] == 0:
            # 判断是否过期
            dt = time.strftime("%Y-%m-%d")
            if dt < d["expire_date"]:
                print("登录成功")
                break
            else:
                print("账户已过期。")
                d["status"] = 1
                write_back_to_json()
                break
        else:
            print("账户已锁定,请联系管理员解锁。")
            break
    else:
        print("用户名或密码错误。")
    n += 1
    if n == 3:
        print("你已登录失败3次,账户锁定")
        d["status"] = 1
        write_back_to_json()

 

13. 把第12题三次验证的密码进行hashlib加密处理。即:json文件保存为md5的值,然后用md5的值进行验证。

import json
import time
import hashlib

file_name = "1234.json"
with open(file_name, "r", encoding="utf-8") as f:
    d = json.load(f)
print(d)


def write_back_to_json():
    with open(file_name, "w", encoding="utf-8") as f:
        json.dump(d, f)


n = 0
while n < 3:
    user = input("username:")
    pwd = input("password:")

    hash = hashlib.md5()
    hash.update(bytes(pwd, encoding='utf-8'))
    pwd = hash.hexdigest()

    if user == file_name.split(".")[0] and pwd == d["password"]:
        # 判断账户是否锁定
        if d["status"] == 0:
            # 判断是否过期
            dt = time.strftime("%Y-%m-%d")
            if dt < d["expire_date"]:
                print("登录成功")
                break
            else:
                print("账户已过期。")
                d["status"] = 1
                write_back_to_json()
                break
        else:
            print("账户已锁定,请联系管理员解锁。")
            break
    else:
        print("用户名或密码错误。")
    n += 1
    if n == 3:
        print("你已登录失败3次,账户锁定")
        d["status"] = 1
        write_back_to_json()

 

14. 最近luffy买了个tesla,通过转账的形式,并且支付了5%的手续费,tesla价格为75万。文件为json,请用程序实现该转账行为。
需求如下:

  1. 目录结构为
.
├── account
│   ├── luffy.json
│   └── tesla.json
└── bin
      └── start.py

当执行start.py时,出现交互窗口

   ------- Luffy Bank ---------
  1.  账户信息
  2.  转账
  • 选择1 账户信息 显示luffy的当前账户余额。
  • 选择2 转账 直接扣掉75万和利息费用并且tesla账户增加75万

代码如下:

luffy.json

{
  "line_of_credit": 2000000,
  "balance": 2000000
}

 

tesla.json

{
  "line_of_credit": 2000000,
  "balance": 2000000
}

 

start.py

import json

luffy_file_name = "../account/luffy.json"
tesla_file_name = "../account/tesla.json"

with open(luffy_file_name, "r", encoding="utf-8") as f:
    luffy_dict = json.load(f)

with open(tesla_file_name, "r", encoding="utf-8") as f:
    tesla_dict = json.load(f)


def write_luffy_back():
    with open(luffy_file_name, "w", encoding="utf-8") as f:
        json.dump(luffy_dict, f)


def write_tesla_back():
    with open(tesla_file_name, "w", encoding="utf-8") as f:
        json.dump(tesla_dict, f)


while True:

    msg = '''
    ------- Luffy Bank ---------
    1.  账户信息
    2.  转账
    '''
    print(msg)
    choice = input("choice: ").strip()
    if choice.isdigit():
        choice = int(choice)
        if choice == 1:
            print("你的余额:%s 元" % (luffy_dict["balance"]))
        if choice == 2:
            pri = 750000
            if luffy_dict["balance"] < pri:
                print("账户上只有:%s 元,转不了" % (luffy_dict["balance"]))
            else:
                interest = pri * 5 / 100
                luffy_dict["balance"] = luffy_dict["balance"] - pri - interest
                tesla_dict["balance"] = tesla_dict["balance"] + pri
                write_luffy_back()
                write_tesla_back()
                print("转账 %s 元到 tesla 成功, 并扣除利息 %s 元, 你还有余额 %s 元" % (pri, interest, luffy_dict["balance"]))
    else:
        print("没有你输入的选项")

 

运行效果:

——- Luffy Bank ———
1. 账户信息
2. 转账

choice: 1
你的余额:2000000 元

——- Luffy Bank ———
1. 账户信息
2. 转账

choice: 2
转账 750000 元到 tesla 成功, 并扣除利息 37500.0 元, 你还有余额 1212500.0 元

——- Luffy Bank ———
1. 账户信息
2. 转账

choice:

 

 

15. 对上题增加一个需求:提现。
目录结构如下

.
├── account
│   └── luffy.json
├── bin
│   └── start.py
└── core
   └── withdraw.py

当执行start.py时,出现交互窗口

   ------- Luffy Bank ---------
1.  账户信息
2.  提现
  • 选择1 账户信息 显示luffy的当前账户余额和信用额度。
  • 选择2 提现 提现金额应小于等于信用额度,利息为5%,提现金额为用户自定义。

代码如下:

练习题15

 

16. 尝试把上一章的验证用户登陆的装饰器添加到提现和转账的功能上。

 

 

 

17. 对第15题的用户转账、登录、提现操作均通过logging模块记录日志,日志文件位置如下

 .
 ├── account
 │   └── luffy.json
 ├── bin
 │   └── start.py
 └── core
 |   └── withdraw.py
 └── logs
     └── bank.log

 

 

 

 

 

 

 

 

 

版权声明:
作者:admin
链接:https://www.chenxie.net/archives/1827.html
来源:蜀小陈
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>