1. 迭代器是什么?
1.1 迭代器
迭代器(iterator)本身是一个可迭代的对象,可以通过__next__方法或内置函数next()获取迭代器中的元素;
1.2 迭代器特点:
- 每次执行只返回迭代器中的一个元素,同时记录返回元素的位置;
- 只能迭代器的第一个元素进行取值,直到所有元素被访问完;
- 只能通过
__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 以上代码到底输出了什么?
1.4.2 代码解读
- iter_func函数执行,n初始化为1
- 进入死循环,yield n ---> 程序暂停,并返回n的值给iter_func函数
- f.next(),获取到iter_func函数的返回值,所以输出 1
- 代码向下继续执行......
- 当代码遇到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 迭代器与生成器有什么关系?
- 迭代器和生成器都调用next()和__next__();
- 迭代器包含生成器
3. 可迭代对象是什么?
3.1 可迭代对象
实现了
__iter__()方法的对象都可以被称为可迭代对象
3.2 常见的可迭代对象有哪些?
- 字符串 2.元组
- 列表
- 字典
- 集合
3.3 可迭代对象不是迭代器?
可迭代对象仅实现了__iter__()方法,但是没有实现__next__()方法,所以不是迭代器