Python 生成器与生成可迭代对象

明知道什么事情不可能,还非要揣着希望,明明想为什么人把命都赌上,可是连下注的理由都没有。

生成器

主要能节省内存,每次都是制造一个元素然后返回这个原始,主要用法包括用()和yield生成。

构造生成器对象

如下就是一个生成器,和迭代器对象用法相似,使用next()获取下一个元素。

data_list=(i for i in range(10))
print data_list.next()

函数中只要有yield,这个函数就会变成生成器。每次运行到yield的时候,函数会暂停,并且保存当前的运行状态,返回返回当前的数值,并在下一次执行next方法的时候,又从当前位置继续往下走。

def f():
    print 'Test 1'
    yield 1
    yield 2
    yield 3
g = f()
print g.next()
print g.next()
print g.next()

运行结果:

Test 1
1
2
3

主要能够节省内存,每次数值都是及时返回并没有保存在内存中。都是制造一个打印一个。

代码实例

寻找素数

要求:使用yield生成一个可迭代对象,然后依次返回1-30之类的所有的素数。(素数:不能被任何数整除的数)
困惑:工程逻辑
分析:使用class类方法,首先维护传入的两个数字(1,30),然后判断是否是素数,使用一个变量k作为生成器对象yield k。

class Sushu:
    def __init__(self,start,end):
        # 构造器,维护传入的初始值与最终值
        self.start=start
        self.end=end
    def issushu(self,k):
        # 接受传入的k值
        if k<2:
            # k值必须大于2
            return False
        for x in range(2,k):
            if k%x == 0:
                return False
            else:
                return True
            # 只有确认k是素数的时候返回正确
    def __iter__(self):
        #在Python中加双下划线的方法基本上都是对Python默认行为的重载。所以都会有对应的函数,或者Python内部来调用。在这里,__iter__是iter内建函数。__next__是next内建函数。
        for k in range(self.start,self.end):
            if self.issushu(k):
                # 如果这个类中的issushu函数是存在或者正确的
                yield k

运行结果:

2
3
5
7
11
13
17
19
23
29

正向迭代与反向迭代

要求:正向迭代与反向迭代对象,并且进值是可以选择的。
困惑:如果使用列表的[::-1]的话就变成了一个新的对象,不适用。
分析:class类中使用(__reversed__)方法。并且用yield记录返回的值。

class Diedai:
    def __init__(self,start,end,step=0.5):
        self.start=start
        self.end=end
        self.step=step
    def __iter__(self):
        t = self.start
        while t <= self.end:
            yield t
            t += self.step
    def __reversed__(self):
        t = self.end
        while t >=self.start:
            yield t
            t -= self.step

for x in Diedai(1,10,0.5):print x
for x in reversed(Diedai(1,20,0.2)):print x

运行结果:

1
1.5
2.0
2.5
3.0
3.5
4.0
4.5
5.0
5.5
6.0
6.5
7.0
7.5
8.0
8.5
9.0
9.5
10.0
20
19.8
19.6
19.4
19.2
19.0
18.8
18.6
18.4
18.2
18.0
17.8
17.6
17.4
17.2
17.0
16.8
16.6
16.4
16.2
16.0
15.8
15.6
15.4
15.2
15.0
14.8
14.6
14.4
14.2
14.0
13.8
13.6
13.4
13.2
13.0
12.8
12.6
12.4
12.2
12.0
11.8
11.6
11.4
11.2
11.0
10.8
10.6
10.4
10.2
10.0
9.8
9.6
9.4
9.2
9.0
8.8
8.6
8.4
8.2
8.0
7.8
7.6
7.4
7.2
7.0
6.8
6.6
6.4
6.2
6.0
5.8
5.6
5.4
5.2
5.0
4.8
4.6
4.4
4.2
4.0
3.8
3.6
3.4
3.2
3.0
2.8
2.6
2.4
2.2
2.0
1.8
1.6
1.4
1.2
1.0
坚持原创技术分享,您的支持将鼓励我继续创作!
------ 本文结束 ------

版权声明

LangZi_Blog's by Jy Xie is licensed under a Creative Commons BY-NC-ND 4.0 International License
由浪子LangZi创作并维护的Langzi_Blog's博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Langzi_Blog's 博客( http://langzi.fun ),版权所有,侵权必究。

0%