可迭代
内置方法中含有__iter__的数据类型都是可迭代的,只要是可迭代的就可以使用for循环,反之亦然。
print(dir('')) # dir()函数可以获取当前数据类型的所有内置方法 返回值是list print('__iter__' in dir([])) # 判断是否含有__iter__内置方法
迭代器
内置方法中含有__iter__和__next__的都是迭代器,所以迭代器一定是可迭代的
# 一个可迭代的对象调用__iter__()之后会返回一个迭代器 print(type([].__iter__())) # <class 'list_iterator'>
迭代器可以使用__next__()方法一个一个去获取值
li = [1, 2, 3, 4, 5] iterator = li.__iter__() print(iterator.__next__()) # 1 print(iterator.__next__()) # 2 print(iterator.__next__()) # 3
迭代器的好处:
从容器内一一取值,可以取出全部内容
节省内存空间:每次取值时才在内存中生成一个值
迭代器和可迭代判断方法
from collections import Iterator from collections import Iterable print(isinstance([], Iterator)) # Iterator 迭代器 print(isinstance([], Iterable)) # Iterable 可迭代
生成器
生成器是含有yield关键字的迭代器。
# 定义 """def generator():函数体yield 返回值 """
调用生成器后返回的是一个生成器。
def generator():print('生成器')yield 'zxc'return 'a' # 生成器中yield和return能同时存在,return在yield后面定义没有任何意义, # return在yield前面定义将无法执行yield,也就不在是生成器了 ret = generator() print(type(ret)) # <class 'generator'>