一、迭代器
1、迭代器(iter)
迭代器是容器型数据类型,只能通过类型转换和生成器来获得迭代器对象
迭代器存储数据的特点:同时可以保存多个数据,没有办法直接查看,而是需要先将数据从迭代器中取出来
(取出来不能再放回去,不保存就直接销毁了)
注:所有容器都可以转换成迭代器
2、获取迭代器中的元素
1) 遍历
例:
iter2 = iter([1, 2, 3, 4, 5])
for x in iter2:
print(x)
print(list(iter2))
2)获取单个元素(next())
next(迭代器对象) - 获取迭代器中的一个元素(当前最前面的那个元素)
迭代器对象.next() - 获取迭代器的一个元素(当前最前面的那个元素)
例:
iter3 = iter({'name': '张一', 'age': 18, 'gender': '男'})
print(next(iter3)) # name
print(next(iter3)) # age
print(next(iter3)) # gender
注:迭代器嵌套字典取得是键(key)
二、生成器
1、生成器
a、 概念1
生成器就是迭代器
b、 概念2
调用一个带有yield关键字的函数就可以得到一个生成器
def func1():
print('+++++++++')
print('---------')
yield
result = func1()
print(result) # <generator object func1 at 0x0000018BA4C22B88>
2、生成器产生数据(生成器中的元素是怎么生成的)
生成器能生产多少数据就看执行生成器对应的函数对应的函数的函数体会遇到几次yield;
yield后面的表达式的值就是生成器能够产生的数据
例:创建一个生成器可以产生3个数据分别是:10,20,30
def create_gender1():
yield 10
yield 20
yield 30
gen1 = create_gender1()
print(list(gen1)) # [10, 20, 30]
3、生成器产生数据的原理
获取生成器元素的时候,会自动调用生成器关联函数。第一次从函数开始的地方开始执行,直到遇到yield为止,并且yield后面的值作为获取到的数据;后面每次都是从上一次结束的位置开始执行,直到遇到yield,如果从开始执行到函数结束都没有遇到yield就不会产生数据(如果使用next去取数据这个时候会报错)
例:
def create_gender2():
for x in range(100, 150):
yield x
gen2 = create_gender2()
print(list(gen2))
# [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149]
4、生成式
生成式就是生成器的简写
列表推导式[]变成()就变成了生成式
例:
list1 = [x+2 for x in range(5)]
print(list1)
gen1 =(x+2 for x in range(5))
print(gen1)
print(next(gen1)) # 2
print(next(gen1)) # 3