1.迭代器

  1. 可迭代对象:定义了__iter__方法的类创建的对象,__iter__方法用于返回迭代器实例。比如说list、tuple、dict、set、str、range类都提供了返回迭代器实例的特殊方法__iter__,他们创建的对象都可以称之为可迭代对象
print('__iter__' in dir(int)) # False
print('__iter__' in dir(bool))# False
print('__iter__' in dir(list))# True,以下都为true
print('__iter__' in dir(tuple))
print('__iter__' in dir(dict))
print('__iter__' in dir(str))
print('__iter__' in dir(set))
print('__iter__' in dir(range))

f = open(R'main.py', mode='r')
print('__iter__' in dir(f))
  1. 迭代器:定义了__iter__方法和__next__方法的类创建的对象就是迭代器,__next__方法用于返回容器的下一个元素。例如文件句柄
print('__next__' in dir(int)) # False
print('__next__' in dir(bool))# False
print('__next__' in dir(list))# False
print('__next__' in dir(tuple))
print('__next__' in dir(dict))
print('__next__' in dir(str))
print('__next__' in dir(set))
print('__next__' in dir(range))

f = open(R'main.py', mode='r')
print('__next__' in dir(f)) # True,其他为False
  1. 可迭代对象转化为迭代器:
    1. 使用iter函数
    2. 使用可迭代对象的__iter__方法
    3. 示例如下
    li = [1, 2, 3]
    # li_iterator = iter(li)
    li_iterator = li.__iter__()
    print(li_iterator) # <list_iterator object at 0x000001F9EEAFBCD0>
    
    # 遍历:使用next函数或者迭代器的__next__方法取值
    while 1:
        try:
            # print(next(li_iterator), end='\t')
            print(li_iterator.__next__(), end='\t')
        except StopIteration:
            break
    

2.生成器

  1. 生成器:本质是迭代器,生成器可以让编写返回元素序列的函数所需的代码更加简单和高效。基于yield语句,生成器可以暂停函数并返回一个中间结果。这个函数会保存执行上下文,稍后在必要时恢复。
  2. 生成器的构建方式:
    1. 通过自定义生成器函数:包含yield关键字的函数就是生成器函数
    # 1.自定义生成器函数
    def func():
        for i in range(5):
            yield i
    
    # 2.获取生成器对象
    generator = func()
    print(generator) # <generator object func at 0x000001C87D0FEC10>
    
    # 3.通过调用生成器对象的__next__()方法或者next函数来取值
    for i in range(5):
        # print(generator.__next__(), end='\t')
        print(next(generator), end='\t') 
    
    1. 通过生成器推导式
    2. python内置函数提供
  3. 生成器对象的send方法:可以将传入的值变为yield的返回值。示例如下
def autoAnswer():
    print('tell me your problems:')
    while True:
        answer = (yield)
        if answer is not None:
            if answer.endswith('?'):
                print('您问的问题我再想想。')


genertor = autoAnswer()
next(genertor)

# 客户端传入
genertor.send('你在干嘛?')
genertor.send('吃饭了吗?')
  1. 应用场景:无需导入所有数据进内存的时候,可以使用生成器每次只提供一个值,减少内存的消耗。