1.迭代器
1.什么是迭代器(iter)
1)迭代器是容器型数据类型(可以遍历,也可以转换成其他容器),无法直接提供一个迭代器,只能将其他序列转换成迭代器。
2)特点:
a.打印迭代器的时候无法查看到元素有哪些。
b.无法通过len获取迭代器中元素的个数。
c.如果要使用迭代器中的元素必须将元素从迭代器中取出来(取走),取走的元素会从迭代器中永久的消失,用一个少一个。
d.任何数据都可以作为迭代器的元素。
e.只有序列可以转换成迭代器。
1)创建迭代器
i1 = iter('abc')
i2 = iter([10, 20, 30])
i3 = iter((100, 1.23, 'abc', True, [10, 20]))
2)打印迭代器无法查看元素
print(i1) # <str_iterator object at 0x000001FCC5B58700>
print(i2) # <list_iterator object at 0x000001FCC5B586D0>
3)迭代器无法统计个数
print(len(i1)) 会报错!
2.获取迭代器中的元素 —— 查
无论以任何方式获取到了迭代器中某个元素,那么这个元素一定会从迭代器中消失。
1)获取单个元素:
next(迭代器) —— 获取迭代器最前面的元素
2)遍历迭代器:
for 变量 in 迭代器:
循环体
3)案例:
i1 = iter('abc')
i2 = iter([10, 20, 30])
i3 = iter((100, 1.23, 'abc', True, [10, 20]))
print(next(i1)) # a
print(next(i1)) # b
print(next(i1)) # c,此时迭代器变为空了
# print(next(i1)) #没有东西了就会报错!
print(next(i2)) # 10
print(list(i2)) # [20, 30],这个时候迭代器是空的了
# 以任何方式将迭代器中数据取出来都会消失
# print(next(i2)) # 报错!
for x in i3:
print(x)#[10, 20]
print(list(i3)) #[]
2.生成器
1.什么是生成器
类似母鸡,需要一个鸡蛋就生产一个鸡蛋。
1)生成器是容器:是一种可以创建多个数据的容器,生成器中保存的是创建数据的方法,而不是数据本身。
2)特点:
a.打印生成器无法查看元素;
b.也不能通过len()统计元素的个数;
c.如果需要生成器中的数据,必须将数据取出,而且取一个就少一个;
3)生成器获取元素的方法和迭代器获取元素的方法一样
2.创建生成器
调用带有yield关键字的函数,就可以得到一个生成器;
def func1():
yield
print("hello")
return 100
result = func1()
print(result)
3.控制生成器
怎么控制生成器中元素的个数和元素的值?
执行创建生成器的函数体的时候,会遇到几次yield,对应的生成器就可以创建几个数据,每次遇到yield,yield后面的值就是能创建出来的数据。
def func2():
print("123")
yield 100
print('234')
yield 200
print('234')
yield 300
gen2 = func2()
print(gen2)
# 有三个数据,分别是100,200,300
print(next(gen2))
print(next(gen2))
print(next(gen2))
# print(next(gen2))报错!
def func2(n):
yield 100
if n % 2 == 0:
yield 200
yield 300
gen2 = func2(3)
print(gen2)
# 只有两个数据,分别是100,300;
print(list(gen2))
# print(next(gen2)) 报错,和迭代器是一个原理