zoukankan      html  css  js  c++  java
  • 生成器和迭代器

    迭代器和生成器

    1、迭代器

      迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件

    特点:

    1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容

    2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问。

    3. 访问到一半时不能往回退。

    4. 便于循环比较大的数据集合,节省内存。

      可以被迭代的对象,内部调用._next_方法:

      1
      2
      3
      4
      5
      # 迭代器
      li= [1,2,3,4,3,4,]
       
      for i in li:
          print(i)

    2,生成器

      一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);

      如果函数中包含yield语法,那这个函数就会变成生成器;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # 具有生成指定条件数据的对象的能力,这里的filter返回的是一个对象。
    li = [11,22,33,44,55,66,77]
    ret = filter(lambda x:x>50,li)
    print(ret)
     
    -----
    <filter object at 0x0000000000B124A8>#python2.7直接给出结果
     
    # 生成器,有yield语法的。
    def func():
        yield 1
        yield 2
        yield 3
      
    ret = func()
    a=ret.__next__()
    b=ret.__next__()
    c=ret.__next__()
    print(a,b,c)
      
    -----
    1,2,3

    eg:简单的range生成器:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 写一个range生成器
    def my_range(arg):
        num = 0
        while True:
            if num >= arg:
                return
            yield num
            num +=1
    ret = my_range(5)
    for i in ret:
        print(i)
     
    ------
    0
    1
    2
    3
    4






  • 相关阅读:
    jquery toggle(listenerOdd, listenerEven)
    struts quick start
    hdu 1518 Square (dfs)
    hdu 2544 最短路 (最短路径)
    hdu 1754 I Hate It (线段树)
    hdu 1856 More is better (并查集)
    hdu 1358 Period (KMP)
    hdu 2616 Kill the monster (DFS)
    hdu 2579 Dating with girls(2) (bfs)
    zoj 2110 Tempter of the Bone (dfs)
  • 原文地址:https://www.cnblogs.com/kakarott/p/6074779.html
Copyright © 2011-2022 走看看