python之路_初始迭代器与生成器

一、迭代器

1、可迭代对象——iterable

(1)判断是否可迭代的方法:

from collections import Iterable
print(isinstance('aaa',Iterable)                       #输出结果:True
print(isinstance(123,Iterable)                         #输出结果:False
print(isinstance([1,2,3],Iterable)                    #输出结果:True

  常见的可迭代对象有:字符串、列表、元组、字典、集合、文件句柄、range()

(2)可迭代协议

  包含‘__iter__'方法的数据类型就是可迭代的。输出数据类型所有方法的方式如下:

#实例:求出两个不同数据类型的方法的不同
difference=set(dir([1,2,3]))-set(dir(123))          #dir()方法以列表形式列出数据的所有的方法
print(diffenrence)

2、迭代器——iterator

(1)判断迭代器的方法

from collection import Iterator
iterator_lst=[1,2,3].__iter__()
print(isinstance(itertor_lst,Iterator)               #输出结果为:True
print(isinstance([1,2,3],Iterator)                   #输出结果为:False

(2)迭代器协议

  迭代器中有'__next__'和'__iter__'方法

(3)常见迭代器

  a.先天的:文件句柄;b后天的:从可迭代对象转变,格式为:“可迭代对象.__iter__()”

(4)迭代器取值

lst_iterator=[1,2,3].__iter__()
print(lst_iterator.__next__())                        #输出结果为:1
print(lst_iterator.__next__())                        #输出结果为:2
print(lst_iterator.__next__())                        #输出结果为:3
#超过迭代器中的内容就会报错:stopIterator

(5)优点

  a.能对python数据类型进行遍历,不关心每一个值;b.可以节省空间:惰性计算

3、二者的区别

(1)可迭代对象包含迭代器;(2)迭代器=可迭代对象.__iter__();(3)可以对可迭代对象和迭代器进行循环

二、生成器

1、定义:生成器就是迭代器,生成器是我们自己写出来的

2、生成器函数:带有关键字yield/yield from的函数就称为生成器函数

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

def generator():
    print(123)
    yield ’aaa‘
g=generator()
print(g)   #返回结果:生成器地址<generator object generator at 0x0000023F014D3BA0>

(2)从生成器中取值

  a.生成器.__next__():生成器函数中有几个yield,就可以取几次

def generator():
    print(123)
    yield 'aaa'
    print(456)
    yield 'bbb'
g=generator()
print(g.__next__())                                   #输出结果:123 aaa
print(g.__next__())                                   #输出结果:456 bbb



def generator():
    print(123)
    yield 'aaa'
    print(456)
    yield 'bbb'
print(generator().__next__())                        #输出结果:123 aaa
print(generator().__next__())                        #输出结果:123 aaa

注意:前者为创建一个生成器,后者为每次重新创建一个生成器

  b.for循环取值

#实例1:
def generator():
    print(123)
    yield 'aaa'
    print(456)
    yield 'bbb'
g=generator()
for i in g:
    print(i)
#实例2:
def generator():
    for i in range(1,50000):
        yield "第%s件衣服" %i
g=generator()
for j in g:
    print(j)
    if j=='第50件衣服':
        break

  c. list(生成器函数) 返回一个列表,里面装着生成器中的所有内容

def generator():
    yield 'aaa'
    yield 'bbb'
g=generator()
print(list(g))                                         #输出结果为:[aaa,bbb]

三、生成器实例

1、yield from实例

def generator():
    yield from [1,2,3]
    yield from 'abc'
g=generator()
for i in g:
    print(i)
****************************************等价于*****************************************
def generator(): for i in [1, 2, 3]: yield i for j in 'abc': yield j g = generator() for i in g: print(i)

2、监控文件中写入的内容

import time
def generator(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
g=generator('demo')
for line in g:
    print(line,end='')
#ctr+s键查看在文件中输入的内容
原文地址:https://www.cnblogs.com/seven-007/p/7474622.html