python's thirteenth day for me 迭代器 生成器

迭代器:

  for 循环可以循环的就是可迭代对象。

    可迭代对象:str, list, tuple, dict, set, range。

      迭代器:f1文件句柄。

可迭代协议:

     可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。

可迭代对象:

  内部含有__iter__方法的对象就叫做可迭代对象。

如何判断:两种方式:

s = 'guqingqiu'
# print(dir(s))
print('__iter__' in dir(s))   # True
from collections import Iterable
print(isinstance(s,Iterable))   # True

将可迭代对象转化成迭代器:     可迭代对象.__iter__() ---->迭代器

迭代器不仅含有__iter__,还含有__next__。遵循迭代器协议。

s = 'guqingqiu'
l_s = s.__iter__()     #将 s 转化成迭代器
print('__iter__' in dir(l_s))    # True
print('__next__' in dir(s))      # False
print('__next__' in dir(l_s))    # True

迭代器的好处:

    1,节省内存空间。

    2,满足惰性机制。

    3,不能反复取值,不可逆。

l = [1,2,3,4,5]
for i in l:
    print(i)
# 1,将可迭代对象转化成迭代器。
# 2,内部使用__next__方法取值。
# 3,运用了异常处理去处理报错。

while 循环 模仿 for 循环内部机制:

l = [1,2,3,4,5]
l_obj = l.__iter__()     #将列表转化成迭代器
while True:
    try:
        i = l_obj.__next__()   #__next__用法:惰性打印迭代器里的值
        print(i)
    except StopIteration:   #  不写默认是:Exception(可忽略所有报错),忽略StopIteration错误
        break     # 跳出循环

生成器:

def func():
    print(111)
    print(222)
    yield 333
    print(444)
    yield 555
g = func()
g.__next__()  #将生成器内的值第一个 yield 以上的打印
g.__next__()  # 将生成器 第一个 yield下 第二个 yield 以上的打印出来。

# 111
# 222
# 444

    1,函数中只要有 yield 那她就不是一个函数,而是一个生成器。

    2,g 称作生成器对象。

  send 用法:

def generator():
    print(123)
    content = yield 1
    print('yield 1:',content)  # yield 1: hello
    print(456)
    yield  2
g = generator()
g.__next__()    # 123
g.send('hello')   # 456    #send 的效果和next一样。

# send 获取下一个值得效果和 __next__基本一致。
# 只是在获取下一个值的时候,给上一个 yield 的位置传递一个数据。
# 使用 send 的注意事项:
        # 第一次使用生成器的时候 使用 __next__获取下一个值。
        # 最后一个 yield 不能接受外部的值。
原文地址:https://www.cnblogs.com/stfei/p/8710062.html