本章总结

练习题

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是所有语言的序列化工具,优点跨语言、体积小.只能序列化一些基本的数据类型。int\str\list\tuple\dict
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,并且锁定账号。
  1. # 写一个用户登录验证程序,文件如下
  2. # 1234.json
  3. # {"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}
  4. # 用户名为json文件名,密码为 password。
  5. # 判断是否过期,与expire_date进行对比。
  6. # 登陆成功后,打印“登陆成功”,三次登陆失败,status值改为1,并且锁定账号。
  7. import json
  8. import time
  9. with open('1234.json','r+',encoding='utf-8') as f:
  10. count = 0
  11. user_dict = json.loads(f.read())
  12. 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'))):
  13. while count < 3:
  14. username = input('请输入用户名>>>').strip()
  15. pwd = input('请输入密码>>>').strip()
  16. if user_dict['status'] == 1:
  17. print('该账户已经被锁定')
  18. break
  19. elif count == 2:
  20. user_dict['status'] = 1
  21. f = open('1234.json','r+',encoding='utf-8')
  22. json.dump(user_dict, f)
  23. f.close()
  24. elif username == str(user_dict['id']) and pwd ==user_dict['password'] and user_dict['status'] == 0:
  25. print('欢迎登录')
  26. break
  27. else:
  28. print('登录失败')
  29. count += 1
  30. else:
  31. print('账户已过期')
把第12题三次验证的密码进行hashlib加密处理。即:json文件保存为md5的值,然后用md5的值进行验证。
  1. # 写一个用户登录验证程序,文件如下
  2. # 1234.json
  3. # {"expire_date": "2021-01-01", "id": 1234, "status": 0, "pay_day": 22, "password": "abc"}
  4. # 用户名为json文件名,密码为 password。
  5. # 判断是否过期,与expire_date进行对比。
  6. # 登陆成功后,打印“登陆成功”,三次登陆失败,status值改为1,并且锁定账号。
  7. # 把第12题三次验证的密码进行hashlib加密处理。即:json文件保存为md5的值,然后用md5的值进行验证
  8. import json
  9. import time
  10. import hashlib
  11. with open('1234.json','r+',encoding='utf-8') as f:
  12. hash = hashlib.md5()
  13. count = 0
  14. user_dict = json.loads(f.read())
  15. hash.update(user_dict['password'].encode('utf-8'))
  16. user_dict['password'] = hash.hexdigest()
  17. 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'))):
  18. while count < 3:
  19. username = input('请输入用户名>>>').strip()
  20. pwd = input('请输入密码>>>').strip()
  21. hash_pwd = hashlib.md5()
  22. hash_pwd.update(pwd.encode('utf-8'))
  23. pwd = hash_pwd.hexdigest()
  24. if user_dict['status'] == 1:
  25. print('该账户已经被锁定')
  26. break
  27. elif count == 2:
  28. user_dict['status'] = 1
  29. f = open('1234.json','r+',encoding='utf-8')
  30. json.dump(user_dict, f)
  31. f.close()
  32. elif username == str(user_dict['id']) and pwd ==user_dict['password'] and user_dict['status'] == 0:
  33. print('欢迎登录')
  34. break
  35. else:
  36. print('登录失败')
  37. count += 1
  38. else:
  39. print('账户已过期')
    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. 用户认证用装饰器
 

路飞学城Python-Day14(practise)的更多相关文章

  1. 路飞学城—Python爬虫实战密训班 第三章

    路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...

  2. 路飞学城—Python爬虫实战密训班 第二章

    路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...

  3. 路飞学城Python爬虫课第一章笔记

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...

  4. 路飞学城-Python开发集训-第3章

    学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...

  5. 路飞学城-Python开发集训-第1章

    学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ...

  6. 路飞学城-Python开发集训-第4章

    学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...

  7. 路飞学城-Python开发集训-第2章

    学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...

  8. 路飞学城Python-Day19(practise)

    # 特性1.继承:2.多态:3.封装 # 1.继承的用处:通过继承就可以解决类与类之间的代码冗余关系 # 2.多态的用处:1.增加了程序的灵活性,以不变应万变,使用者都是同一种形式去调用(func(a ...

  9. 路飞学城-Python开发-第二章

    ''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...

  10. 路飞学城-Python开发-第三章

    # 数据结构: # goods = [ # {"name": "电脑", "price": 1999}, # {"name&quo ...

随机推荐

  1. Python 之 入门须知

    1.Python2.0不支持中文,3.0支持 2.版本问题

  2. 不懂技术也可以轻松开发一款APP

    这是个衣食住行都离不开手机的时代,甚至可以说,我们不用考虑其他的东西,只要拿着手机,就可以出门做自己想做的事情. 这就是手机app的强大之处,覆盖面极广,小到聊天交友,大到投资理财.每次都是app为我 ...

  3. ZBrush中如何实现智能对称

    ZBrush软件智能化和人性化的工作流程让用户在创作中提高工作效率,体验创作乐趣,说起智能化不得不提的就是ZBrush 4R8®给我们提供的智能对称功能,所谓的智能对称就是当您在编辑其中一半的物体模型 ...

  4. 备份和恢复ZBrush文件

    ZBrush可以自动保存绘图的备份副本,并在发生系统错误时提醒您恢复备份副本.当ZBrush软件遇到崩溃.导致错误.非正常退出的时候,可能之前所做的努力就会功亏一篑,那么,在ZBrush软件中能否将文 ...

  5. ZBrush国庆中秋大放价,优惠提前享!

    没记错的话,上次的ZBrush活动应该是17年春节吧,悄么蔫地就把端午节等一系列节日忽略了,这让苦苦等待的小伙伴们情何以堪,这试用版用的也不得劲儿! 终于等到你,ZBrush官方消息称,17年中秋国庆 ...

  6. 迁移IPv6:6To4隧道技术

    1. IPv6 路由选择协议 首先要讨论的是RIPng(下一代).RIP非常适合用于小型网络.这正是它没有惨遭淘汰,继续用于 IPV6网络的原因.另外,还有EIGRPv6,因为它有独立于协议的模块,只 ...

  7. Codeforces Round #499 (Div. 2) F. Mars rover_dfs_位运算

    题解: 首先,我们可以用 dfsdfsdfs 在 O(n)O(n)O(n) 的时间复杂度求出初始状态每个点的权值. 不难发现,一个叶子节点权值的取反会导致根节点的权值取反当且仅当从该叶子节点到根节点这 ...

  8. Web API Filter

    在Web Api中,有三种Filter Filter类型 实现的接口 描述 Authorization IAuthorizationFilter 最先运行的Filter,被用作请求权限校验 Actio ...

  9. win10开机时内存使用率达到99%以上

    开始,运行,输入msconfig回车就能看到自启的项目. 搞定! 其实,感觉特别像是输入法的某个监听程序导致内存泄漏,造成的系统问题. 再遇到的时候要认真检查下.

  10. 【BZOJ 1211】 [HNOI2004]树的计数

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] prufer数列的应用 http://www.cnblogs.com/AWCXV/p/7626625.html 这一题没有节点的度数 ...