python3迭代器

一、前提

1.dir()函数

dir()函数带参数时,返回参数的属性和方法列表;不带参数时,返回当前范围内变量、方法和定义的类型列表

# dir(参数):带参数,返回参数的属性和方法
s = ''
print(dir(s))
print(dir([]))

2.双下法

双下法:带双下划线的方法。双下很少被直接调用,一般通过其它语法触发效果

l1 = [2, 1]
l2 = [1, 2]
print(l1 + l2)      # l1+l2 -> l1.__add__(l2),通过python解释器转化
print(l1.__add__(l2)) 

二、可迭代协议

1.可迭代协议:只要含有__iter__方法,就是可迭代的

2.判断

# 方法1,判断是否含义__iter__方法
l1 = list(range(10))
res = '__iter__' in dir(l1)
if res:
    print('l1,可迭代')
else:
    print('l1,不可迭代')
# 方法2,通过导入模块
from collections import Iterable, Iterator        # from collections import Iterable 被弃用

s = 'Hello, World!'
res = isinstance(s, Iterable)
if res:
    print('s,可迭代')
else:
    print('s,不可迭代')

三、迭代器协议

1.迭代器协议:含有__iter__和__next__方法,就是迭代器

2.获取迭代器

li = list(range(5))
iterator = li.__iter__()    # __iter__()方法的返回值,就是迭代器,将可迭代变成迭代器
print(iterator)

3.判断

# 方法1,通过__iter__和__next__方法判断
li = list(range(-5, 0))
# li = list(range(-5, 0)).__iter__()    # list不是迭代器,但list.__iter__()是迭代器
_iter = '__iter__' in dir(li)
_next = '__next__' in dir(li)
if _iter and _next:
    print("li,是迭代器")
else:
    print('li,不是迭代器')
# 方法2,通过导入模块
from collections.abc import Iterator
li = list(range(10))
if isinstance(li, Iterator):
    print('l1,是迭代器')
else:
    print('li,不是迭代器')

4.遍历

1)__next__

"""
__next__()方法
只要迭代器才有__next__()方法
__next__()方法,从迭代器中一个一个取值

"""
l1 = list(range(10, -5, -1))
count = 0
iterator = l1.__iter__()
while count < 5:
    count += 1
    print(iterator.__next__())      # 输出前五个元素
print('>>>', iterator.__next__())   # 输出第六个元素

2)for循环

"""
for循环1
对象是可迭代,但不是迭代器
使用for循环,实质是通过for循环创建一个迭代器
所以,每次使用for循环都会创建一个新的迭代器

"""
l1 = list(range(10, -5, -1))
count = 0
for i in l1():    # l1是可迭代对象,不是迭代器
    count += 1
    print(i)
    if count > 5:
        break
for i in l1():    # for循环内部创建一个新的迭代器
    print(i)
"""
for循环2
对象是迭代器
使用for循环,不用通过for循环内部另创一个迭代器
所以,每次使用for循环使用的都是同一个迭代器

"""
l1 = list(range(10, -5, -1))
count = 0
iterator = l1.__iter__()
for i in iterator:    # iterator是迭代器
    count += 1
    print(i)
    if count > 5:
        break
for i in iterator:    # 重新开始for循环,使用的依然是同一个迭代器
    print(i)

四、迭代器的优点

1.从容器类型中取值,不需要索引、key等

2.降低内存消耗

  原因:迭代器的数据通过for循环或__next__()方法加载到内存,而不是一次加载全部数据

五、总结

1.迭代器一定可迭代,可迭代不一定是迭代器

2.可迭代一定可以使用for循环,可以使用for循环一定可迭代

3.for循环,通过内部处理:可迭代->迭代器

4.迭代器:取容器类型的值,不依靠索引、key等

       减低内存的消耗

5.可迭代,可以通过__iter__()方法变成迭代器

6.通过判断是否可迭代,来确定是否使用for循环

原文地址:https://www.cnblogs.com/wt7018/p/10841575.html