五. python进阶(迭代器)

一. 迭代器

我们已经知道,可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:
dir()查看方法
而生成器不但可以作用于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迭代器(Iterator)



"""
我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

可以使用isinstance()判断一个对象是否是Iterable对象:

isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()。

字符串,列表或元组对象都可用于创建迭代器:
"""
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
print(it)
print (next(it))   # 输出迭代器的下一个元素
# 1
print("11**********************************************************")

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

# 1 2 3 4
print("22**********************************************************")

# 迭代器对象可以使用常规for语句进行遍历:
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

# 1 2 3 4
print("33**********************************************************")

a=[1,2,3]
b=a.__iter__()   # 使用对象内置的__iter__()方法生成迭代器
print(b)         #<list_iterator object at 0x0000014E5A08A2E8>
print(b.__next__())
# 1
print(b.__next__())
# 2
print(b.__next__())
# 3

print("44**********************************************************")
# f=open("aa.txt","r+")
# qq=f.__iter__()
# print(qq.__next__())
# 跌带器   案例
a=["爷爷","爸爸","儿子","孙子"]

b=a.__iter__()  # 创建迭代器对象

print(b.__next__())
# 爷爷
print(b.__next__())
# 爸爸
print(b.__next__())
# 儿子


# 其实next()就是在调用创建的这个迭代

c=["爷爷1","爸爸","儿子","孙子"]

b=c.__iter__()  # 创建迭代器对象
e=next(b)
print(e)

# 爷爷1

 

# 特点:
#     只能向前   几乎不站内存
#     for 循环
#     惰性机制


# print(dir(list))  #  __iter__  iterable
# print(dir(str))  #  __iter__
# print(dir(int))  # 没有 __iter__
# 所有的带__iter__可以使用for循环 可迭代对象
# 可迭代对象可以使用 __iter__()来获取迭代器
# 迭代器里面有 __next__()方法
# s="abc"
# c=s.__iter__()    # 迭代器 有 __iter__ () __next__()
#                    # 只能向前   几乎不站内存
# print(c)    # <str_iterator object at 0x00000169A4E38400>
# print(c.__next__())   #  a
# print(c.__next__())   #  b
# print(c.__next__())   #  c
# print(c.__next__())  # StopIteration 停止迭代


# 迭代器去模拟for 循环
ll=[1,2,3,4,5,6]
# for i in ll:  # for 循环底层就是用的迭代器
#     print(i)
print("********************************************************************")
aa=ll.__iter__()    #  获取迭代器
print(aa)
while True:
      try:
          print(aa.__next__())     #  获取元素
      except StopIteration:       # 处理错误
          break
from  collections import Iterable   #  可迭代对象   包含 __iter__()函数
from  collections import  Iterator   # 迭代器    __iter__()       __next__()
# 迭代器  一定可以迭代
print(isinstance([],Iterator))  #  False
print(isinstance([],Iterable))   #True
print(isinstance({},Iterator))  #  False
print(isinstance({},Iterable))   #True

 

 

 

posted @ 2019-05-11 23:57  supreme9999  阅读(203)  评论(0编辑  收藏  举报