`
mldxs
  • 浏览: 26502 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

python 从yield 学习迭代器和生成器

 
阅读更多

http://www.iteye.com/topic/587051


前段时间在读trac中wiki模块的源码的时候,发现了很多地方都使用了yiled这一关键词,

感觉是在需要返回某个值的地方通过yield来代替return,

不是很明白其用法,所以仔细研究下。

一个使用了yiled关键字的函数就不再是一个普通的函数了,而是一个生成器函数(generator function)

当函数被调用的时候将返回一个迭代器(iterator)。

所以下面将分别讲解迭代器和生成器这两个概念。

一. 迭代器(Iterator)

写道
迭代器是一个对象,它实现了迭代器协议,
一般需要实现如下两个方法
1)next方法
返回容器的下一个元素
2)__iter__方法
返回迭代器自身

对于for语言大家可能都不陌生,我们很多时候需要对一些容器对象进行遍历就会使用到for循环:

Python代码收藏代码
  1. l=[0,1,2,3,4,5,6]
  2. foriinl:
  3. printi

l是一个type为list的对象,这段for-in代码在运行的时候其实是调用了l的__iter__()函数,返回了一个实现了__next__()或next()(各个版本的python可能不一样,我试验的时候所使用的版本为2.6.2)的迭代器对象,每循环一次就会通过next取下一个元素。

当然我们完全没有必要先把所有的元素都算出来放到一个list里或者其他容器类里进行循环,这样比较浪费空间。

我们可以直接创建自己的一个迭代器。

Python代码收藏代码
  1. #-*-coding:utf-8-*-
  2. '''''Fibonacciiterator'''
  3. classFib:
  4. '''''一个可以生成Fibonacci数列的迭代器'''
  5. def__init__(self,max):
  6. self.max=max
  7. def__iter__(self):
  8. self.a=0
  9. self.b=1
  10. returnself
  11. defnext(self):
  12. fib=self.a
  13. iffib>self.max:
  14. raiseStopIteration
  15. self.a,self.b=self.b,self.a+self.b
  16. returnfib

定义好了这个Fibonacci迭代器,我们就可以来使用它了。

Python代码收藏代码
  1. fromfibonacci2importFib
  2. forninFib(1000):
  3. printn

当调用Fib(1000)的时候,将生成一个迭代器对象,每一次循环都将调用一次next取到下一个值。

所以我们可以看出迭代器有一个很核心的东西就是在循环中,迭代器可以记住之前的状态。

二.生成器

前面我们说了,任何使用了yield关键字的函数都不再是普通的函数了,我们还是来看实例吧,这样比较容易理解

Python代码收藏代码
  1. deffib(max):
  2. a,b=0,1
  3. whilea<max:
  4. yielda
  5. a,b=b,a+b

这里简单的几行代码就实现了上面的迭代器类那么一大堆代码所实现的功能

使用的时候和上面很类似:

Python代码收藏代码
  1. fromfibonacciimportfib
  2. forninfib(1000):
  3. printn

引文fib函数使用了yield所以它是一个生成器函数,当我们调用fib(1000)的时候它其实是返回了一个迭代器,且这个迭代器可以控制生成器函数的运行。

我们通过这个返回的迭代器的动作控制fib这个生成器函数的运行。

每当调用一次迭代器的next函数,生成器函数运行到yield之处,返回yield后面的值且在这个地方暂停,所有的状态都会被保持住,直到下次next函数被调用,或者碰到异常循环退出。

所以生成器的概念还是很简单的。

三.总结

1.for-in语句在底层都是对一个迭代器对象进行操作的

2.使用了yield关键字的函数就是一个生成器函数,被调用的时候生成一个可以控制自己运行的迭代器。

分享到:
评论

相关推荐

    Python语言基础:迭代器和生成器.pptx

    迭代器和生成器是Python编程中的重要概念,特别是在处理大量数据或进行高效内存管理时,它们的优势尤为明显。本文将详细讲解这两个概念及其在Python语言中的应用。 **迭代器** 迭代器是Python中访问集合元素的一种...

    深入讲解Python中的迭代器和生成器

    ### 深入讲解Python中的迭代器和生成器 #### 一、迭代器的基本概念 在Python编程语言中,迭代器是一种遵循特定协议的对象,它允许我们遍历一系列数据项。这种遍历方式广泛应用于各种数据结构,如列表(list)、...

    迭代器和生成器的区别

    3. 生成器是一个特殊的迭代器,具有简洁的实现方式和yield关键字的特殊作用。 4. 创建生成器的方法有两种:使用小括号和yield关键字的函数。 5. yield关键字的作用是保存当前运行状态和暂停执行,返回值时需要调用...

    python生成器和迭代器区别

    在Python编程语言中,生成器(Generator)和迭代器(Iterator)是两种非常重要的概念,它们主要用于处理大量数据或无限序列,以节省内存资源。理解它们的区别和使用方式对于高效编程至关重要。 一、生成器 1.1 ...

    python 生成器 & 迭代器.pdf

    Python 生成器和迭代器 Python 生成器和迭代器是 Python 编程语言中两个重要的概念,它们都是用于处理可迭代对象的。下面我们将对这两个概念进行详细的解释和分析。 一、什么是生成器? 在 Python 中,使用了 ...

    通过python实现迭代器与生成器.rar

    在Python中,迭代器和生成器是两个用于处理序列数据的重要概念。它们允许你以高效且节省内存的方式处理大量数据。以下是它们的基本概念和用法。 迭代器(Iterator) 迭代器是一个对象,它实现了两个方法:__iter__()...

    Python的迭代器和生成器怎么样?_.docx

    在Python编程中,迭代器和生成器是非常重要的概念,它们在处理大量数据或无限序列时展现出强大的性能和效率。首先,我们来详细了解一下迭代器。 迭代器是Python中实现迭代器协议的对象,允许我们遍历集合中的元素,...

    05-python-迭代器-生成器-with语句和上下文管理器-修饰符

    在Python编程语言中,迭代器、生成器、with语句和上下文管理器以及修饰符是四个非常重要的概念,它们在处理数据流和资源管理时起着关键作用。以下是关于这些知识点的详细解释: 1. **迭代器**: - 迭代器是一种...

    一篇文章弄懂Python中的可迭代对象、迭代器和生成器

    在Python编程语言中,了解可迭代对象、迭代器和生成器是至关重要的,因为它们构成了Python数据处理的核心机制。这篇文章将深入探讨这三个概念,并通过示例代码帮助理解它们的工作原理。 首先,**可迭代对象**是指...

    Python3 迭代器与生成器.pdf

    迭代器和生成器是 Python 中非常重要的概念,它们提供了高效处理数据集的强大工具。通过理解迭代器的工作原理及其与生成器的关系,开发者可以更加高效地编写代码,并充分利用 Python 的强大功能。无论是处理大型数据...

    Python3 迭代器与生成器.doc

    Python 3 中的迭代器与生成器是两种强大的功能,它们可以帮助开发者高效地访问集合元素和实现复杂的迭代操作。 迭代器是 Python 中的一种对象,可以记住遍历的位置,并提供了两个基本的方法:iter() 和 next()。...

    Python 基础课程《15.迭代器与生成器》

    ### Python基础课程《15.迭代器与生成器》知识点详解 #### 14.1 迭代的概念 ...以上就是关于Python中迭代器与生成器的基本概念及使用方法的详细介绍。理解这些概念对于高效地使用Python进行数据处理至关重要。

    Python_生成器和迭代器的区别.pdf

    Python 生成器和迭代器的区别 Python 中的迭代器和生成器是两个非常重要的概念,它们都是实现可迭代对象的方式,但它们之间有着很大的区别。 迭代器 迭代器是一个实现了 `_iter_` 方法和 `_next_` 方法的类对象。...

    迭代器,生成器

    在Python编程语言中,迭代器和生成器是处理大量数据集时非常有用的概念。本文将深入探讨这两个概念及其应用,帮助读者更好地理解如何利用它们高效地进行数据处理。 #### 二、可迭代对象与迭代器 ##### 2.1 可迭代...

    python 协程中的迭代器,生成器原理及应用实例详解

    综上所述,Python中的迭代器和生成器是协程中非常关键的概念,它们提供了灵活的数据处理方式,尤其是在处理大量数据或者需要高效内存管理的场景中。通过理解迭代器和生成器的工作原理,开发者可以编写出更加优雅和...

    测试迭代.zip,迭代器、可迭代对象、生成器、生成器表达式的实验代码

    本资源"测试迭代.zip"包含了关于迭代器、可迭代对象、生成器和生成器表达式相关的实验代码,旨在帮助Python学习者深入理解这些核心概念。 1. **可迭代对象**:在Python中,一个对象如果可以被迭代,即它可以依次...

    python迭代器与生成器详解,附源码

    总结起来,迭代器和生成器是Python中非常重要的概念,它们使得对数据的处理更加高效、简洁。通过手动创建迭代器,可以更好地控制数据流,并实现更复杂的逻辑。同时,掌握迭代器的相关库函数如 `itertools` 中提供的...

    Python中yield返回生成器的详细方法.pdf

    总结来说,`yield`关键字和生成器是Python高效处理大量数据的有效工具。它们允许我们编写生成序列的函数,而无需一次性在内存中存储所有元素。通过使用`yield`,我们可以创建自定义的迭代过程,同时利用`next()`和`...

    python 迭代器与生成器介绍与示例.zip

    迭代器是一种可以记住遍历位置的对象,支持for循环和next()函数,而生成器是一种特殊的迭代器,使用yield语句产生值,支持惰性计算和动态控制迭代过程。文章还提供了迭代器和生成器的示例代码,帮助读者更好地理解和...

    详解Python迭代和迭代器

    在Python编程语言中,迭代和迭代器是两个非常重要的概念,它们在处理数据集合时扮演着核心角色。本文将深入探讨这两个概念,并通过实例来帮助理解。 首先,我们需要理解什么是可迭代对象。在Python中,可迭代对象是...

Global site tag (gtag.js) - Google Analytics