码迷,mamicode.com
首页 > 编程语言 > 详细

python-高级特性

时间:2018-01-14 11:05:30      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:对象   instance   高级特性   pytho   gen   span   分享图片   ***   ext   


*********生成器*************


在Python中,这种一边循环一边计算的机制,称为生成器(Generator),节省大量的空间。

列表生成式,当生成时元素即打印,会占用内存。

一、读取生成器元素的两种方式:

*l.next()
*for循环读取;(生成器是可迭代对象);
列表生成式,当生成时元素即打印,会占用内存;

In [5]: l = [i for i in range(1,11)]

In [6]: print l
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

技术分享图片


In [7]: h = (i for i in range(1,11))  #将[] 改为()可创建生成器

*)生成器是可迭代对象

In [11]: from collections import Iterable #导入模块

In [12]: lh = (i**2 for i in range(3))

In [13]: isinstance(lh,Iterable)  #判断
Out[13]: True


技术分享图片

*for循环读取

技术分享图片

练习:生成著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都
可由前两个数相加得到

1, 1, 2, 3, 5,    8, 13,    21, 34,    ...


技术分享图片


技术分享图片

二、*)yield关键字

a.如果函数里面有yield关键字,那么调用这个函数的结果赋给的变量为生成器
b.当生成器g调用第一个next方法时,会运行函数,直到遇到第一个yield停止
c.当调用第二个next方法时,会从停止的地方继续执行,知道遇到下一个yield


技术分享图片


*)next方法与yield关键字的关系


技术分享图片


技术分享图片

In [18]: print lh.next()      #第一个next,遇到第一个yirld结束,打印1
first
1

In [19]: print lh.next()      #第二个next,遇到第二个yirld结束,打印2
second
2

In [20]: print lh.next()       #第三个next,遇到第三个yirld结束,打印3
third
3

三、*)生成器的send方法

a.使用send方法给生成器函数发送数据
b.使用send方法前,必须先调用一次next()方法
c.遇到下一个yield停止


*)消费者-生产者模型


技术分享图片

技术分享图片


技术分享图片



*)生成器实战应用:迷你聊天机器人


技术分享图片


技术分享图片



python-高级特性

标签:对象   instance   高级特性   pytho   gen   span   分享图片   ***   ext   

原文地址:http://blog.51cto.com/13362895/2060702

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!