python中的生成器yield

生成器yield使用yield语句
可以让函数生成一个结果序列而不仅仅是一个值

def  countdow(n):
     print("Start!");
     while n>0:
          yield n;
          n -= 1;
c = countdow(5);
print(c.__next__()) 
print(c.__next__())

输出结果:

Start!

5
4

__next__()方法使生成器函数一直运行到下一条yield语句为止,此时__next__()方法将返回值传递给了yield并且函数暂时中止执行
再次调用__next__()时 函数继续执行 此过程持续到生成器函数返回结束为止

通常不会手动调用__next__()方法 
而是使用循环

for i in  countdow(5):
 print(i);

输出结果:
5
4
3
2
1

生成器是基于处理管道、流或数据流编写程序的一种强大的方式;
如:

def tail(f):  
 for line in f:  
  if not line : #如果 非真 则暂时休眠并且再次尝试
   time.sleep(0.1);
   continue;
  yield line; # 将获取到的文件中的值 生成一个序列的值
filecount = tail(open(‘E:/work.txt‘));

#grep方法 用于在上面方法生成器中查找特定的子字符串  
def grep(lines,searchtext):
 for line in lines:
  if searchtext in line :
   yield  line;
lines  = grep(filecount,‘tom‘);  #查找带有tom 的子字符串
for line in lines: 
 print(line);

输出结果:
‘tom‘,120,132

总结:

生成器的作用:当程序运行到yield时 将运行的值
传递给了yield  程序不会输出 可认为在此时程序处于暂停的状态    当使用__next__()方法的时候 函数继续执行
直至再次遇到yield  

优点:yield存储的并不是单一的值,而是保存当前的程序执行状态 不用一次计算所有的元素 而是用一次算一次 节省内存空间

 

时间: 2024-08-02 11:17:07

python中的生成器yield的相关文章

Python学习-39.Python中的生成器

先回顾列表解释 1 lista = range(10) 2 listb = [elem * elem for elem in lista] 那么listb就将会是0至9的二次方. 现在有这么一个需求,需要存储前10个斐波那契数到硬盘. 那么先写产生斐波那契数的函数: 1 def fib(max): 2 n,a,b = 0,0,1 3 while n < max: 4 print(b) 5 a,b = b,a + b 6 n+=1 这样就会打印出前max个斐波那契数了.接着我们再修改一下.(因为我

python中的生成器

python中的生成器其实就是一个特殊的迭代器,相比于每次迭代获取数据获得(通过next()函数)时生成元素,迭代的位置,数值返回等都需要我们设计.我们可以采用更加简洁的语法即生成器(generator). 通过列表生成式,我们可以直接创建一个列表.但是,如果我们说我们可能会通过算法根据前面的999999个数推出100w个数,但是我们此时只需要使用到前几个数,那么通过列表保存100w个数来备用就会用到巨大的空间.而我们却不一定会用到第100w个数,白白浪费了庞大的空间.因此我们就需要用到了生成器

python中的生成器函数是如何工作的?

以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函数相关的栈帧,则必须在调用这个函数且这个函数尚未返回时获取,可能通过inspect模块的currentframe()函数获取当前栈帧. 栈帧对象中的3个常用的属性: f_back : 调用栈的上一级栈帧 f_code: 栈帧对应的c f_locals: 用在当前栈帧时的局部变量; 比如: >>&g

python中的生成器(二)

一. 剖析一下生成器对象 先看一个简单的例子,我们创建一个生成器函数,然后生成一个生成器对象 def gen(): print('start ..') for i in range(3): yield i print('end...') G=gen() print(type(G)) >> <type 'generator'> 表示G是一个生成器对象,我们来剖析一下,里面到底有什么 print(dir(G)) >>['__class__', '__delattr__',

python学习之生成器yield

python学习之生成器yield **yield的作用是使函数生成一个结果序列而不是一个值,任何使用yield的函数都称为生成器,调用生成器会创建一个对象,该对象通过连续调用next()或者__next__()方法生成结果序列** 一般情况 >>> def count(n,m): >>> print('这是一个循环外部测试') >>> while n>0: >>> print('这是一个循环内部测试') >>>

python中的生成器和迭代器

1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代器的优点 对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值).但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式. 另外,迭代器的一大优点是不要求事

python中的生成器(generator)总结

1.实现generator的两种方式 python中的generator保存的是算法,真正需要计算出值的时候才会去往下计算出值.它是一种惰性计算(lazy evaluation). 要创建一个generator有两种方式. 第一种方法:把一个列表生成式的[]改成(),就创建了一个generator: >>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>

python中lambda、yield、map、filter、reduce的使用

1. 匿名函数lambda python中允许使用lambda关键字定义一个匿名函数.所谓的匿名函数就是说使用一次或者几次之后就不再需要的函数,属于“一次性”函数. #例1:求两数之和 f = lambda x, y: x + y print(f(5, 1)) #例2:求平方和 print((lambda x, y: x**2 + y**2) (3, 4)) #执行结果625 2.关键字 yield yield可以将函数执行的中间结果返回但是不结束程序. yield关键字可以把一个函数变成一个生

深入理解Python中的生成器

生成器(generator)概念 生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束. 生成器语法 生成器表达式: 通列表解析语法,只不过把列表解析的[]换成()生成器表达式能做的事情列表解析基本都能处理,只不过在需要处理的序列比较大时,列表解析比较费内存. Python 1 2 3 4 5 6 7 8 9 10 11 >>> gen = (x**2 for x in range(5)) >>>