|
迭代器:迭代的工具。迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的。如计算机中的迭代开发,就是基于软件的上一个版本更新。以下代码就不是迭代,它只是单纯的重复- while True:
- print('*'*10)
复制代码 一、可迭代对象
python中一切皆对象,如- 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都是可迭代对象。
特点:
内置有__iter__方法的都叫可迭代的对象。
二、迭代器对象
只有字符串和列表都是依赖索引取值的,而其他的可迭代对象都是无法依赖索引取值的。因此我们得找到一个方法能让其他的可迭代对象不依赖索引取值。
在找到该方法前,首先我们给出迭代器对象的概念:可迭代的对象执行__iter__方法得到的返回值。并且可迭代对象会有一个__next__方法。
- 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:
复制代码 输出- 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:
复制代码 输出上述的方法是非常繁琐的,我们可以使用while循环精简下。
其中使用的try...except...为异常处理模块,以后会详细讲解。- s = 'h
- e
- l
- l
- o'
- iter_s = s.__iter__()
- #学习中遇到问题没人解答?小编创建了一个Python学习交流群:489111204
- while True:
- try:
- print(iter_s.__next__())
- except StopIteration:
- break
复制代码 输出总结
迭代器对象:执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象。
特点:
- 内置__next__方法,执行该方法会拿到迭代器对象中的一个值
- 内置有__iter__方法,执行该方法会拿到迭代器本身
- 文件本身就是迭代器对象。
缺点:
- 取值麻烦,只能一个一个取,并且只能往后取,值取了就没了
- 无法使用len()方法获取长度
三、for循环原理
for循环称为迭代器循环,in后必须是可迭代的对象。- lis = [1, 2, 3]
- for i in lis:
- print(i)
复制代码 输出因为迭代器使用__iter__后还是迭代器本身,因此for循环不用考虑in后的对象是可迭代对象还是迭代器对象。
由于对可迭代对象使用__iter__方法后变成一个迭代器对象,这个迭代器对象只是占用了一小块内存空间,他只有使用__next__后才会吐出一个一个值。如lis = [1,2,3,4,5,...]相当于一个一个鸡蛋,而lis = [1,2,3,4,5,...].__iter__相当于一只老母鸡,如果你需要蛋,只需要__next__即可。- print(range(10)) # range(0, 10)
复制代码 来源:https://www.cnblogs.com/python1111/p/17145645.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|