re模块练习

1.验证手机号是否合法

import re
phone_pat = re.compile('^(13\d|14[5|7]\d|15\d|166|17[3|6|7]|18\d)\d{8}$')
while True:phone = input('请输入您的手机号:')res = re.search(phone_pat, phone)if res:print('正常手机号')else:print('这不是一个手机号')

'''
* 手机号码
* 移动:134,135,136,137,138,139,150,151,157,158,159,182,187,188
* 联通:130,131,132,152,155,156,185,186
* 电信:133,134,153,180,189
147...  176...
'''
import re
# phone_num = '13789481229'
phone_num = input('phone>>>:')
# pattern = re.compile('^0\d{2,3}\d{7,8}$|^1[358]\d{9}$|^147\d{8}')
pattern = re.compile('^1[34578]\d{9}')
phone_match = pattern.fullmatch(phone_num)
if phone_match:print(phone_match.group())
else:print('\033[1;31mphone is error\033[0m')

2.验证邮箱是否合法

import re# email = 'alice@163.com'
email = input('email>>>:')
# pattern = re.compile('\w+@\w+\.(com|cn)')
pattern = re.compile('[-_\w]+@[-_\w]+\.(com|cn|edu)')
email_match = pattern.fullmatch(email)
if email_match:print(email_match.group())
else:print('\033[1;31memail is error\033[0m') #re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email) 

3.开发一个简单的python计算器,实现加减乘除及拓号优先级解析

用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致

hint:
re.search(r'\([^()]+\)',s).group()#可拿到最里层的括号中的值
'(-40/5)'

参考 http://www.bubuko.com/infodetail-1729967.html

本章总结练习

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

logging模块共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
#1.生成logger对象
logger =logging.getLogger("access")
logger.setLevel(logging.DEBUG)
#2.生成handler对象
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)  ##设置输出屏幕级别
fh = logging.FileHandler("access.log")  #生成文件
fh.setLevel(logging.ERROR)  ##设置输出文件级别
#2.1把handler对象绑定到logger
logger.addHandler(ch)
logger.addHandler(fh)
#3.生成formatter对象
#3.1把formatter对象绑定handler对象
file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s- %(lineno)d- %(message)s')ch.setFormatter(console_formatter)
fh.setFormatter(file_formatter)logger.error("account [1234] too many login attempts")

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

首先,这三个模块都是序列化工具。1. json是所有语言的序列化工具,优点跨语言、体积小.只能序列化一些基本的数据类型。int\str\list\tuple\dictpickle是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

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
import configparser
config = configparser.ConfigParser()
config.read('my.cnf')
print(config['mysqld']['default-time-zone'] ) #08:00
config.set('mysqld','default-time-zone','+00:00')
config.write(open('my.cnf', "w"))
print(config['mysqld']['default-time-zone'] )  #+00:00

  1. 删除 explicit_defaults_for_timestamp
import configparser
config = configparser.ConfigParser()
config.read('my.cnf')
config.remove_option('mysqld','explicit_defaults_for_timestamp')
config.write(open('my.cnf', "w"))

  1. 为DEFAULT增加一条 character-set-server = utf8
import configparser
config = configparser.ConfigParser()
config.read('my.cnf')
config.set('DEFAULT','character-set-server','utf8')
config.write(open('my.cnf', "w"))

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

import random
import string
a = ''.join(random.sample(string.ascii_lowercase + string.ascii_uppercase + string.digits,6))
print(a)

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

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

import re
f = open('index.html','r',encoding='utf-8')
data = f.read()
#print(data)
print(re.findall('luffycity.com', data)) #['luffycity.com']

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
username = input('请输入用户名(文件名):')
f = open('1234.json','r',encoding='utf-8')
data = f.read()
data1 = json.loads(data)
#print(data1['password'])
count = 0
while count < 3:if (int(time.strftime('%Y')))-(int(data1["expire_date"][0:4])) > 0:print('您的账户已过期')exit()if data1['status'] == 1:print('您的账户已被锁定,无法登录')exit()password = input('请输入密码:')if password == data1['password']:print('登录成功')elif count == 2:data1['status'] = 1f1 = open('1234.json','w',encoding='utf-8')json.dump(data1,f1)  #修改json数据print('您的账户已被锁定')exit()else:print('您的密码有误,请重新输入')count += 1

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

 "password": "900150983cd24fb0d6963f7d28e17f72"

#加入下面这个就可以
password = input('请输入密码:')m = hashlib.md5()m.update(password.encode())if m.hexdigest() == data1['password']:print('登录成功')

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

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

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

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

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

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

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

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

   ------- Luffy Bank ---------
1.  账户信息
2.  提现

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

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

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

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

14--17:

bin start.py

#Author:Kris# -*- coding:utf-8 -*-
import os,sys
import json
import logging
from logging import handlers
core_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(core_path)
from core import withdraw_username = 'alice'
_password = '123'
msg = '''
1. 账户信息
2. 转账
3. 提现
'''
json_path = os.path.join(core_path, 'account')
flag_login = False
logger = logging.getLogger('record')def log_record():global loggerlogger.setLevel(logging.DEBUG)# fh = logging.FileHandler(os.path.join(core_path, 'logs/bank.log'),encoding='utf-8')fh = logging.handlers.TimedRotatingFileHandler(filename=os.path.join(core_path, 'logs/bank.log'),when='S',interval=3,backupCount=3,encoding='utf-8')logger.addHandler(fh)f_formatter = logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p')fh.setFormatter(f_formatter)def login(func):def inner():global flag_loginif not flag_login:username = input('username:').strip()password = input('password:').strip()if username == _username and password == _password:print('登录成功!')flag_login = Truelogger.info('登录成功')else:print('用户名或密码有误!')else:print('用户已登录,通过认证')if flag_login is True:func()return inner
def print_info():# 账户信息luffy_data = json.load(open(os.path.join(json_path, 'luffy.json'), 'r', encoding='utf-8'))print('account_balance:', luffy_data['account_balance'])print('credit_account:', luffy_data['credit_account'])
@login
def transfer_account():# 转账luffy_data = json.load(open(os.path.join(json_path, 'luffy.json'), 'r', encoding='utf-8'))tesla_data = {'account_balance': 750000}luffy_data['account_balance'] = luffy_data['account_balance'] - tesla_data['account_balance'] * (1 + 0.05)json.dump(luffy_data, open(os.path.join(json_path, 'luffy.json'), 'w', encoding='utf-8'))json.dump(tesla_data, open(os.path.join(json_path, 'tesla.json'), 'w', encoding='utf-8'))print('转账成功!')logger.debug('转账成功')
@login
def withdraws_func():# 提现moneys = input('moneys>>>:').strip()if moneys.isdigit():moneys = int(moneys)withdraw.withdraws(moneys, json_path, logger)
def main():while True:print("Luffy Bank".center(30, '-'))print(msg)num = input('num(q表示退出)>>>:').strip()if not num:continueif num.isdigit():num = int(num)if num == 1:    # 账号信息
                print_info()elif num == 2:  # 转账
                transfer_account()elif num == 3:  # 提现
                withdraws_func()elif num == 'q':exit()if __name__ == '__main__':log_record()main()

core   withdraw.py

#Author:Kris
# -*- coding:utf-8 -*-
import os, jsondef withdraws(moneys, json_path, logger):luffy_data = json.load(open(os.path.join(json_path, 'luffy.json'), 'r', encoding='utf-8'))if moneys <= luffy_data['credit_account']:luffy_data['credit_account'] = luffy_data['credit_account'] - moneys*(1+0.05)json.dump(luffy_data, open(os.path.join(json_path, 'luffy.json'), 'w', encoding='utf-8'))print('提现成功!')logger.warning('提现成功')else:print('\033[0;31m提现金额大于信用额度了!\033[0m')logger.error('提现金额大于信用额度')

转载于:https://www.cnblogs.com/shengyang17/p/8795510.html

练习题|python常用模块相关推荐

  1. Python常用模块——目录

    Python常用模块学习 Python模块和包 Python常用模块time & datetime &random 模块 Python常用模块os & sys & sh ...

  2. 跟李宁老师学Python视频课程(12):Python常用模块-李宁-专题视频课程

    跟李宁老师学Python视频课程(12):Python常用模块-143人已学习 课程介绍         本系列课程一共20套,每一套视频课程会深入讲解Python的一类知识点.Python是当今炙手 ...

  3. 实战篇一 python常用模块和库介绍

    # -_-@ coding: utf-8 -_-@ -- Python 常用模块和库介绍 第一部分:json模块介绍 import json 将一个Python数据结构转换为JSON: dict_ = ...

  4. python常用模块大全总结-常用python模块

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. python常用模块什么是模块? 常见的场景:一个模块就是一个包含了py ...

  5. 对于python来说、一个模块就是一个文件-python常用模块

    python常用模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用pyt ...

  6. python常用模块之shelve模块

    python常用模块之shelve模块 shelve模块是一个简单的k,v将内存中的数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据类型 我们在上面讲json.pickle ...

  7. Python常用模块集锦

    常用模块主要分为以下几类(缺失的后续再补充): 时间转换 时间计算 序列化和反序列化:json,pickle 编解码:unicode,base64 加解密:md5,sha1,hmac_sha1,aes ...

  8. Python+常用模块(2).md

    Python 常用模块 1. random模块 1.1 导入模块 import random 1.2 random.random() 生成一个从0到1的随机浮点数 1.3 random.uniform ...

  9. python用什么来写模块-Python常用模块——模块介绍与导入

    Python常用模块--模块介绍与导入 一.什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分 ...

  10. Python 常用模块总结

    Python 常用模块总结 1.random 2.math 3.os 4.os.path 5.sys 6.hashlib 7.hmac 8.time 9.datetime 10.calendar 11 ...

最新文章

  1. PyTorch 1.7发布,支持CUDA 11、Windows分布式训练
  2. 运行bert模型报错No module named ‘tensorflow.contrib‘
  3. 打印机通讯 tspl指令_西门子工控设备通讯
  4. 变而不变:我看分布式系统发展和阿里实践
  5. ubuntu11.04中如何像其他版本一样快速回到桌面
  6. js循环解析html标签,riot.js教程【六】循环、HTML元素标签
  7. 量产 php是什么,php文件怎么打开?下错的?
  8. 面向服务的计算(SOC)课程相关资料
  9. MyBatis创建SqlSession可以直接使用DefaultSqlSession 吗?
  10. elementui分页组件按钮样式修改_Vue使用Elementui修改默认最快方法!
  11. Oracle存储过程基本语法介绍
  12. 比茅台还暴利!靠卖牌子年赚40个亿,如今被质疑造假
  13. 第2章[2.1] 开发模式及快速测试方式
  14. ssis 角本组件更新数据_使用SSIS脚本组件作为数据源
  15. java jdbc事务_Java JDBC事务管理和保存点
  16. selenium 如何处理table
  17. java 编程英语单词,语句
  18. 网络流四种主流算法时间复杂度分析
  19. unity接入 微信登录sdk
  20. HeadFirst 设计模式 4工厂模式(披萨店演变)

热门文章

  1. 编写一个matlab矩阵函数,MATLAB矩阵 及图像函数
  2. java技术 ppt_Java技术简介与基本宣告ppt课件.ppt
  3. iqc工作职责和工作内容_新媒体实习生是做什么的?新媒体实习生岗位职责工作内容...
  4. python一定要有主函数_Python 为什么没有 main 函数?为什么我不推荐写 main 函数?...
  5. ace缓存扩展接口_并不是只有 Redis 才可以做缓存
  6. python做自动化控制postman_Python自动化学习笔记(1)认识接口测试以及postman、Charles工具简单应用...
  7. python在数字后添加字符_用python生成数字、字母和特殊字符混合的字符串
  8. Ubuntu -- 无法正常安装卸载ssh以及chattr无反应的问题
  9. Selenium爬虫 -- 使用Selenium爬取数据时,网页切换之后原先获取的元素变量失效的问题
  10. java实践_java基础实践