迭代器

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 # 生成器函数:本质上就是我们写的函数
View Code

 

以上是关于迭代器的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段6——CSS选择器

行历史查看器 - Git

持久片段和查看器

损坏的顶点和片段着色器

python使用上下文对代码片段进行计时,非装饰器

设计模式迭代器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )