python基础(迭代器和生成器)

---恢复内容开始---

一、迭代器

  可迭代对象:Iterable,例如,ist,str,tuple,dict,set,range(100)。

    具有__iter__方法的叫做可迭代对象。

  迭代器:Iterator,例如,文件句柄。

    具有__next__,__iter__方法的叫做迭代器。

    迭代器调用__iter__()方法还是自身。  

  可迭代对象与迭代器的关系:

    可迭代对象调用了__iter__()方法变成迭代器。

  2.判断是否是可迭代对象,迭代器的方法。

    (1)可迭代对象有__iter__方法,没有__next__方法

     迭代器有__iter__ __next__方法

    (2)iterable:形容词  可迭代的:from collections import Iterable:用来检测一个对象是否可以迭代。 

       isinstance()判断数据的类型,查看是否可迭代。

  3.for循环的本质

    for循环可以遍历一个可迭代对象,也可以遍历一个迭代器。

    当遍历一个可迭代对象时,会自动调用其__iter__()方法,变为一个迭代器。然后调用__next__()方法。遇到StopIteration终止。

  4.迭代器取值与索引取值的对照

    (1)迭代器的缺点:不能定点取值。

           不能往回取值。

    (2)迭代器的优点:惰性计算,节省内存。

             可以遍历字典,集合取值。这点是索引无法做到的。无序且不知道有哪些key值。

 

文件本质也是一个迭代器。range()就是一个可迭代对象,可迭代对象有:字符串,列表,元组等等。

__iter__():将一个可迭代对象转化成一个迭代器

__next__():读取迭代器的内容,一次只能读取一行或者一个内容

# with open('a.txt',encoding='utf-8')as f:
#     print(f.__next__())
#     print(f.__next__())
#     print(f.__next__())
#     print(f.__next__())
#     print(f.__next__())
#
# b=[41,52,5,26,7,4,2,9,]
# bb=b.__iter__()
# print(bb.__next__())
# print(bb.__next__())
# print(bb.__next__())
# print(bb.__next__())
# print(bb.__next__())

二 生成器 Generator

  生成器本质上是迭代器。  

  生成器是用户写出来的。

  1.生成器的分类

    带有yield关键字的生成器函数

    由生成器表达式生成的生成器 

  2.生成器函数

    带有yield关键字的函数叫做生成器函数。

    与普通函数的不同之处:调用生成器函数返回来是生成器。可以用for循环转化,也可以用list强转,也可以用 next来一个一个转换。

    推荐用for,方便又省内存。

    yield关键字:  

      与return相同的部分:

      与rerurn不同的部分: 

三、生成器的应用

  生成器可以模仿管道的概念,借助生成器,可以一直往外传值。

  也可以用send方法给生成器传值。

def foo():
    money=0
    day=0
    average=0
    while True:
        value=yield average
        money+=value
        day+=1
        average=money/day
g=foo()

print(g.__next__())
print(g.send(200))

 

而生成器和迭代器运行的顺序是只能往前取值,而不能够回头。

  生成器的用法:1 有几个next,就取几个yield的返回值,不能超过yiled的范围。

         2 直接for循环取值:for 变量名 in 生成器名。

         3 其他数据类型进行强转,list(数据类型对象)返回一个列表,里面装着生成器的所有内容。

  注意:1 生成器函数取值必须先转换成生成器,在进行next取值。

     2 生成器的内容只能取一次,不能重复,只能向前取值;不能后退,直到取完为止。

惰性运算:生成器里面的内容不获取,不生成。只有在要值的时候现生成。

for i in range(1,10):
    print(i)
print(list(range(10,20)))

  

 

 

---恢复内容结束---

posted @ 2017-09-10 10:49  可造之猿  阅读(70)  评论(0)    收藏  举报