生成器迭代器正则视频笔记

多任务文件夹:
import os
os.mkdir(old_name+"复件") 创建文件夹

os.listdir("dirname") 返回一个列表
multiprocessing 多进程
创建进程池:
po = multiprocessing.Pool(5)
for work in works:
po.apply_async(函数地址,函数参数)

multiprocessing.Queue()
print("\r %.2f %% " % args, end="")
\r 回到行首 %.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$"
| 或
()分组

posted @ 2020-01-17 08:10  countryboy666  阅读(103)  评论(0编辑  收藏  举报