#!/usr/bin/python
#-*-coding:utf-8 -*-
'''
迭代器
迭代: 重复的过程称为迭代 但是还有重要的一点====>>每次迭代的结果是下一次迭代的初始值
为什么要用迭代器:
有序:有明确的索引或者下标
无序:比如文件,字典没有顺序
对于没有索引的数据类型,必须提供一种不依赖索引的迭代方式
可迭代的对象:
只要此数据类型下边有__iter__的就是可迭代对象
# [1,2,4,].__iter__()
# (1,2,3,).__iter__()
# {1,3,3}.__iter__()
# {'name':'alex','age':23}.__iter__()
# 'hello'.__iter__()
# f = open('aa.txt','w')
# f.__iter__()
迭代器:
执行__iter__得到的对象就是迭代器
# v = [1,2,4,].__iter__()
# print(v)
# #打印结果
# #<list_iterator object at 0x0000013B36E6D160> iterator 迭代器
v = [1,2,4,].__iter__()
#以下两种形式等同
print(v.__next__())
print(next(v))
#打印结果 每次print 依次取出值 当取值超过所有的值后 提示StopIteration 也就是取值完毕的意思
#1
#2
##举例字典的迭代
# dic = {'name':'alex','age':23}.__iter__()
# print(next(dic))
# print(next(dic))
# #打印结果 取出的是key 打印结果是无序的 顺序是随机的
# # name
# # age
#然后用while迭代 实现依次取出地点的value
# dic = {'name':'alex','age':23}
# i = dic.__iter__()
# while True:
# key=next(i)
# print(dic[key])
#以上的代码,会抛出异常StopIteration
#解决的方法 try except
# dic = {'name':'alex','age':23}
# i = dic.__iter__()
# while True:
# try:#try里放可能会抛出异常的代码
# key=next(i)
# print(dic[key])
# ##except 指出可能会抛出什么异常
# except StopIteration:
# break
###补充####
# dic = {'name':'alex','age':23}
# test1=dic.__iter__() ####
# print(test1)
# test2=iter(dic)###效果一致 发现规律了吧
# print(test2)
##如何判断一个对象是可迭代的对象,还是迭代器
##迭代器一定是可迭代的对象,可迭代的对象不一定是迭代器
from collections import Iterable,Iterator
#判断字符串'hello'是不是可迭代对象
# print(isinstance('hello',Iterable)) #True
# #判断字符串'hello'是不是迭代器
# print(isinstance('hello',Iterator)) #False
#可迭代对象
# 内置iter方法的
#迭代器
# 执行iter后的结果,结果 有next方法
# f = open('aa.txt','w')
# f.__iter__()
#以下都是可迭代的对象
# print(isinstance('hello',Iterable)) #字符串
# print(isinstance([],Iterable)) #列表
# print(isinstance({'name':'alex'},Iterable)) #字典
# print(isinstance((),Iterable))#元组
# print(isinstance({1,2,},Iterable))#集合
# print(isinstance(f,Iterable))#文件
#文件是迭代器
# print(isinstance('hello',Iterator)) #字符串
# print(isinstance([],Iterator)) #列表
# print(isinstance({'name':'alex'},Iterator)) #字典
# print(isinstance((),Iterator))#元组
# print(isinstance({1,2,},Iterator))#集合
# f.__next__()##仅仅f直接有next 这些里只有文件是迭代器
#迭代协议
# 对象有__next__ # 对象有__iter__ 对于迭代器来说,__iter__的结果还是它本身#可迭代对象只有 __iter__#for循环拿出了key,是怎么个原理呢,下面为你揭晓 # dic = {'name':'alex','age':23} # for k in dic: #iter(dic)==>> k=next(i) 迭代循环 # print(k) #for循环遵循的是迭代器协议 #for会把in后的这个对象 iter了 变成迭代器,每次循环一次就是一次next #并且for把try和except功能也做了 捕捉异常 ##下面针对文件再说说 # with open('aa.txt','r',encoding='utf-8') as f: # for line in f: # print(line.strip()) # print(next(f))迭代器的优劣 优点: 1.提供了一种不依赖下标的迭代方式 2.就迭代器本身来说,更节省内存 缺点: 1.是一次性的,只能依次往下走,不能退回,不如序列对象取值灵活 2.无法获取迭代器对象的长度#enumerate 本身就是个迭代器 # i=[a,b,c] # v=enumerate(i) # v.__iter__() # v.__next__()'''