from collections import Iterable,Iterator
# 这是一个可迭代对象, 但不是迭代器
a =[1,2,3]print(isinstance(a, Iterable))# 判断a是不是可迭代的 --> Trueprint(isinstance(a, Iterator))# 判断a是不是迭代器 --> False# 将可迭代对象转化成迭代器
b = a.__iter__()print(isinstance(b, Iterable))# 判断a是不是可迭代的 --> Trueprint(isinstance(b, Iterator))# 判断a是不是迭代器 --> True
生成器
简介
定义
由开发者自定义的迭代器, 称为生成器
本质就是迭代器
要点
一个生成器只能取一次值 ☆☆☆☆☆
不调用的时候不会执行
创建生成器 - 4种方式
# 1. 用迭代对象.__iter__()
g =range(5).__iter__()# 2. 生成器表达式# 语法: (result for循环 [if判断])
g =(i for i inrange(10)if i %2==0)# 此时 g 是一个生成器# 3. yield 生成器函数# 包含yield关键字的函数, 就是生成器函数# defG():for i inrange(10)yield i # yield 右侧就是被作为返回值放入生成器的
g = G()# 此时 g 是一个生成器# 4. yield from, 也是生成器函数defG2():yieldfromrange(10)
g = G2()# 效果同上
取值 - 4种方式
# 创建一个生成器
g =range(10).__iter__()# next(), 每次执行, 将 yield 右侧的值作为返回值, 左侧如果有赋值语句, 等下次 next() 执行print(next(g))# 结果为0# __next__()print(g.__next__())# 结果为 1# forfor i in g:print(i)# list, 类型强转print(list(g))# 注意: 如果使用生成器函数创建生成器, 每次执行函数都会创建新的生成器, 所有要将生成器保存用来使用
import time
defmyTail(fileName, grepStr):withopen(fileName,"r")as f:# 光标放到最后
f.seek(0,2)while1:# 拿到单行的数据, 如果到末尾, readline() 会返回空
l = f.readline().strip()# 如果 l 为真, 且过滤的字符串在 l 中, 那么就将 l 放入生成器if l and grepStr in l:yield l
else:# 否则停止 0.05 秒
time.sleep(0.05)# 循环验证while1:for l in myTail("a.txt","404"):print(l)