迭代器
Posted whylinux
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器相关的知识,希望对你有一定的参考价值。
1.迭代器
1 # 迭代器 2 # 与一部分生成器 3 # Iterable 可迭代的意思 4 # Iterator 迭代器的意思 5 #l = [1, 2, 3] # 取值可以索引,可以切片,可以循环 6 7 8 # 可以被for循环的东西:list、dict、str、set、tuple、f = open()、range()、enumerate(枚举) 9 10 print(dir([])) # dir方法,传一个类型进行,得到这个类型的所有方法 11 print(dir({})) 12 print(dir(‘‘)) 13 print(dir(range(10))) 14 15 # 一般将双下划线的方法叫做双下方法,这些方法都是由C语言写的,可以用不只一种方法进行调用。一般情况下,双下方法是不需要我们被调用的 16 print([1].__add__([2])) # ==> print([1] + [2]) 17 18 # 可迭代的数据类型,都有一个__iter__方法,表示可迭代的.可迭代的对象都可以被for循环 19 print(‘__iter__‘ in dir(int)) # False 20 print(‘__iter__‘ in dir(list)) 21 print(‘__iter__‘ in dir(dict)) 22 print(‘__iter__‘ in dir(set)) 23 print(‘__iter__‘ in dir(tuple)) 24 print(‘__iter__‘ in dir(str)) 25 print(‘__iter__‘ in dir(bool)) # False 26 print(‘__iter__‘ in dir(enumerate([]))) 27 print(‘__iter__‘ in dir(range(1))) 28 29 print([].__iter__()) # <list_iterator object at 0x00000286651EEB00> 30 # list_iterator iterator翻译成中文后为迭代器 31 # 一个可迭代对象执行了__iter__()方法之后,返回的就是一个迭代器 32 33 print(dir([].__iter__())) # 迭代器所拥有的方法,拥有__iter__可迭代方法 34 print(dir([])) # 可迭代对象拥有的方法 35 36 # 迭代器所有的方法和可迭代对象拥有的方法进行差集后,这些方法就是可迭代对象可以迭代的秘密 37 print(set(dir([].__iter__())) - set(dir([]))) # {‘__length_hint__‘, ‘__setstate__‘, ‘__next__‘} 38 39 print([1, 2, ‘a‘, ‘bbb‘].__iter__().__length_hint__()) 40 # __length_hint__ 方法得到的是元素个数 41 # __setstate__ 方法 可以指定从哪个位置取元素 42 # __next__ 方法 可以帮助我们一个一个取值,可以从迭代器中一个一个取值 43 l = [1, 2, 3, 4] 44 iterator = l.__iter__() 45 print(iterator.__next__()) # 1 46 print(iterator.__next__()) # 2 47 print(iterator.__next__()) # 3 48 print(iterator.__next__()) # 4 49 50 # 只要含有__iter__方法的都是可以被for循环的,都是可迭代的。使用__iter__方法可得到迭代器 51 52 # 可迭代协议:只要含有__iter__方法的都是可迭代的 53 # 迭代器协议:内部只要含有__next__和__iter__方法的就是迭代器 54 # 所以我们可以创建一个对象,让这个对象具有可迭代功能,关键就是为这个对象加上迭代器功能,就是要提供__iter__方法和__next__方法 55 56 57 # 所以for循环一个对象的时候,for循环会去找这个对象是否有__iter__方法,没有就会报错说不可迭代。所以可迭代的对象、迭代器对象都是可以被for循环的 58 59 60 # 迭代器协议和可迭代协议 61 # 可以被for循环的都是可迭代的 62 # 可迭代的内部有__iter__方法 63 # 迭代器内部含有__iter__方法和__next__方法 64 # 迭代器一定可迭代,是迭代器一定是可迭代的,因为如果是迭代器,内部有__iter__和__next__方法,含有__iter__方法就是可迭代的 65 # 可迭代的.__iter__()方法就可以得到一个迭代器 66 # 迭代器中的__next__()方法可以一个一个的获取值 67 # for循环其实就是在使用迭代器。。因为想要用for循环,所以才想知道对象是不是可迭代对象或迭代器对象 68 69 # for循环原理,调用可迭代对象的__iter__()方法,拿数据时,都是调用__next__()方法取到的 70 # for i in l: 71 # pass 72 # iterator = l.__iter__() 73 # iterator.__next__() 74 75 # 使用while 模拟for 76 # l = [1, 2, 3, 4, 5] 77 # iterator = l.__iter__() # 得到迭代器 78 # while True: 79 # print(iterator.__next__()) # 使用__next__()方法取下一个值 80 81 # 迭代器的好处: 82 # 从容器类型中一个一个的取值,会把所有值都取到 83 # 有些可以节省内存空间,如range、文件句柄 84 # 迭代器并不会在内存中直接占用一大块内存,而是随着循环生成一个(每次__next__()给一个) 85 86 87 88 # 生成器,自己写的迭代器 89 # 生成器函数:本质上就是我们写的函数
以上是关于迭代器的主要内容,如果未能解决你的问题,请参考以下文章