python 生成器

1.迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class MyRange(object):
    def __init__(self, n):
        self.idx = 0
        self.n = n
         
    def __iter__(self):
        return self
         
    def next(self):
        if self.idx < self.n:
            val = self.idx
            self.idx += 1
            return val
        else:
            raise StopIteration()
 
if __name__ == "__main__":
    for i in MyRange(3):
        print i
 
'''
0
1
2
[Finished in 0.2s]
'''

  

2.生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中。另外,对于生成器的特殊语法支持使得编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def fibonacci(num=5):
    a = 1
    b = 1
    yield a
    yield b
    while num>0:
        a,b=b,(a+b)
        yield b
        num -=1
 
if __name__ == "__main__":
    for i in fibonacci():
        print(i)
 
    print("*")*20
 
    f = fibonacci()
    while True:
        print(f.next())
 
'''<br>1
1
2
3
5
8
13
********************
1
1
2
3
5
8
13
    print(f.next())
StopIteration
'''

  3.生成器中还有两个很重要的方法:send()和close()。close() 强制停止迭代

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def MyRange(n):
    i = 0
    while i<n:
        val = yield i
        print"val is ",val
        i+=1
 
 
if __name__ == "__main__":
    m = MyRange(5)
    print m.next()
    print m.next()
    print m.send("A")
    print m.send("B")
    # print m.close()
    print m.send("C")
 
'''
0
val is  None
1
val is  A
2
val is  B
3
val is  C
4
[Finished in 0.2s]
'''

  

posted @   AlamZ  阅读(191)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示