python创建生成器对象_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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值