多任务文件夹:
import os
os.mkdir(old_name+"复件") 创建文件夹
os.listdir("dirname") 返回一个列表
multiprocessing 多进程
创建进程池:
po = multiprocessing.Pool(5)
for work in works:
po.apply_async(函数地址,函数参数)
multiprocessing.Queue()
print("
%.2f %% " % args, end="")
回到行首 %.2f 保留两位小数 %% 显示% end=""不换行
协程:
迭代器: 只能往前不会回退。
for in 元祖, 列表 , 字典 ,字符串
判断是不是可以迭代对象:
collections import Iterable
isinstance(Object, Iterable)
print("xxxx",isinstance(classmate,Iterable)) 打印元祖
必须有__iter__(self):
def
保证一个对象成为一个可迭代对象. 保证类里有__iter__(self): 方法
from collections import Iterable
class Classmate(object):
def __init__(self):
self.name = list()
def add(self, name):
self.name.append(name)
def __iter__(self):
return ClassIterator(self) //返回一个可以迭代实例 传入self 创建一个对象。
class ClassIterator(object):
def __init__(self,obj):
self.obj = obj
self.currentNum = 0
def __iter__(self):
pass
def __next__(self):
if self.currentNum < len(self.obj.names):
ret = self.obj.naems[self.currentNum]
self.currentNum +=1
return ret // 返回
else:
raise StopIteration
迭代器有: __iter__, __next__;
怎么判读是否是可迭代对象。
1 判断是不是有iter方法。
2 判断是不是有next方法。
有iter方法和next方法: 是可迭代对象。
32/G跳转
for name in classmate:
1 判断classmate有没有iter方法
2 调用iter方法
3 iter方法返回一个迭代器
4 迭代器调用__next__方法
学迭代器有什么用? 为了节省空间,减少内存空间。一个生成需要值的方法。
用大量数据。不能
%s/old/new/g 替换
接受可迭代对象:li = list(a)
迭代器生成方式1
生成器是一种特殊的迭代器。
列表推到式:
nums = [x*2 for x in range(10)]
nums = (x*2 for x in range(10))
含有: yeild的 函数 生成器。
迭代器生成方式2
def create_num(all_num):
a, b = b, a+b
currentNum = 0
while currentNum < all_num:
yield a
a, b = b, a+b
currentNum +=1
obj = create_num(10) 生成器
next(obj) 通过next取得生成器的结果。
函数含有yield 就是生成器。
while True:
try:
ret = next(obj)
except Exception as ret:
break
启动生成器:
obj.send("hahaha")
让一个函数暂停执行。
完成多任务:
import time
def task_1():
while True:
print("----1---")
time.sleep(0.1)
yield
def task_2():
while True:
print("---2---")
time.sleep(0.1)
yield
def main():
t1 = task_1()
t2 = task_2()
while True:
next(t1)
next(t2)
if __name__ == "__main__":
main()
并发: 假的并行。
用greenlet
from greenlet import greenlet
import time
并发库:
gevent 库 遇到耗时炒作 切换执行。
import gevent
import time
def f1(n):
for i in range(n):
print(gevent.getcurrent(),i) // getcurrent() 反对调用对象
gevent.sleep(0.5)
def f2(n):
for i in range(n):
print(gevent.getcurrent(),i) // getcurrent() 反对调用对象
gevent.sleep(0.5)
def f3(n):
for i in range(n):
print(gevent.getcurrent(),i) // getcurrent() 反对调用对象
gevent.sleep(0.5)
g1 = gevent.spawn(f1,5)
g2 = gevent.spawn(f2,5)
g3 = gevent.spawn(f3,5)
g1.join()
g2.join()
g3.join()
打补丁: from gevent import monkey
monkey.patch_all() 自动蒋耗时操作换乘gevent中的函数。
gevent.joinall([gevent.spawn(f1,"name"),
gevent.spawn(f1,"name")]);
from urlib.request
import gevent
from
def downloader(filename,fileurl):
req = urllib.request.urlopen("fileurl")
img = req.read()
with open(filename, "wb") as f:
f.write(img)
def main():
gevent.joinall([gevent.spawn(downloader,'https://rpic.xxxx.com'),
gevent.spawn(downloader,'https://rpic.xxxx.com')])
if __name__ == "__main__":
main()
目的: 数据的处理。
规则:清洗数据。
import re
result = re.match()
满足需求有返回值。
re.match(r"[hH]ello","hello world")
是不是符合我的规范:
单个字符: d 匹配数值 = 0到9
[] 匹配范围,限制 [1-8a-zA-Z]
w 任意字符
s 空格
. 任意单个字符
多个字符: d{1,3} 前面紧挨着的字符
? 前面前面一位可有可无。 匹配电话号: r"d{3,4}-?d{7,8}"
.* 不能匹配换行, re.S 匹配行换
.+ 必须有一个。
match 判断开头
判断开头和结尾: ^ 开头
$ 结尾
转移 匹配邮箱: r"[a-zA-Z_0-9]{4-20}@163.com$"
| 或
()分组