1、迭代器:
# 可迭代协议:含有双下方法__iter__()
# 迭代器协议:同时含在双下方法__iter__()和__next__()
# 可迭代不一定是迭代器,但迭代器一定可迭代
# 目前所学的可迭代的类型:list/tuple/dict/set/str/range()/enumerate/f
# 迭代器的作用:1>方便取值,无需关心顺序及索引;2>节约内存空间
# 迭代器的生成:可迭代对象调用__iter__()方法,得到一个迭代器
# l = [1, 2, 3, 4]
# ret = l.__iter__()
# print(ret) # <list_iterator object at 0x000001E8761127B8>
# l = [1, 2, 3, 4]
# for i in l:
# print(i)
#
# for i in l.__iter__():
# print(i)
# 上面效果一样,是因为for循环会自动将l转化为迭代器对象,只要可迭代,就可以用for循环
2、生成器:
# 只要函数内部包含关键字yield,则为生成器方法
# yield与return的区别:return返回结果后直接结束函数,而yield返回结果后并没有结束,下面语句可以继续执行
# 生成器本质上是迭代器
# def generator():
# print(1)
# return "a"
#
# g = generator()
# print(g) # 1 a
# def generator():
# print(1)
# yield "a"
#
# g = generator()
# print(g) # <generator object generator at 0x000001D84601B8B8>
# # 从以上可以看出,执行generator()后并没有执行函数内部代码,而是直接返回了一个生成器对象,要执行内部代码,必须调用__next__()方法
# ret = g.__next__()
# print("***", ret) # 1 *** a
# def generator():
# print(1)
# yield "a"
# print(2)
# yield "b"
#
# g = generator()
# print(g.__next__()) # 1 a
# print(g.__next__()) # 2 b
# 从以上可以看出,同一个生成器,调用__next__()方法可以继续执行,而不是从头再来执行
#也可用for循环
# for i in g:
# print(i)
# 娃哈哈%i
def wahaha():
for i in range(2000000):
yield "娃哈哈%d" % i
g = wahaha()
# print(g.__next__()) # 娃哈哈0
# for i in g:
# print(i) # 生成一个打印一个,节省了空间
# 如果只想打印前50个
count = 0
for i in g:
count += 1
print(i)
if count > 50:
break
# 如果想从51开始打印50个
for i in g:
count += 1
print(i)
if count > 100:
break
# 同样不会从0开始打印
3、监听文件输入的例子:
1 # def tail(filename): 2 # f = open(filename, encoding="utf-8") 3 # while True: 4 # ret = f.readline() 5 # if ret.strip(): 6 # print(ret.strip()) 7 # 8 # tail("file") # 这样虽然可以实现监听,但是如果要对监听的内容进行处理,就办不到了 9 10 11 # def tail(filename): 12 # f = open(filename, encoding="utf-8") 13 # while True: 14 # ret = f.readline() 15 # if ret.strip(): 16 # yield ret.strip() 17 # 18 # 19 # r = tail("file") 20 # 21 # for i in r: 22 # print(i) 23 24 # def tail(filename): 25 # f = open(filename,encoding=‘utf-8‘) 26 # while True: 27 # line = f.readline() 28 # if line.strip(): 29 # yield line.strip() 30 # 31 # g = tail(‘file‘) 32 # for i in g: 33 # # if ‘python‘ in i: 34 # # print(‘***‘,i) 35 # print(i)
原文:https://www.cnblogs.com/eric818/p/10391806.html