五. python进阶(迭代器)

Posted sup-to

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五. python进阶(迭代器)相关的知识,希望对你有一定的参考价值。

一. 迭代器

我们已经知道,可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象:
# 表示生成了两个迭代器      而生成器函数可以作用于一个迭代器
ll=[1,2,3,4,5,6]
for i in ll:
    if i==3:
        break
    print(i)


print("###################################333")
for i in ll:
      print(i)
# a=[1,2,3]
# for i in a:
#     print(i)
# 为什么这些可以循环
#     list
#     dict
#     str
#     set
#     tuple
#     f=open
#     range
#     enumerate
print(dir([]))    #  告诉我列表里面有什么方法

print(dir())  #  告诉我元组里面有什么方法

print(dir({})) #告诉我字典里面有什么方法

print(dir(‘‘)) #告诉我字符串里面有什么方法

print(dir(range(10)))  #告诉我range里面有什么方法

# 双下方法
print([1].__add__([2]))  # 同等print([1]+[2])
print([1]+[2])
# 说明一个问题能被for循环的数据类型 就一定拥有__iter__方法   iterator
print(__iter__ in dir(int))    # False  不是迭代器
print(__iter__ in dir(bool))  # False  不是迭代器
print(__iter__ in dir(set))   # True
print(__iter__ in dir(list))  # True
print(__iter__in dir(dict))    # True   迭代器
print(__iter__in dir(tuple))  # True    迭代器
print(__iter__in dir(str))  # True       迭代器
#
# 区分可迭代l对象和迭代器
# 可迭代对象是含有iter()方法的对象。iter()方法返回一个迭代器。
# String, tuple, list,dict都是可迭代对象,因为它们都实现了iter()方法;
# 但是他们都不是迭代器,因为它们都没有实现iter()方法。

# 执行了__iter__方法之后的返回值是一个迭代器
# 只有含有__iter__方法的都是可以迭代的     就是可迭代协议
# 迭代协议内部含有__next__和__iter__方法就是迭代器

1. 迭代模块

from collections import Iterable
from  collections import  Iterator

print(isinstance([],Iterator))  #   判断是不 是迭代器

print(isinstance([],Iterable))   #  判断是不是迭代的对象

print(dir([]))


#  判断是不是可以迭代,用Iterable
isinstance({}, Iterable)  #  --> True
isinstance((), Iterable)  #  --> True
isinstance(100, Iterable)  #  --> Fals

#  判断是不是迭代器,用Iterator
isinstance({}, Iterator)   #  --> False
isinstance((), Iterator)   #  --> False
isinstance( (x for x in range(10)), Iterator)   #  --> True


# 迭代器和可迭代协议
# 可以被for循环都是可以迭代的
# 只要是迭代器 一定可以迭代
# 可迭代的__iter__方法就可以得到一个迭代器
# 迭代器中的__next__方法可以一个一个的获取值
# 迭代器的好处
 # 从容器类型中一个一个的取值 会把所有的值取到
 # 节省内存
# print(list(range(1000000000)))  # 没有真正的生成数据 在内存中 只是通过range 给了个数字  意思就是处理一个数据就生成一个数据
# 通过迭代器模拟for循环
l=[1,2,3,4]
aa=l.__iter__()
while True:
    print(aa.__next__()

 

 

 

以上是关于五. python进阶(迭代器)的主要内容,如果未能解决你的问题,请参考以下文章

python开发函数进阶:可迭代的&迭代器&生成器

Python进阶:设计模式之迭代器模式

Python进阶:设计模式之迭代器模式

Python进阶-迭代器和生成器

python开发函数进阶:可迭代的&迭代器&生成器

Python进阶:一文搞懂迭代器生成器协程(附案例)