sys&faker&jsonpath模块、异常处理、多线程、多进程
1.sys模块
sys.argv 能获取运行文件时,文件名后面所传参数。结果是一个列表。
import sys
print(sys.argv) #获取运行python文件的时候传入的参数,会连同文件名,和参数,返回一个列表。
#在terminal里运行,才能传参。如在当前目录下,运行 python sys模块.py arg1 if len(sys.argv)>1:
if sys.argv[1]=='--help':
quit('这个python是用来测试的,运行的时候需要使用 python a.py port')
else:
port = sys.argv[1]
else:
port = 7878 import flask
server = flask.Flask(__name__) @server.route('/')
def index():
return '<h1>首页</h1>' server.run(port=port)
运行上边代码,返回:
2.faker模块
import faker
f = faker.Faker(locale='zh_CN') #实例化,并指定语言为中文
print(f.name())#姓名
print(f.credit_card_number())#随机信用卡号
print(f.email())#随机信用卡号
print(f.ipv4())#随机ip地址
print(f.user_name())#随机用户名
print(f.phone_number())#随机电话
print(f.ssn())#随机身份证号
3.jsonpath模块
d={
"error_code": 0,
"stu_info": [
{
"id": 2059,
"name": "小白",
"sex": "男",
"age": 28,
"addr": "河南省济源市北海大道32号",
"grade": "天蝎座",
"phone": "18378309272",
"gold": 10896,
"info":{
"card":6214234235232352,
"bank_name":'中国银行',
"name":'zff'
}
}
],
'name':'哈哈哈'
} #普通取name
res = d['stu_info'][1]['name']
print(res) # jsonpath取name
import jsonpath
res = jsonpath.jsonpath(d,'$..name') #模糊匹配,不管层次与位置.$代表外部大字典,..代表任意的。。 #res2 = d['stu_info'][0]['info']['bank_name']
#res2=jsonpath.jsonpath(d,'$.['stu_info'][0]['info']['bank_name']')
#这2个res2效果是一样的
4.面向对象——继承
在父类某个方法的基础上再增加新功能:
super().xxx()
super()会自动找到父类
class Car:
def run(self,):
print('running...')
return 'abc' class NewCar(Car):
def run(self):
res = super().run()# 保留父类run的方法,super()的意思就是找到父类
#res=Car().run() #与上边super功能一样,但父类名称改的时候,他也得改
print('fly...',res) bmw = NewCar()
bmw.run()
5.异常处理
处理异常,将出错的情况进行处理,使出错时抛出提示或要求继续某种操作,而不是报错让程序进行不下去。
用 try: xxx except Exception as e: print('提示语')
try和except是必须的,else和finally选用。
try:
res = 1 / 0
except ZeroDivisionError as e:
#except ZeroDivisionError,e: #python2不能用as,要用,
print('出错啦,除数不能为0',e) l = list()
l.append(1)
d = dict()
# d['name']='abc'
try:
print(d['name'])
print(l[-1])
except IndexError as e: #只能捕捉到越界下标错误
print('出错了,下标越界',e)
except KeyError as e:
print('字典key不存在',e)
except Exception as e: #能捕捉各种异常,但不会界定是何种异常
print('未知异常',e)
else:
print('没有出现异常。。。')
finally: #不管异常是否出现,都会执行,使用场景:打开文件或数据库,出错了,但也得关闭
print('什么时候执行finally') dic = {}
print(dic['name']) class NumberError(Exception):
pass class M:
def main(self):
count = input('请输入要产生多条银行卡号:').strip()
if not count.isdigit():
raise NumberError('输入的数字不对') #主动抛出异常,判断为一个什么时候,终止运行
#raise Exception('自定义异常')
m = M()
m.main()
6.多线程
线程:程序执行的最小单位。
为什么有时候单线程比主线程快?
电脑CPU有几个核心,就同时只能运行几个线程。
感觉多线程运行。很快,其实并没有,只是CPU运行速度特别快,切换速度特别快
全局解释器锁,叫GIL。python加了个锁,让每个CPU只运行一个线程,避免数据错乱。
单线程:没有做多线程,就是单线程
多线程:利用for语句,启动多个线程
for i in range(20): #启动了多个线程
t1 = Thread(target=run,)
t1.start()
主线程等待子线程执行任务:t.join()
或
while threading.active_count()!=1: #判断子线程是否执行结束,这种简单
pass
#运行程序规则:首先由一个线程,会将代码从头到尾执行一遍。
import threading #该模块提供线程
from threading import Thread
import time def run():
time.sleep(1)
print('run...') start_time = time.time() # for i in range(5): #串行,得5s,单线程运行
run() threads = [] for i in range(20): #启动了多个线程
t1 = Thread(target=run,)
t1.start()
#t1.join() #这儿不能加,否则会变成串联线程,即单线程 # threads.append(t1)
# for t in threads: #循环,同时等待多个线程
# t.join()
#这一部分是一个等待代码 while threading.active_count()!=1: #判断子线程是否执行结束,这种比上边等待代码块简单
pass end_time = time.time() print(end_time - start_time)
7.多进程
用法上跟多线程特别相似
进程:
一些资源的集合。如qq, 图片,程序
一个进程里面最少有一个线程, 主线程。
一个进程可以包含多个线程
可以利用多个cpu的。
IO密集型任务: 即input output,分为磁盘io和网络io
IO消耗比较多的,适合多线程
CPU密集型任务:消耗CPU多的,适合多进程
为啥python的多线程利用不了多核CPU,但是咱们看起来的时候还是并发的?
因为在Python多线程下,每个线程的执行方式:
1、获取GIL
2、执行代码直到sleep或者是python虚拟机将其挂起。
3、释放GIL
可见,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,
并且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行。
import multiprocessing
import time
import threading
import requests def run():
time.sleep(10)
print('run...') if __name__ == '__main__':
for i in range(10):
p = multiprocessing.Process(target=run)
p.start()
while multiprocessing.active_children(): #等待其他子进程运行结束
pass
8.守护线程
守护主线程,主线程执行完成之后,子线程立即结束。如秦始皇死,相关人都得死。
import threading
import time
def run():
time.sleep(5)
print('run。。。') for i in range(100):
puren = threading.Thread(target=run)
puren.setDaemon(True)#设置子线程为守护线程。如果不加,这个会运行100次run.加了后,运行一次。
puren.start() print('over') #即不加等待,主线程一运行完,子线程就停止运行。
9.锁
多个线程同时去操作同一个数据的时候,可能会导致数据不正确。
要把这个数据机上锁,这样同时就只能有一个线程在操作这个数据了。
python3会自动加锁,所有写不写加不加锁代码没所谓
import threading count = 0 lock = threading.Lock() #申请一把锁 def run():
global count
with lock:
count+=1
# lock.acquire()#加上锁
# count+=1
# lock.release()#释放,必须的,要么会停着不动
#这3行代码跟上边功能一样
#python里边不加锁也行,因为python3会自动加锁 for i in range(10): #多个线程都要去操作count数据
t = threading.Thread(target=run)
t.start() while threading.active_count()!=1:
pass print(count)
10.牛刀小试
生成尾号为11的银行卡号:
# 10
#工商银行:6222342
#广发银行:34634 #1、获取数据,把不需要的数据过滤掉
import random
import string
class BankCardId:
file_name = 'card_no'
all = [] # 保存所有有效的数据 def __init__(self):#自动调用函数,取到all
self.get_data() def get_data(self): #取到最后俩位数为11的数据,all取到[['工商银行', '18', '620200'], ['工商银行', '18', '620302'],...]
with open(self.file_name,encoding='utf-8') as fr:
for line in fr:
if line.strip():#判断不是空行
new_line = line.split()[1:]
a,b = new_line[-1],new_line[-2] #获取末尾2个元素
if a==b=='1':#判断末尾2个元素是不是都是1
self.all.append(new_line[:3]) def get_card(self): #生成银行卡号
bank_name,lenth,start = random.choice(self.all)
other_lenth = int(lenth) - len(start) - 2
other = ''.join( random.choice(string.digits) for i in range(other_lenth) )
res = start + other + '11'
print(bank_name,self.my_print(res)) def my_print(self,s):
count = 0
new_s = ''
for i in s:
count += 1
new_s += i
if count == 4:
new_s += ' '
count = 0
return new_s def main(self):
num = input('请输入要产生多少条:').strip()
for i in range(int(num)):
self.get_card() b = BankCardId()
# b.get_data()
# print(b.all)
b.main()
下载网页图片:
import threading
import requests
import random
import time
from hashlib import md5
res = []
def down_load_pic(url):
#下载图片的url
r = requests.get(url)
file_name = md5(r.content).hexdigest()#把文件md5之后字符串当做文件名
with open(file_name+'.jpg','wb') as fw:
fw.write(r.content)
print('%s下载完成'%file_name)
res.append(file_name) urls = [
'http://www.nnzhp.cn/wp-content/uploads/2018/12/110405th7jtus7gjjlywnl.jpg',
'http://www.nnzhp.cn/wp-content/themes/QQ/images/thumbnail.png',
'http://www.nnzhp.cn/wp-content/uploads/2018/08/f38a12137574f4333f7686f7e75a06fb8bd9fed537ea59-pRwNuK_fw658.jpeg',
'http://www.nnzhp.cn/wp-content/uploads/2018/08/c1bba9a47cfe8fe7000f137f020ad623.png',
] start_time = time.time() #单线程
# for url in urls:
# down_load_pic(url) #多线程
for url in urls:
t = threading.Thread(target=down_load_pic,args=(url,) )
t.start() while threading.active_count()!=1:#等待子线程运行完成
pass print(res) end_time = time.time() print('下载完成,下载时间是 %s'% (end_time-start_time)) # 下载完成,下载时间是 107.56531095504761,单线程
# 下载完成,下载时间是 81.53419184684753 多线程
sys&faker&jsonpath模块、异常处理、多线程、多进程的更多相关文章
- Python多线程多进程那些事儿看这篇就够了~~
自己以前也写过多线程,发现都是零零碎碎,这篇写写详细点,填一下GIL和Python多线程多进程的坑~ 总结下GIL的坑和python多线程多进程分别应用场景(IO密集.计算密集)以及具体实现的代码模块 ...
- python sys os hashlib_MD5 模块
模块 内置模块是Python自带的功能,在使用内置模块相应的功能时,需要[先导入]再[使用] 一.sys 用于提供对Python解释器相关的操作: ? 1 2 3 4 5 6 7 8 9 sys.ar ...
- Python:使用threading模块实现多线程编程
转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...
- 第三十三节,sys解释器相关模块
首先要引入import sys模块 sys.argv 功能:获取向脚本文件传入的参数,返回的列表,列表里的第一个元素是脚本文件路径和名称,后面的元素是传入的向脚本传入的参数 使用方法:sys.argv ...
- python模块 os&sys&subprocess&hashlib模块
os模块 # os模块可根据带不带path分为两类 # 不带path print(os.getcwd()) # 得到当前工作目录 print(os.name) # 指定你正在使用的操作系统,windo ...
- python中sys和os模块的使用
在python中,sys,os模块是非常强大的,提供了许多对文件夹.文件和路径的操作方法 sys模块 sys.argv #命令行执行脚本,其实它就是一个列表 ,sys.argv[0] 是程序自身路 ...
- sys、os 模块
sys 模块常见函数 sys.argv #命令行参数List,第一个元素是程序本身路径 sys.exit(n) #退出程序,正常退出时exit(0) sys.vers ...
- Python内置模块之time、random、hashlib、OS、sys、UUID模块
Python常用模块 1.time模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串: (1)时间戳(timestamp) :通常来说,时间 ...
- C++程序员面试题目总结(涉及C++基础、多线程多进程、网络编程、数据结构与算法)
说明:C++程序员面试题目总结(涉及C++基础知识.多线程多进程.TCP/IP网络编程.Linux操作.数据结构与算法) 内容来自作者看过的帖子或者看过的文章,个人整理自互联网,如有侵权,请联系作者 ...
- python的sys和os模块
一.sys sys.argv:实现从程序外部向程序传递参数. 其中sys.argv[0]为脚本的名称,所以要判断是否有参数传入可以:if len(sys.argv) > 1. sys.exi ...
随机推荐
- Docker修改已有容器的端口映射
Docker修改已有容器的端口映射 背景 拉取了jenkins的镜像,启动容器的时候端口就映射了8080,但这个演示环境要用到jenkins node,其中默认的代理端口是50000.漏了,就想着能否 ...
- JavaScript 疑难记录(未解决)
异步迭代器与生成器的联系和区别
- Linux10-rpm和yum
1.rpm包的管理 一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中.它生成具有.RPM扩展名的文件.RPM是RedHat Package Manager(RedHat软件包管理工 ...
- Google Guice 用户指南 - Ⅰ:概览
译者:kefate 原文:https://github.com/google/guice/wiki/Overview 大家好,我是kefate.今天开始我将会把Google Guice的官方文档陆续翻 ...
- 【已解决】将jsp文件在浏览器打开直接出现代码,在浏览器出现本地地址,tomcat报错
问题背景: 导入了一个项目直接打开可以,但是想跟一遍代码,把配置文件全部整理成为一个springmvc的基础配置文件 跟着配置到自己tomcat就不管怎样都是下面的截图 希望可以帮到一起报错的朋友快 ...
- 一份随笔让你了解这个基于Raspberry Pi / 树莓派而设计的工业计算机
CM4 Sensing是一款基于Raspberry Pi / 树莓派 计算模块4(简称CM4),由 EDATEC 为物联网和数据采集应用而设计的工业计算机.它充分利用了CM4的结构灵活性,解决了CPU ...
- 队列——queue的用法(及洛谷B3616)
队列的概念 在说队列之前,先回忆一下栈是什么,我们一般说栈是一个先进后出的数据结构,而队列就是先进先出的数据结构. 队列是定在表的一端进行插入,表的另一端进行删除. 通常,我们称进数据的一端为队尾,出 ...
- 【KAWAKO】模型的压缩、扩张,计算模型的各种成本
目录 模型压缩 量化 稀疏化训练 剪枝 知识蒸馏 自蒸馏 集成 使用精细化模型结构 模型扩张 深度 宽度 输入图像的分辨率 深度.宽度.分辨率联合扩张 使用精细化模型结构 计算模型的各种成本 参数量 ...
- 钓鱼攻击之:OFFICE CVE-2017-11882
钓鱼攻击之:OFFICE CVE-2017-11882 目录 钓鱼攻击之:OFFICE CVE-2017-11882 1 环境准备 2 利用过程 2.1 生成验证POC 2.2 CVE-2017-11 ...
- Postgresql清理WAL日志
WAL是Write Ahead Log的简写,和oracle的redo日志类似,存放在$PGDATA/pg_xlog中,10版本以后在$PGDATA/pg_wal目录. 1.如果开启了归档,在目录ar ...