迭代器

迭代器

迭代器:迭代的工具。可以说迭代是一种重复,但这个重复是基于上一次的结果在进行的,如果上一次发生问题,就没办法进行下一次的迭代了

可迭代对象

常言道,python一切皆对象,如

x = 10
y = 12.34
name = 'hades'
lis = [1,2,'3']
tup = (1,2,'3')
dic = {'name':'hades','weight':'125'}
s = {1,2,4,6,'q'}
def f1():
    print('from f1')
    
f = open(r'aaa.txt','r',encoding='utf-8')

上面所列的都是对象,但凡拥有__iter__方法的对象,就是可迭代对象

name = 'hades'.__iter__()
lis = [1,2,'3'].__iter__()
tup = (1,2,'3').__iter__()
dic = {'name':'hades','weight':'125'}.__iter__()
s = {1,2,4,6,'q'}.__iter__()
f = open(r'aaa.txt','r',encoding='utf-8')
f.__iter__()
f.close()

x = 10.__iter__    #   报错
def f1():
    print('from f1')
f1.__iter__     # 报错
  File "<ipython-input-6-6ab44815576a>", line 10
    x = 10.__iter__    #   报错
                  ^
SyntaxError: invalid syntax

所以,在python中,除了数字类型和函数,其余的都是可迭代对象

特点:

  • 内置有__iter__方法的都叫可迭代对象

迭代器对象

在上面的可迭代对象(字符串、列表、元组、字典、集合、文件)中,只有字符串/列表/元组可以通过索引取值,其他的都无法进行,因此我们就需要一个方法不依赖索引也能将里面的东西全部取出来

这个方法就是__next__方法

dic = {'name':'hades','weight':'125'}
dic_iter = {'name':'hades','weight':'125'}.__iter__()
print(dic_iter.__next__())
print(dic_iter.__next__())
print(dic_iter.__next__())   # 取不到了会报错
name
weight



---------------------------------------------------------------------------

StopIteration                             Traceback (most recent call last)

<ipython-input-5-5398e64fd512> in <module>
      3 print(dic_iter.__next__())
      4 print(dic_iter.__next__())
----> 5 print(dic_iter.__next__())   # 取不到了会报错


StopIteration: 

但这样还是很麻烦,如果元素比较多,这样一个一个写非常麻烦,我们可以使用whil循环来进行,再通过try...except...方法进行异常处理

s = 'my name is hades.'
s_iter = s.__iter__()

while True:
    try:
        print(s_iter.__next__(),end= '  ')
    except Exception as e:
        break
m  y     n  a  m  e     i  s     h  a  d  e  s  .  

迭代器对象:执行完__iter__方法之后,拿到的返回值就是迭代器对象

特点:

  1. 拥有__iter__方法,可迭代对象拥有__next__方法的才是迭代器对象
  2. 文件本身就是迭代器对象

缺点:

  1. 取值比较麻烦,只可以向后取
  2. 无法计算长度

for循环原理

for循环称为迭代器循环,in后面必须是可迭代对象。

上面写的while循环就是for循环原理

因为迭代器使用__iter__后还是迭代器本身,所以for循环不用考虑in后面的对象是可迭代对象或者是迭代器对象

posted @ 2019-06-13 21:13  蔚蓝的爱  阅读(141)  评论(0)    收藏  举报