生成器方法

python基础教程(p157)

生成器方法(在源代码基础上做出少许改进,以便分析代码运行步骤)

  1. def repeater(value):
  2. while True:
  3. new = (yield value)
  4. print (‘first ‘, new)
  5. if new is not None:
  6. value = new
  7. print (‘second‘, value)

1.调用函数,并且使用next()方法

  1. >>>r = repeater(42)
  2. >>>r.next()
  3. 42

理论知识

生成器是一个包含yield关键字的函数。当被调用时,在函数中的代码不会被执行,而会返回一个迭代器。每次请求一个值,就会执行生成器中的代码,直到遇到一个yield或者return语句。yield语句意味着应该生成一个值,并且函数挂起–函数停在那点等待被重新唤醒。函数被唤醒时就从停止的那点开始执行。return语句意味着生成器要停止执行。

调用next方法时,迭代器会返回它的下一个值。

代码分析

第一行:函数调用,返回一个迭代器,但是不会执行repeater中的代码,参数value =42。

第二行:用next()方法请求一个值。执行函数中的代码,直到遇到yield语句,也就是到第三行,yield语句生成值42。然后函数挂起(暂停执行,并等待重新唤起)。注意:此时new还未和yield返回值绑定。

2.继续使用next()方法访问

  1. >>> a.next()
  2. (‘first‘, None)
  3. 42

理论知识

当生成器重新(不是第一次,即之前运行过yield语句)被运行的时候,yield方法返回一个值——若调用next()方法,返回None; 若调用send方法,yield表达式返回send方法发送的值。

代码分析

调用next()方法,函数被唤醒。yield语句返回None(注意:此时value的值并没有重新绑定,仍然为42),new和返回值None绑定。执行print语句。if语句判断为假,此次循环结束。while语句判断为真,遇到yield语句,返回value值42,函数挂起。

3.使用send()方法

  1. >>> a.send(‘hello‘)
  2. (‘first‘, ‘hello‘)
  3. (‘second‘, ‘hello‘)
  4. ‘hello‘

代码分析

调用send方法后,yield返回hello(注意:value值仍然为42),并和变量new绑定,即new=hello。执行print语句。if语句判断为真,value值重新绑定为hello,并且执行print语句。while语句为真,继续循环执行代码,直到调用了yield方法,而yield方法返回value值hello,函数挂起。

4.再次使用next()方法

  1. >>>a.next()
  2. (‘first‘, None)
  3. ‘hello‘

代码分析

调用next方法后,yield返回None(value绑定值并没有改变,仍然为hello),并和new绑定。执行print语句。if语句判断为假.while判断为真,执行yield语句返回value的值hello,函数挂起。

来自为知笔记(Wiz)

时间: 2024-10-02 01:00:52

生成器方法的相关文章

[python学习篇][廖雪峰][1]高级特性--创建生成器 方法1 a = (x for x in range(1,3))

创建一个生成器的方法: for x in range(1,10000000) ,先生成一个列表[1........9999999] 如果我们只想要后面的几个元素,会发现浪费很多空间.所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器(Generator). 要创建一个generator,有很多种方法.第一种方法很简单,只要把一个列表生成式的[]改

装饰器、生成器、迭代器

装饰器的前奏 装饰器:本质是函数 功能:就是装饰成其他函数  就是为其他函数添加附加功能的 高阶函数+嵌套函数=装饰器 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 总结一句话:装饰器对被装饰的函数是完全透明的 实现装饰器的只是储备: 1.函数名即"变量"   将函数体赋值给变量   和内存回收机制一样 2.高阶函数 2.1.把函数名作为实参传递给形参(可返回被修饰函数的地址)(不修改源代码的情况可添加新的功能) 2.2返回值中包含函数地址(不修改函数的调

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

python——迭代器、生成器、装饰器

迭代器 迭代器规则 迭代:重复做一些事很多次,就像在循环中那样. 不仅可以对字典和序列进行迭代,还可以对其他对象进行迭代:只要该对象实现了__iter__方法. __iter__方法会返回一个迭代器(iterator),所谓的迭代器就是具有next方法(这个方法在调用时不需要任何参数)的对象.在调用next方法时,迭代器会返回他的下一个值.如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常. 注意:迭代器规则在3.0中有一些变化.在新的规则中,迭代器对象应

Python 3 之 生成器详解

------ 生成器 ------------------------------------------------------------------ 如今Python对延迟提供更多的支持--它提供了工具在需要的时候才产生结果,而不是立即产生结果.特别地,有两种语言结构尽可能地延迟结果创建. 生成器函数:编写为常规的def语句,但是使用yield语句一次返回一个结果,在每个结果之间挂起和继续它们的状态. 生成器表达式:类似于列表解析,但是,它们返回按需产生结果的一个对象,而不是构建一个结果列

python之特殊方法、属性和迭代器

9.1 准备工作 class NewStyle(object) more_code_here class OldStyle: more_code_here 在这两个类中,NewStyle是新式的类,OldStyle是旧式的类.如果文件以__metaclass__=type开始,那么两个类都是新式类. 除此之外,还可以在自己的类的作用域中对__metaclass__变量赋值.这样只会为这个类设定元类.元类是其他类的类-----这是个更高级的主题. 9.2 构造方法 当一个对象被创建后,会立即调用构

Python练习-一个简单的生成器

今天我们学习了生成器,怎么理解生成器呢,其实就是使用函数的方式自己建立一个迭代器 1 # 编辑者:闫龙 2 #做一个简单的生成器 3 def EasyGene(*args): #建立一个生成器方法并传递多个参数 4 for i in args: 5 yield i#将获取的多个参数值,全部yield返回 6 g = EasyGene("a","b",3) #将参数传递给生成器方法EasyGene,并将yield返回结果赋值给g 7 while True: 8 try

《Python基础教程(第二版)》学习笔记 -&gt; 第九章 魔法方法、属性和迭代器

准备工作 >>> class NewStyle(object): more_code_here >>> class OldStyle: more_code_here 在这两个类中,NewStyle是新式的类,OldStyle是旧式的类,如果文件以__metaclass__ = type 开始,那么两个类都是新式类. 构造方法 构造方法,当一个对象被创建后,会立即调用构造方法.Python中创建一个构造方法,只要把init方法的名字从简单的init修改成__init__