Python-迭代器-生成器-1

今日内容:

1.迭代器:

iterable:形容词,可迭代的

from clooections import Iterable (检测一个对象是否可迭代)

"_ _iter_ _":这个方法导致了yield数据类型的可迭代

iter:

只要是包含了“双下划线iter”方法的数据类型就是可迭代的 -- 可迭代协议(数据类型和Python解释器定下来的协议)

print([1,2,3]._ _iter_ _())

iterator: 名词 迭代器

迭代器:就是实现了能从其中一个一个的取出值来

lis_iterator = [1,2,3].__iter__()
print(set(dir(lis_iterator)) - set(dir([1,2,3])))

迭代器中有__next__ 和__iter__方法 -- 迭代器协议

lis_iterator = [1,2,3].__iter__()
from collections import Iterator
print(isinstance(lis_iterator,Iterator))
print(isinstance([1,2,3],Iterator))

在Python里  你学过的所有的可以被for循环的 基本数据类型 都是可迭代的 而不是迭代器

可迭代对象:

  可迭代协议:含有__iter__方法的对象

from collections import Iterator

print(isinstance(要检测的对象, Iterator))

迭代器和可迭代对象之间的关系:

  迭代器包含可迭代对象 

  迭代器 = 可迭代对象.__iter__()

 

可迭代对象 并不能用

迭代器 -- 它不关心值的索引状态

lst_iterator = [1,2,3].__iter__()
print(lst_iterator.__next__())
print(lst_iterator.__next__())
print(lst_iterator.__next__())
while True:
      try:
            print(lst_iterator.__next__())
      except StopIteration:
            break

for 可以是一个可迭代对象  也可以是一个迭代器

为什么要有迭代器  迭代器存在的本质是什么?

  1.能够对Python中的基本数据类型进行统一遍历,不需要关心每一个值分别是什么

  2.它可以节省内存 -- 惰性运算

f = open("file","w") 文件句柄就是一个迭代器

range(1000).__iter__() range就是一个可迭代对象

for:

  1.天生的,比如文件句柄

  2.后天的,可迭代对象.__iter__()

 

生成器:

Iterator:迭代器

Gerator:生成器

生成器就是迭代器,生成器是我们自己写的

  生成器函数

  生成器表达式

def generator_func(): # 生成器函数
      print(123)
      yield 'aaa' # 相当于return
      print(456)
      yield 'cccc'
g = generator_func()
print(g.__next__())
print(g.__next__())

带yield关键字的函数就是生成器函数

生成器函数在执行的时候返回一个生成器,不执行生成器函数中的内容

从生成器中取值:

  1.__next__ 有记过yield就可以取几次

  2.for循环取值 正常取 for i in g:

  3.其他数据类型进行强制转换list(g)返回一个列表,里边装着生成器的所有内容

注意:调用生成器函数的时候,要先获取生成器,在进行next取值

   生成器中的内容只能取一次,且按顺序取值没有回头路,取完为止。

def generator():
      yield
      yield 2
g = generator()
for i in g:
      print(i)
print(list(g))
g1 = generator()
g2 = generator()
for i in generator():
      print(i)
print(list(generator()))
def get_clothing():
      for cloth in range(1,2000000):
            yield '第%s件衣服'%cloth
generate = get_clothing()

print(get_clothing().__next__())
for i in range(50):
      print(generate.__next__())

for i in get_clothing():
      print(i)
      if i == '第100件衣服':
            break
#yield from
def func2():
      yield from [1,2,3]
      yield from 'ABC'
g = func2()
for i in g:
      print(i)

总结:

可迭代对象   内部有__iter__
迭代器 内部有__itre__ __next__
生成器 -- 就是迭代器
自己写的迭代器
生成器函数 yield/yield from

 

 

posted @ 2017-09-04 17:27  程先生_Python  阅读(111)  评论(0)    收藏  举报