li [1, 2, 3, 4, 5] print(isinstance(li,Iterable)) True2、迭代器: 迭代器指的是可以使用next()方法来回调的对象 可以对可迭代对象使用iter()方法 将其转换为迭代器。将li列表转成迭代器
iter_li iter(li) print(type(iter_li)) class list_iterator
迭代器优势 在构建迭代器时 不是将所有的元素一次性的加载 而是等调用next方法时返回元素 所以不需要考虑内存的问题。 使用next()取值时 当数据取完后会触发StopIteration异常
print( iter_li : ,next(iter_li)) iter_li : 13、生成器
# 列表推导式 生成器 li [x for x in range(10)] print( li: ,li) l2 (x for x in range(10)) print( l2: ,l2) li: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] l2: generator object genexpr at 0x0000020894876AC0
同样生成器也可以用next()进行取值 下面我们先用next()取值 然后用for循环看一下结果
print( - ,next(l2)) for i in l2: print(i)
可以发现 生成器取过一次值后 使用for循环遍历时不会对已取出的值进行遍历。l2保存的是算法 每次调用next(l2)就计算出他的下一个元素的值 直到计算出最后一个元素 没有更多的元素时 抛出StopIteration的错误 而且上面这样不断调用是一个不好的习惯 正确的方法是使用for循环 因为generator也是可迭代对象
举个常用的栗子 斐波那契数列
# fibonacci数列 def fib(max): n, a, b 0, 0, 1 while n max: a, b b, a b n n 1 print(a) fib(10)
使用生成器表达
def fib(max): n, a, b 0, 0, 1 while n max: yield b a, b b, a b n n 1



