python迭代器

可迭代的对象:

# list
# dic
# str
# set
# tuple
# f = open()
# range()
# enumerate

 

列表是可迭代,有__iter__方法,但不是迭代器,没有__next__和__iter__方法

dir([])查看列表拥有的所有方法

print(dir([]))
print(dir([].__iter__()))
print(set(dir([].__iter__())) - set(dir([])))
print([].__iter__())
结果:

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']

{'__length_hint__', '__next__', '__setstate__'}

<list_iterator object at 0x00000286CDD2A208>

setstate设置起始值,默认为0
print
([1,'a','bbb'].__iter__().__length_hint__()) #元素个数 l = [1,2,3] iterator = l.__iter__() print(iterator.__next__()) #通过next就可以从迭代器中一个一个的取值 print(iterator.__next__()) print(iterator.__next__())
结果:

3
1
2
3

 

 

 

迭代器的概念
迭代器协议 —— 内部含有__next__和__iter__方法的就是迭代器

迭代器协议和可迭代协议
可以被for循环的都是可迭代的
可迭代的内部都有__iter__方法
只要是迭代器 一定可迭代
可迭代的.__iter__()方法就可以得到一个迭代器
迭代器中的__next__()方法可以一个一个的获取值

迭代器的好处:
从容器类型中一个一个的取值,会把所有的值都取到。
节省内存空间
迭代器并不会在内存中再占用一大块内存,
而是随着循环 每次生成一个
每次next每次给我一个

 

自定义for循环打印,做迭代器,每次打印最后的值之后都会报错

l = [1,2,3,45]
iterator = l.__iter__()
while True:
    print(iterator.__next__())
结果:

1
2
3
45
Traceback (most recent call last):
File "E:/Documents/PycharmProjects/study/day12/01.py", line 4, in <module>
print(iterator.__next__())
StopIteration

 

l是列表可迭代对象而不是迭代器,for循环在内部将l变成迭代器,所以每一个for都是一个新的迭代器

l = [1,2,3,4,5]
for i in l:
    print(i)
    if i == 2:
        break
for i in l:
    print(i)
结果:

1
2
1
2
3
4
5

如果事先将l转换成迭代器,那么它可以沿着上一次的内容继续打印,__next__方法存放着调用记录

迭代器是可以继续执行的

l = [1,2,3,4,5]
l = l.__iter__()
for i in l:
    print(i)
    if i == 2:
        break
for i in l:
    print(i)
结果:

1
2
3
4
5

 

转载于:https://www.cnblogs.com/daoyueweiku/p/9712774.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值