python基础十一之迭代器和生成器

  可迭代

  内置方法中含有__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'>
原文地址:https://www.cnblogs.com/zxc-Weblog/p/8179123.html