迭代器和生成器

迭代器

可迭代协议:只要是含有__iter__方法的都是可迭代的

我们用dir()可显示出列表、字典、字符串所包含的所有方法,可以看到他们都会含有__iter__,只要是能被for循环的数据类型,就一定用拥有__iter__方法。

print(dir([]))
print(dir({
   }))
print(dir(''))

判断一个对象是否是可迭代的

from collections import Iterable
print(isinstance([],Iterable))

执行__iter__()后返回的就是一个迭代器,下面我们看看迭代器中特有的方法

l = [1,2,3]
itera = l.__iter__()    # itera现在是迭代器
# 查看迭代器中相比原来的列表特有的方法
print(set(dir(itera))-set(dir([])))
>>>{
   '__next__', '__length_hint__', '__setstate__'}

itera.__length_hint__()可返回迭代器的长度

itera.___next__()可一个一个的获取值

迭代器协议:内部含有__next____iter__方法的就是迭代器。

判断一个对象是否是迭代器

from collections import Iterator
print(isinstance([],Iterator))

我们可以自己创建一个数据类型,让他包含__next____iter__这两个方法,来验证上述结论是否正确。

class D:
    def __iter__():
        pass
    def __next__():
        pass
    
d = D()
print(isinstance(d,Iterator))
>>> True

for循环其实就是在用迭代器

l = [1, 2, 3]
for i in l:
    print(i)
# for循环其实就是先执行
# l.__iter__()得到迭代器iterator
# 然后iterator.__next__()得到一个一个的值
迭代器总结
  • 会区分迭代器协议和可迭代协议,迭代器一定是可迭代的,可迭代的不一定是迭代器;

  • 可迭代的对象用__iter__()方法可得到一个迭代器;

  • 只有是可迭代对象的时候才能用for循环,也就是可以被for循环的都是可迭代的。当我们遇到一个新的变量,不确定能不能for循环时,可判断它是否可迭代。

  • 迭代器的好处:

    • 从容器类型中一个一个的取值,会把所有值都取到,使用方便。

    • 节省内存空间,迭代器并不会在内存中占用一大块内存,而是随着循环每次生成一个或者每次next给一个。

      print(range(10000000000000))
      # 输出结果是range(0,10000000000000)
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值