zoukankan      html  css  js  c++  java
  • 生成器

    理解python之前先理解一个迭代器的概念。 迭代器是python中这么一类数据,你可以理解为iter是一些线性数据的集合,并且这个集合有next()和__iter__这两个方法。 调用next() 会依次序返回迭代器中的数据,当访问完迭代器中最后一个数据之后,会抛出预定义的异常 StopIteration。 而__iter__这个方法会返回迭代器对象本身。 我们看一下例子:

    首先,python中用工厂函数iter()可以生成迭代器,

    >>> a=[0,1,2,3]
    >>> b=iter(a)

    注意这里是把一个list作为参数传递给iter()生成迭代器,但实际上任何集合类型都可以传递给iter()生成迭代器。比如 元组 ,string甚至是字典。

    然后我们调用迭代器的next()和__iter__

    >>> b.next()
    1
    >>> b.next()
    2
    >>> b.next()
    3
    >>> b.next()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    >>> b.__iter__
    <method-wrapper '__iter__' of listiterator object at 0x7f1cb07eb6d0>
    >>>
    

      

    那么弄出这么个迭代器到底有什么用呢,python里面什么地方会用到它呢? 很多地方都会用到迭代器。比如说 for 循环其实就内置了迭代器。

    for val in mylist:

        print val

    这一段代码非常简单,mylist是列表类型,for循环打印mylist中所有的元素。 实际上这里就隐式的把mylist赋值赋值给了iter(mylist)。 比如,这段代码就替换成

    a=iter(mylist)

    for val in a.next():

        print val

    OK。 迭代器我们知道是什么了。我们再看看生成器。 生成器是这样一种函数

    >>> def foo():
    ...    yield 1
    ...    yield 2
    ...    yield 3
    ...
    

    注意这种函数里面用了yield关键字。 而且,普通函数是返回值,而这个函数是返回一个迭代器。 比如仔细看完下面的代码你就明白了:

    >>> a=foo()
    >>> a.next()
    1
    >>> a.next()
    2
    >>> a.next()
    3
    >>> a.next()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    >>> a.__iter__
    <method-wrapper '__iter__' of generator object at 0x7f1cb0787f50>
    

    OK.总结一下就是说生成器是一种返回迭代器的函数。当你运行这个迭代器的next()时,迭代器会返回yield关键字标示的值。

  • 相关阅读:
    c--日期和时间函数
    笔试题:360找镇长的题。
    【JavaScript】BOM和DOM
    也谈在 .NET 平台上使用 Scala 语言(续)
    生成n个元素的全排列 C实现
    jsp安全性问题
    stm32DMA通道 ADC通道
    POJ 1860
    Codeforces Round #FF (Div. 2) A. DZY Loves Hash
    Configure the modules to be find by modprobe
  • 原文地址:https://www.cnblogs.com/kramer/p/3678879.html
Copyright © 2011-2022 走看看