迭代器生成器

迭代器Iterator

 

1.可迭代对象  iterable 形容词 可迭代的

 

-1.from collections import Iterable  #检测一个对象是否可迭代
 print(isinstance('aaa',Iterable))
 print(isinstance(123,Iterable))
 print(isinstance([1,2,3],Iterable))

 

   -  2.含有__iter__方法的对象

#只要包含了“双下iter”方法的数据类型就是可迭代的  ——  可迭代协议
#数据类型和python解释器定下来的协议
# print([1,2,3].__iter__()) #打印出内存地址


2.迭代器 iterator 名词 迭代器

-1.迭代器 就是实现了从可迭代对象中一个一个的取值出来

-2.含有__itre__和__next__方法的对象

-3.检测是否是迭代器
from collections import Iterator
lst_iterator = [1,2,3].__iter__()
print(isinstance(lst_iterator,Iterator))
print(isinstance([1,2,3],Iterator))

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

3.可迭代对象和迭代器的关系
迭代器和可迭代对象之间的关系
-迭代器包含可迭代对象
-迭代器 = 可迭代对象.__iter__()

-可迭代对象 并不能用
-迭代器 #他不关心值得索引状态
4.捕捉异常,try except
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

 

5.for循环对象可以是一个可迭代对象,也可以是一个迭代器

 

6.为什么要有迭代器,迭代器存在的本质是什么

-1.能够对python中的基本数据类型进行统一的遍历,不需要关心每一个值分别是什么
-2.它可以节省内存 —— 惰性运算

 -f = open('file','w')  #文件句柄就是一个迭代器
-range(10000000).__iter__() #range就是一个可迭代的对象


生成器Gerator


1.生成器就是迭代器,使我们自己写出来的
-生成器函数
-生成器表达式 :yield


2.生成器定义
- 带yield关键字的函数就是生成器函数
- 生成器函数在执行的时候只返回一个生成器,不执行生成器函数中的内容
- 从生成器中取值
- 1.__next__ 有几个yield就可以取几次
- 2.for循环取值 正常取 for i in g:
- 3.其他数据类型进行强制转换 list(g) 返回一个列表,里面装着生成器中的所有内容
- 注意:调用生成器函数的时候,要先获取生成器,再进行next取值
- 生成器中的内容只能取一次,且按顺序取值没有回头路,取完为止。

3.生成器实例:监视文件写入
import time
def tail(filename):
    f = open(filename,encoding='utf-8')    
    f.seek(0,2)   #将文件的光标移到最后
    while True:
        line = f.readline()    #读取一行
        if not line:    #如果这一行为空进入
            time.sleep(0.1)
            continue    #返回死循环
        yield line    #如果不为空有写入内容就返回这一行

tail_g = tail('demo')
for line in tail_g:
    print(line,end='')

 

4.yield from


# def func():
#     for i in [1,2,3]:
#         yield i
#     for j in 'ABC':
#         yield j

def func2():
    yield from [1,2,3]  #和for循环一样,每次拿出一个值返回
    yield from 'ABC'
g = func2()
for i in g:
    print(i)

 

5.生成器示例
def get_clothing():
    for cloth in range(1,2000000):
        yield '第%s件衣服'%cloth

generate = get_clothing()
print(generate.__next__())
print(generate.__next__())
print(generate.__next__())

for i in range(50):  #取50个
    print(generate.__next__())


for i in get_clothing():  #控制取出的数量
    print(i)
    if i == '第100件衣服':
        break

 


def generator_func():  #生成器函数
    print(123)
    yield 'aaa'   #return
    print(456)
    yield 'bbb'

g = generator_func()
print(g.__next__)  #123 aaa
print(g.__next__)  #456 bbb

 

注意出错点

def get_clothing():
    for cloth in range(1,2000000):
        yield '第%s件衣服'%cloth

print(get_clothing().__next__())  #第一件衣服  
print(get_clothing().__next__())   #第一件衣服 
print(get_clothing().__next__())    #第一件衣服

-  每一次__next__(),都是调用一个新的生成器

-  所有要给生成器赋值来使用  g = get_clothing()

 
posted @ 2017-09-04 15:47  选择远方,风雨兼程。  阅读(145)  评论(0编辑  收藏  举报