迭代器:迭代的工具。迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也能够说成是重复,而且但每一次的重复都是基于上一次的结果来的。如计算机中的迭代开发,就是基于软件的上一个版本更新。如下代码就不是迭代,它只是单纯的重复工具
while True: print('*'*10)
python中一切皆对象,如code
x = 1 name = 'nick' lis = [1, 2] tup = (1, 2) dic = {'name': 'nick'} s1 = {'a', 'b'} def func(): pass f = open('49w.txt', 'w', encoding='utf-8)
对于这一切的对象中,但凡是有__iter__
方法的对象,都是可迭代对象。对象
# x = 1.__iter__ # SyntaxError: invalid syntax # 如下都是可迭代的对象 name = 'nick'.__iter__ lis = [1, 2].__iter__ tup = (1, 2).__iter__ dic = {'name': 'nick'}.__iter__ s1 = {'a', 'b'}.__iter__ f = open('49w.txt', 'w', encoding='utf-8') f.__iter__ f.close()
可迭代的对象:Python内置str、list、tuple、dict、set、file都是可迭代对象。blog
特色:索引
__iter__
方法的都叫可迭代的对象。只有字符串和列表都是依赖索引取值的,而其余的可迭代对象都是没法依赖索引取值的。所以咱们得找到一个方法能让其余的可迭代对象不依赖索引取值。内存
在找到该方法前,首先咱们给出迭代器对象的概念:可迭代的对象执行__iter__
方法获得的返回值。而且可迭代对象会有一个__next__
方法。utf-8
# 不依赖索引的数据类型迭代取值 dic = {'a': 1, 'b': 2, 'c': 3} iter_dic = dic.__iter__() print(iter_dic.__next__()) print(iter_dic.__next__()) print(iter_dic.__next__()) # print(iter_dic.__next__()) # StopIteration:
a b c
# 依赖索引的数据类型迭代取值 lis = [1, 2, 3] iter_lis = lis.__iter__() print(iter_lis.__next__()) print(iter_lis.__next__()) print(iter_lis.__next__()) # print(iter_lis.__next__()) # StopIteration:
1 2 3
上述的方法是很是繁琐的,咱们可使用while循环精简下。其中使用的try...except...
为异常处理模块,之后会详细讲解。开发
s = 'hello' iter_s = s.__iter__() while True: try: print(iter_s.__next__()) except StopIteration: break
h e l l o
迭代器对象:执行可迭代对象的__iter__
方法,拿到的返回值就是迭代器对象。字符串
特色:
__next__
方法,执行该方法会拿到迭代器对象中的一个值__iter__
方法,执行该方法会拿到迭代器自己缺点:
for循环称为迭代器循环,in后必须是可迭代的对象。
lis = [1, 2, 3] for i in lis: print(i)
1 2 3
由于迭代器使用__iter__
后仍是迭代器自己,所以for循环不用考虑in后的对象是可迭代对象仍是迭代器对象。
因为对可迭代对象使用__iter__
方法后变成一个迭代器对象,这个迭代器对象只是占用了一小块内存空间,他只有使用__next__
后才会吐出一个一个值。如lis = [1,2,3,4,5,...]
至关于一个一个鸡蛋,而lis = [1,2,3,4,5,...].__iter__
至关于一只老母鸡,若是你须要蛋,只须要__next__
便可。
Python2中
print(range(10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Python3中
print(range(10)) # range(0, 10)