一、生成器
1.1 什么是生成器
在开始学习生成器之前,我们得先知道,生成器不会直接得开辟内存空间,其次,调用生成器得方法为:next(),下面我们来看一个例子:
s = (i for i in range(10)) # 列表生成式
print(s)
print(type(s)) # 查看S的类型
print(next(s))
print(next(s))
print(next(s))
print(next(s))
print(next(s))
print(next(s))
# 输出结果
<generator object <genexpr> at 0x000001BD1F1BFA50>
<class 'generator'>
0
1
2
3
4
5
输出结果中,generator 称为生成器对象,需要用next方法去获取其中的内容,此外,生成器就是一个可迭代对象,其本质是一个函数,将其中的内容存档,需要使用时使用外部方法去获取其中的数据。下面,我们来学习生成器的创建方式。
1.2 生成器的创建方式
1.2.1 列表生成式创建
该方法在上面已经演示过·,这里就不再赘述
1.2.2 yield 关键字创建
首先,来看下面的例子
def f():
print('f1')
yield 1
print('f2')
yield 2
for i in f():
print(i)
# 输出结果
f1
1
f2
2
该例子中使用yield关键字创建了两个生成器,其内容分别是1和2,再使用for循环遍历取出,因此打印结果如图所示。在之前几期中我们已经知道,for循环后面跟的是可迭代对象,故而生成器就是可迭代对象,其次,区分可迭代对象的方法共有两种:
- 从现象来看,只要是可以for循环的都是可迭代对象
- 从本质来看,是内置有iter方法的是可迭代对象
for循环后面都是跟的有iter方法,能循环时因为内部有一个iter方法,下面来看一个例子:
l = [1,2,3,4]
l.__iter__()
t = (1,2,3)
t.__iter__()
d = {'name':'python'}
d.__iter__()
该例中,不论列表,元组还是字典,其后都有一个iter方法,因此其均是可迭代对象。
此外,注意一下yield和return的区别:
return:在函数中返回某个值,然后函数结束运行,一般没有返回值类型,就不用写
yield:带yield的函数是一个生成器,在函数内部碰到这个yield的时候,函数就会返回某个值,当
下次执行函数后,会在上次停留的位置继续运行,就相当于是存档
好,下面来学习迭代器
二、迭代器
2.1 什么是迭代器
1.有iter方法
2.有next方法
迭代器对象:iterator,iter方法其实只做了一件事,那就是返回一个迭代器
下面我们来看一个例子:
list1 = [1,2,3,4]
d = iter(list1)
print(d)
print(next(d))
print(next(d))
print(next(d))
print(next(d))
# 输出结果
<list_iterator object at 0x00000177CBBB21F0>
1
2
3
4
可以看出,对list1使用iter方法后,其就转变为了一个·迭代器,可以用next方法获取其中的内容。
好,这就是本期的所有内容,如果有错误或者需要修改的地方,欢迎指出,下期见~