Python中的迭代器、生成器

迭代器

要想知道什么是迭代器,先要知道什么是迭代
1、迭代:迭代,顾名思义就是重复做一些事很多次,就像我们
可以对list,tuple,dict,str等数据类型使用for…in的循环语法,从其中依次取出数据,这个过程叫做遍历,也叫迭代。
2、可迭代迭代对象:
简单来说,可以用for…in循环语句,从其中依次取出数据的对象,就是可迭代对象。例如,列表、元组、字典、字符串都是可迭代对象。整数、浮点数、布尔值都是不可迭代的。python中我们使用isinstance 函数判断变量是否是可迭代对象:

from collections import Iterable
li = [1,2,3,4]
d   = {'a':123}
f   = 1.23
i= 12
s = 'abc'
print(isinstance(li,Iterable))
print(isinstance(s,Iterable))
print(isinstance(d,Iterable))
print(isinstance(f,Iterable))
print(isinstance(i,Iterable))
#前面三个打印True,是可迭代对象。后面的打印False是不可迭代对象

只要类里面实现了__iter__ 方法,这个类的对象也是可迭代对象:

from collections import Iterable
class T1:
    def __iter__(self):
        pass
    def __init__(self):
        pass

class T2:
    def __init__(self):
        pass

t1 = T1()
print(isinstance(t1,Iterable))#返回True
t2 = T2()
print(isinstance(t2,Iterable))#返回False

3、迭代器:
迭代器是一个可以记住遍历的位置的对象(大白话理解:就是帮助我们记录位置的那个对象)
可迭代对象不一定是迭代器,只有内部实现了__next__方法才是迭代器。使用isinstance(t1,Iterator)判断对象是否是迭代器:

from collections import Iterable,Iterator
class T1:
    def __iter__(self):
        pass
    def __init__(self):
        pass
    def __next__(self):
        pass
class T2:
    def __init__(self):
        pass

li = [1,2,3,]
print(isinstance(li,Iterator))#False
t1 = T1()
print(isinstance(t1,Iterator))#True
t2 = T2()
print(isinstance(t2,Iterator))#False

可以用 iter 函数创建迭代器

list=[1,2,3,4]
it = iter(list)
print(isinstance(it,Iterator))
for x in it:
    print (x, end=" ")

自己实现迭代器:

class Letter(object):
    def __init__(self):
        self.names = ['A', 'B', 'C', 'D']
        self.num = 0

    def __iter__(self):
        return self  

    def __next__(self):
        while self.num < len(self.names):
            ret = self.names[self.num]
            self.num += 1
            return ret
        raise StopIteration

letter = Letter()
for i in letter:
    print(i)

for循环内部实现过程:

1,对象必须是可迭代对象(实现了__iter__方法)
2,可迭代对象的__iter__方法必须返回一个迭代器(实现了__iter__方法和__next__方法)
3,for循环就是调用对象的__iter__方法,返回一个迭代器,再调用迭代器的__next__方法,得到返回值的过程

使用迭代器实现斐波那契数列:

class Feibonaqi(object):
    def __init__(self, end):
        self.num1 = 1
        self.num2 = 1
        self.num = 0
        self.end = end

    def __iter__(self):
        return self  # 返回一个迭代器的实例

    def __next__(self):
        while self.num < self.end:
            ret = self.num1
            self.num1, self.num2 = self.num2, self.num1 + self.num2
            self.num += 1
            return ret
        raise StopIteration

fb = Feibonaqi(12)
for i in fb:
    print(i)
生成器

1、生成器是一个特殊的迭代器
2、只要在函数中出现了yield,他就不再是定义一个函数了,而是定义一个生成器
3、生成器加括号 也不再是调用一个函数了 而是创建一个生成器对象
4、使用next()启动生成器,一个next管到程序遇到一个yield
5、大白话理解:生成器就是把迭代器的遍历一个一个的吐出来(一个next吐一个)

def mygenetator():
    num = 0
    while num <3:
        print('yield before:',num)
        num += 1
        yield num
    print('after',num)

    gen = mygenetator()

    print(next(gen))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值