1、可迭代对象
可以循环遍历的都是可迭代对象,例如字符、列表、元组、字典、迭代器等等,可以使用for循环迭代的标志是内部实现了__iter__方法。
list1=[1,2,3,4,5,6] print(list1) #将迭代对象转换为迭代器 iter1=iter(list1) print(next(iter1))
运行结果:
[1, 2, 3, 4, 5, 6]
1
使用isinstance(实体名,Iterable)可判断是否为可迭代对象
2、迭代器
迭代器就是实现了迭代方式的容器,iterable对象一般只能按默认的正序方式进行迭代。迭代器内部实现了__iter__方法和__next__方法。
next()方法用于定制for循环时具体的返回值及返回顺序以及处理StopIteration异常等。
使用isinstance(实体名,Iterator)可判断是否为迭代器
list1=[1,2,3,4,5,6] print(list1) #将迭代对象转换为迭代器 iter1=iter(list1) print(next(iter1)) print(next(iter1)) print(next(iter1)) print(next(iter1)) print(next(iter1)) print(next(iter1)) print(next(iter1))
运行结果:
[1, 2, 3, 4, 5, 6] Traceback (most recent call last): 1 2 3 4 5 6 File "/Users/grace/PycharmProjects/selenium/test.py", line 79, in <module> print(next(iter1)) StopIteration
3、生成器
generator对象是一种特殊的iterator函数,它会在执行过程中保存执行的上下文环境,并在下次循环中从yield语句后继续执行,生成器的标志就是yield关键字。
generator不需要抛出StopIteration异常(你可以看做yield已经在内部实现了StopIteration跳出循环),函数并没有将序列项一次生成,所以generator在实现上可以有无穷个元素,而不需要无穷的存储空间,这在内存优化方面很有用处。
使用isinstance(实体名,Generator)可判断是否为生成器。
生成器的创建办法有两种:
- 通过函数创建,称作generator function
- 通过推导式创建,例如g=(x*2 for x in range(10)),称作generator expression、
生成器和迭代器的区别:
- 生成器比迭代器多了三种方法:send(),close(),throw()
- send():发送数据
- close():关闭生成器
- throw():gen.throw(Exception,"Method throw called")
#创建一个生成器函数 def gen(): for i in range(5): x=yield i print("x=%s"%x) gen=gen() print(next(gen)) print(gen.send(100)) print(next(gen))
运行结果:
0 x=100 1 x=None 2
生成器最大的好处在于:generator_list(a)并不会真正执行函数的代码,只有在被循环时才会去获取值,且每次循环都return一个值(即yield一个值),在处理完毕后下次循环时依然使用相同的内存(假设处理单位大小一样)来获取值并处理,这样在一次for循环中函数好像中断(yield)了无数次,每次都用相同大小的内存来存储被迭代的值。
yield与return的最大区别就是yield并不意味着函数的终止,而是意味着函数的一次中断,在未被迭代完毕之前yield意味着先返回一次迭代值并继续下一次函数的执行(起始位置是上一次yeild语句结束),而return则基本意味着一个函数的彻底终止并返回一个全量的返回值。