练习题|python常用模块
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)
- 打印的内容是什么? 打印的内容是:
/usr/local/nginx
- 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'
- 修改时区 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
- 删除 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"))
- 为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"}
- 用户名为json文件名,密码为 password。
- 判断是否过期,与expire_date进行对比。
- 登陆成功后,打印“登陆成功”,三次登陆失败,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常用模块相关推荐
- Python常用模块——目录
Python常用模块学习 Python模块和包 Python常用模块time & datetime &random 模块 Python常用模块os & sys & sh ...
- 跟李宁老师学Python视频课程(12):Python常用模块-李宁-专题视频课程
跟李宁老师学Python视频课程(12):Python常用模块-143人已学习 课程介绍 本系列课程一共20套,每一套视频课程会深入讲解Python的一类知识点.Python是当今炙手 ...
- 实战篇一 python常用模块和库介绍
# -_-@ coding: utf-8 -_-@ -- Python 常用模块和库介绍 第一部分:json模块介绍 import json 将一个Python数据结构转换为JSON: dict_ = ...
- python常用模块大全总结-常用python模块
广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. python常用模块什么是模块? 常见的场景:一个模块就是一个包含了py ...
- 对于python来说、一个模块就是一个文件-python常用模块
python常用模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用pyt ...
- python常用模块之shelve模块
python常用模块之shelve模块 shelve模块是一个简单的k,v将内存中的数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据类型 我们在上面讲json.pickle ...
- Python常用模块集锦
常用模块主要分为以下几类(缺失的后续再补充): 时间转换 时间计算 序列化和反序列化:json,pickle 编解码:unicode,base64 加解密:md5,sha1,hmac_sha1,aes ...
- Python+常用模块(2).md
Python 常用模块 1. random模块 1.1 导入模块 import random 1.2 random.random() 生成一个从0到1的随机浮点数 1.3 random.uniform ...
- python用什么来写模块-Python常用模块——模块介绍与导入
Python常用模块--模块介绍与导入 一.什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分 ...
- Python 常用模块总结
Python 常用模块总结 1.random 2.math 3.os 4.os.path 5.sys 6.hashlib 7.hmac 8.time 9.datetime 10.calendar 11 ...
最新文章
- 山东谋定富硒产业示范园-农业大健康·万祥军:国研功能农业
- 基于SOA的体系架构设计
- 全国计算机一级考试介绍难不难,全国计算机一级考试内容 计算机一级考试难吗...
- 三点外接圆_故地重游伪切圆——伪外接圆的基本性质
- Unix——《Unix网络编程》配置unp.h头文件
- AI给你安利了一个职位,猜猜它觉得你适合做什么?
- 【摘】蓝牙技术及其协议栈
- 贝叶斯定理到贝叶斯滤波器
- Elasticsearch的索引模块(正排索引、倒排索引、索引分析模块Analyzer、索引和搜索、停用词、中文分词器)...
- 【咸鱼教程】一个简单的画布(阴阳师画符)
- UVa 12261 High Score (贪心“向左走,向右走”)
- 已知三点坐标,求圆心坐标 (外接圆)python实现
- 图的深度优先遍历(DFS)
- 《第一桶金怎么赚——淘宝开店创业致富一册通》一一1.2 创业者应具备的条件与经验...
- 不良事件总结怎么写_2017年第一季度不良事件总结分析
- H5页面调用手机打电话功能
- cuda 和 pytorch 安装
- 中国31个主要城市的绿地数据
- Paul Graham:撼动硅谷的人(译文)
- c语言中格式符号错误,C语言中符号格式说明
热门文章
- 昨晚家里停网后,我动了邪念用Python破解了隔壁小姐姐的wifi密码
- 个人成长过程中最重要的技能是什么?
- 一个强大的网络库RxEasyHttp
- 五金工具客服快捷回复消息_公众号的自动回复,这样用就能零流失!
- thymeleaf随机数_JavaScript 产生不重复的随机数三种实现思路
- jsonp和ajax的区别,dataType jsonp和JSON之间的区别
- mac perl dbd mysql_Install DBD::mysql for Perl in XAMPP in Mac , solving errors
- python如何将数据生成excel_Python如何将数据导出excel的技巧分享
- GPU GEMS 3 EBOOK下载
- 从eureka报错中得知的默认配置