zoukankan      html  css  js  c++  java
  • python-迭代器与生成器的区别

    这里涉及几个知识点:迭代器、生成器、yieId

    先用个例子看一下迭代器与生成器的区别吧

    #L是个list,迭代用for循环即可,L取出来是存放在内存中的,再多次去循环取出都可以
    >>> L=[x*x for x in range(3)] >>> for i in L: print(i) 0 1 4 >>> for n in L: print(n) 0 1 4

    #把[]换成了()就成了生成器,只不过它只能循环出一次,因为它不是放在内存中的。它是实时生成数据的。 >>> mygenerator = (x*x for x in range(3)) >>> for i in mygenerator: print (i) 0 1 4
    #看我再循环一次,它已是空值 >>> for n in mygenerator: print(n) >>>

     其实我感觉上最大差的几点有以下:

    1、list函数调用直接出结果。而生成器是一个对象

    >>> L = [1,2,3,4,5,6]
    >>> def xh():
    	for i in L:
    		print(i)
    
    		
    >>> g=xh()
    1
    2
    3
    4
    5
    6
    
    >>> L1=[6,7,8,9,10]
    >>> def generator():
    	yield(L1)
    	for i in L1:
    		print(i)
    
    		
    >>> g=generator()
    >>> next(g)
    [6, 7, 8, 9, 10]
    

     这里有个yield的对比,大家感受一下

    >>> L1=[6,7,8,9,10]
    >>> def generator():
    	yield(L1) #打印L1的意思 
    	for i in L1:
    		print(i)
    
    		
    >>> g=generator() #这里是一个生成器对象
    >>> next(g) #用next打印出来
    [6, 7, 8, 9, 10]
    
    #生成器第2个例子
    >>> def gen2():
    	for i in L1:
    		yield(i) #打印i的值
    		print(i)
    
    		
    >>> g=gen2()
    >>> print(g)
    <generator object gen2 at 0x0000000002EAFD00>
    >>> for x in g:
    	print(x)
    
    	
    6
    6
    7
    7
    8
    8
    9
    9
    10
    10
    

     2、其实想想也挺简单,yield只不过就是个标识,同时打印一次该结果

    经典案例:杨辉三角

    #将杨辉三角的每一行看成一个list,写一个生成器(generator),不断输出下一行list
    def triangel(n):
        L=[1]                                                                 #定义一个list[1]
        while True:
            yield L                                                           #打印出该list
            L=[L[x]+L[x+1] for x in range(len(L)-1)]        #计算下一行中间的值(除去两边的1)
            L.insert(0,1)                                                 #在开头插入1
            L.append(1)                                                 #在结尾添加1
            if len(L)>10:                                                 #仅输出10行
    
                break
    
    
    #生成一个generator对象,然后通过for循环迭代输出每一行
    a=angel(10)
    for i in a:
        print(i)
    
    #结果 [1] [1, 1] [1, 2, 1] [1, 3, 3, 1] [1, 4, 6, 4, 1] [1, 5, 10, 10, 5, 1] [1, 6, 15, 20, 15, 6, 1] [1, 7, 21, 35, 35, 21, 7, 1] [1, 8, 28, 56, 70, 56, 28, 8, 1] [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
  • 相关阅读:
    uvm_cookbook--sequences--wait for a signal
    Makefile目标文件搜索(VPATH和vpath
    git stash
    vuex-persist,解决vuex中的数据刷新页面之后丢失的问题
    element表格中的输入框有时会存在输入不上的情况
    简单 Linux 文件系统?
    Shell 脚本是什么?
    什么是BASH?
    如何规划一台 Linux 主机,步骤是怎样?
    什么是GUI?
  • 原文地址:https://www.cnblogs.com/sincoolvip/p/7284375.html
Copyright © 2011-2022 走看看