python迭代器、生成器

81 阅读2分钟

1. 迭代器是什么?

1.1 迭代器

迭代器(iterator)本身是一个可迭代的对象,可以通过__next__方法或内置函数next()获取迭代器中的元素;

1.2 迭代器特点:

  1. 每次执行只返回迭代器中的一个元素,同时记录返回元素的位置;
  2. 只能迭代器的第一个元素进行取值,直到所有元素被访问完;
  3. 只能通过__next__方法或内置函数next()获取迭代器中的元素;

1.3 说人话解释一下

例如:一个迭代器对象A中存储5个元素,从左到右分别是'a',1,3.0,("a",),{"key":1} 当迭代器对象A第一次调用next()函数时,返回'a',并记录下来程序执行的位置 当迭代器对象A第二次调用next()函数时,程序从输出'a'的内存位置开始执行,返回1

1.4 相关代码示例

print("-" * 10 + '测试迭代器取值' + '-' * 10)


def iter_func():
    n = 1
    while True:
        yield n
        print(f"此时n的值是:{n},此时的时间是{datetime.datetime.now()}")
        n += 1


f = iter_func()
print("第一次开始调用迭代器.....")
print(f.__next__())
print(f"第一次调用迭代器结束,此时时间为{datetime.datetime.now()}.....")
sleep(1)
print("第二次开始调用迭代器.....")
print(next(f))
print("第二次开始调用迭代器.....")

1.4.1 以上代码到底输出了什么?

image.png

1.4.2 代码解读

  1. iter_func函数执行,n初始化为1
  2. 进入死循环,yield n ---> 程序暂停,并返回n的值给iter_func函数
  3. f.next(),获取到iter_func函数的返回值,所以输出 1
  4. 代码向下继续执行......
  5. 当代码遇到next(f) ---> 程序再次进入iter_func函数,从上次暂停的位置开始执行 a) 先输出print语句,在进行n+1操作并赋值给n b) 死循环,再次执行到yield n ---> 程序终止,并返回n的值给iter_func函数 c) 所以输出 2

2. 生成器是什么?

当代码片段中出现yield关键字后,那么由这些代码片段就被称为生成器(generator)

2.1 创建生成器

2.1.1 方式一

变量名 = (生成器代码)

g = (x * 2 for x in range(10))
print(type(g)) # <class 'generator'>

2.1.2 方式二

定义函数,函数体内包含yield关键字

def func():
    n = 0
    while True:
        n += 1
        yield n


print(type(func)) # <class 'function'>

本质上还是函数,但包含了生成器

2.2 迭代器与生成器有什么关系?

  1. 迭代器和生成器都调用next()和__next__();
  2. 迭代器包含生成器

3. 可迭代对象是什么?

3.1 可迭代对象

实现了__iter__()方法的对象都可以被称为可迭代对象

3.2 常见的可迭代对象有哪些?

  1. 字符串 2.元组
  2. 列表
  3. 字典
  4. 集合

3.3 可迭代对象不是迭代器?

可迭代对象仅实现了__iter__()方法,但是没有实现__next__()方法,所以不是迭代器

3.4