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

    列表生成器
    def f(n):
        return n*2
    
    a = [f(n) for n in range(10)]
    a1 = [n*n for n in range(10)]
    print (a)
    print (a1)
    print (type(a)) 输出结果: [0, 1, 8, 27, 64] [0, 1, 4, 9, 16] <type 'list'> ---------------------------------------------------- t = ("123",8) a,b = t #相当于a = t[0],b = [t1] a,b,c = t#报错,赋值个数要与元组个数相同 print (a) print (b) 输出结果: 123 8 ----------------------------------------------------- s = (x*2 for x in range(3)) print (s) 输出结果: <generator object <genexpr> at 0x0255A990>#生成器的内存地址 print next(s) # python2 s._next_() print next(s)#调用next的方式取值 print next(s) print next(s)#这句报错 StopIteration,不能超固定范围 输出结果: 0 2 4 ---------------------------------------------------------- s = (x*2 for x in range(3)) for i in s: print (i) 输出结果: 0 2 4 注: 1、for 会自动调用内部的next() 2、for 会判断并且处理StopIteration异常 ----------------------------------------------------------- def foo():#这是一个普通的函数 print ("ok") renturn 1 foo()
    -----------------------------------------------------------
    def foo():#这是一个生成器函数,因为有yield print ("ok") yield 1#只要有yield就是一个生成器对象,否则就是一个普通函数 foo()#是一个生成器对象,类似一个做菜厨师 g = foo() print g print next(g)#取到一个1 输出结果: <generator object foo1 at 0x0254A990> ok 1 ------------------------------------------------------------- def foo(): #相当于厨师会做两道菜,如果点第三道菜就会报错一个yield是一道菜 print ("ok") yield 1 print ("ok") yield 2 g = foo()
    next(g)这只能打印出OK,不能打印出1,因为没有打印返回值
    next(g)这只能打印出OK2,不能打印2,因为没有打印返回值
    print (next(g))#做出的第一道菜,返回1 print (next(g))#做出的第二道菜,返回2 print (next(g))#再继续让厨师做菜就会报错了 输出结果: ok 1 ok1 2 --------------------------------------------- 使用for 循环取值 def foo(): print ("ok") yield 1 print ("ok1") yield 2 for i in foo(): print i 输出结果: ok 1 ok1 2 --------------------------------------------------- for 循环遍历可迭代对象。 什么是可迭代对象?是指拥有iter方法的对方叫可迭代对象(Iterable) 如: #列表 a = [1,2,3] a._iter_() #元组 t = (1,2,3) t._iter_() #字典 d = {"name":"guo"} d._iter_()
    非波拉那契
    def fib(max):
        n ,berfore ,after = 0,0,1
        while n<max:
            print(berfore)
            berfore ,after = after ,berfore+after
            n = n+1
    fib(6)
    输出结果:
    0
    1
    1
    2
    3
    5
    ---------------------------------------------------------
    把print改成yield 就成了一个生成器函数了
    def fib(max):
        n,berfore,after = 0,0,1
        wile n<max:
            yield berfore
        n=n+1
    print (fib(8))#拿到的还是生成器对象地址
    g = fib(8) #这里已经决定只能生成多少个值,超过就会报错
    print next(g)#取值方法
    print next(g)
    pirnt next(g)
    print next(g)
    输出结果:
    <generator object fib1 at 0x0266A788>
    0
    1
    1
    2
    ----------------------------------------------------------
    生成器有一个next方法
    def bar():
        print("ok")
        count = yield 1
        print (count)
        
        yield 2
     
    b =  bar()#生成一个生成器对象
    print (b.send(None))# 相当于了b.next()
    print (b.send("oooo"))#会将"oooo"传给yield前面的变量count.
    输出结果:
    ok
    1
    oooo
    2
    
    """
    send()跟next()是一样的,只不过send()可以向函数体传值,传给yield前面的变量。
    #send第一次进函数体时,只能传一个空值进去,因为他不知道传给谁
    第一次进函数体时,可以用next(),可以代替send()传空值
    """
    ---------------------------------------------------------------------
    生成器都是迭代器,迭代器不一定是生成器
    l = [1,2,3,4]#这是一个可迭代对象
    d = iter(l)#通过iter转换为迭代器
    print (d)
    输出结果:
    <listiterator(迭代器) object at 0x0248EE10>
    -------------------------------------------
    什么是可迭代器?满足两个条件。
    1、有Iter()方法
    2、有next()方法
    
    for i in [1,2,3,4]:# 列表是一个可迭代对象
        iter([1,2,3,4])#将列表转换成一个迭代器对象
    """
    1、凡可用作于for循环的对象都是Iterable(可迭代对象)
    2、凡是可用于next() 的都是Iterator(迭代器)
    3、一类是集合数据,如:list,tuple,dict,set,str等,可以通过一个iter()转换成一个迭代器对象
    4、 一类是generator( 生成器),包括带yield的generator function(生成器函数)
    这些都可以称为迭代器对象(Iterable)
    可以使用isinstance()判断是否是Iterable
    例:l = [1,2,3,4]
        d = isinstance(l,Iterable)
        print (d)
        输出结果:
        True
    """                 

    *-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

    小结:

    迭代器是可以记住遍历的位置的对象

    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束,只能往前不能后退

    迭代器满足两个条件:iter(),next()

    字符串,列表,元组,字典,生成器,包括带yield的生成器函数,都可以转换成迭代器

    list = [1,2,3,4]#可迭代对象
    li = iter(list)#转换成迭代器对象
    print next(li)#输出迭代器的第一个元素
    print next(li)#输出迭代器的下一个元素
    输出结果:
    1
    2

    迭代器对象可用for进行遍历

    list = [1,2,3,4]#可迭代对象
    li = iter(list)#转换成迭代器对象
    for i in li:
        print (i,end = '')
    输出结果:
    1 2 3 4

    生成器

    在函数中有yield的函数叫生成器(generator)

    生成器就是一个迭代器

    在调用函数时,每次遇到yield就会停止,保存所有信息,返回yield的值,下次运行是从这里继续

    调用生成器 函数,返回的是一个迭代对象

    def fib(max): #生成器函数
        n,b,a = 0,0,1
        while n<max:
            yiel a
            b,a =a,b+a
            n +=1
    f = fib(8)#F是一个迭代器,由生成器函数返回生成
    for i in f:
        print (i,end = "")
    输出结果:
    0 1 1 2 3 5 8 13 21
    ---------------------------------------
    也可这种方式取值
    import sys
    while True:
        try:
            print(next(f,end = ''))
        except:
            sys.exit()
    输出结果:
    0 1 1 2 3 5 8 13 21
  • 相关阅读:
    USART串口通信实验
    EXTI 外部中断
    NVIC中断优先级管理
    实验1 跑马灯实验
    redis集群部署---一台主机
    zookeeper服务启动报错---Error contacting service. It is probably not running.
    shell脚本学习笔记
    最短路径算法——Floyd算法
    一篇文章学懂Shell脚本(摘抄)
    VIM空格和TAB转换
  • 原文地址:https://www.cnblogs.com/guog1/p/8407325.html
Copyright © 2011-2022 走看看