2018-09-18
python学习
00
请注意,本文编写于 2134 天前,最后修改于 514 天前,其中某些信息可能已经过时。

目录

1. 可迭代对象
2. 迭代器
3. 生成器
4. 总结

1. 可迭代对象

可以直接作用于for循环的对象统称为可迭代对象:Iterable。 可以使用isinstance()判断一个对象是否是Iterable对象。

from collections import Iterable print(isinstance([], Iterable)) #列表是可迭代对象 print(isinstance({}, Iterable)) #字典是 print(isinstance('abc', Iterable)) #字符串是 print(isinstance((x for x in range(10)), Iterable)) #生成器是可迭代对象 print(isinstance(100, Iterable)) #整数不是可迭代对象 print(isinstance((), Iterable)) #元组是
True True True True False True

2. 迭代器

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。 可以使用isinstance()判断一个对象是否是Iterator对象。

from collections import Iterator print(isinstance((x for x in range(10)), Iterator)) print(isinstance([], Iterator)) print(isinstance({}, Iterator)) print(isinstance('abc', Iterator))
True False False False

所以生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。

3. 生成器

生成器指的就是生成器对象: 生成器其实是一种特殊的迭代器。

  1. 可以由生成器表达式得到;
#(expr for iter_var in iterable) L= (i +1 for i in range(10) if i %2) print(type(L)) print(next(L)) print(next(L)) print(next(L)) #generator 生成器 <class 'generator'> 2 4 6
  1. 可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象。
  • 函数体中包含yield语句的函数,反正生成器对象
  • 生成器对象,是延迟计算、惰性求值的。
#实现计数器 def inc(): def counter(): i = 0 while True: i += 1 yield i c= counter() #c是生成器,可以使用next求值 return lambda : next(c) foo = inc() print(foo()) print(foo())
1 2
#打印斐波那契数列 def fib(): x = 0 y = 1 while True: yield y x, y = y, x+y foo = fib() #调用了yield的函数才是生成器 print(type(foo)) #foo是个生成器 for _ in range(5): print(next(foo)) #打印5次 next(foo) for _ in range(100): next(foo) #先执行100次next(foo) print(next(foo)) #再打印出第101次
<class 'generator'> 1 1 2 3 5 6356306993006846248183

4. 总结

关系图:

生成器

本文作者:mykernel

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!