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

    列表生成式:

    a=[x for x in range(10)]
    b=[x*2 for x in range(10)]
    def f(n):
        return n**3
    c=[f(x) for x in range(10)]
    print(a,'
    ',b,'
    ',c)

    一种简单赋值法:

    t=[12,'f',4]   #元组、列表都可以
    a,b,c=t
    print(a,b,c)

    生成器的两种创建方式:

    方式一:

    s=(x for x in range(10)) #创建一个生成器
    print(s)
    print(next(s)) #调用range中内容的方法,等价于'print(s.__next__())'
    print(next(s)) #再生成一个元素
    for i in s:     #生成器s是一个可迭代对象,可遍历
        print(i)

     方式二:

    def foo():
        print('ok')
        yield 1
        print('ok2')
        yield 2
        return None
    foo()            #程序不会被执行,因为foo()此时是一个生成器对象
    print(foo())      #打印的是生成器对象的地址
    g=foo()
    a=next(g)      #通过'next(foo)'调用生成器对象,此时'next(foo())'会收到yield的返回值1
    b=next(g)       #再一次执行的是yield 2对应的代码
    print(a,b)
    for i in foo():    #for循环其实是通过'next(foo())'进行的,'next(foo())收到yield的返回值并赋给i'
        print(i)
    next方法说明:1.用next进入生成器,执行代码遇到yield时退出
    2.再一次next进入时,从上次yield之后的一行开始执行,直到再遇到yield时退出
    3.以此循环往复

    用生成器打印Fibonaccci数列:

    def fib(max):
        n,before,after=0,0,1
        while n<max:
            yield before    #把before值返回给生成器对象
            before,after=after,before+after  #先计算before+after,在进行两个赋值
            n+=1
    g=fib(8)        #fib(8)是一个生成器对象
    print(g)
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))

    生成器对象的send方法:

    def bar():
        print('ok1')
        count=yield 1
        print(count)
        print('ok2')
        yield 2
    b=bar()
    #h=next(b)       #调用send之前得先用next方法进入生成器bar()
    s=b.send(None)    #或者send一个None,等价于next(b)
    k=b.send('dj')
    print(s,k)
    send方法说明: 1.send方法类似于next:(1)也能进入生成器;(2)第二次进入也是接着上次的地方执行
                             2.区别在于:send进入时会带一个值给到count,但第一次进入时只能传一个空值由于生成器中yield和send方法的作用,两段代码交替执行,实现伪并发

    伪并发的一个例子:

    由于生成器中yield和send方法的作用,两段代码交替执行,实现伪并发

    import time
    def consumer(name):
        print('%s:老板,上包子!' %name)
        while True:
            x = yield
            print('小二:第%s笼包子来喽,客官请慢用'%x)
            print('%s:吃完了,再上'%name)
    
    def producer(name):
        c1=consumer('A')
        next(c1)
        print('%s:好嘞!'%name)
        print('%s开始做包子...'%name)
        for i in range(5):
            time.sleep(1)
            print('...过了一会,老板做出来一笼包子')
            c1.send(i+1)
    producer('老板')

    判断:k是列表,是可迭代的(Iterable);d是迭代器

    from collections import Iterator,Iterable
    k=[1,2,3,4]
    d=iter(k)
    print(d)
    print(isinstance(k,list))
    print(isinstance(k,Iterable))
    print(isinstance(d,Iterator))

    迭代器读取文件内容的应用:

    f=open('abc.txt','r')
    for i in f:       #f是一个可迭代对象
        print(i)
    
    
    相比于下面的方法,利用迭代器可以节省内存空间
    for i in f.readlines():    #f.readlines()读取文件内容,并存储为列表,占用内存
        print(i)
     
     

     

  • 相关阅读:
    打印图片的属性和实现另存图片功能以及使用numpy
    opencv3.3 安装环境教程以及实现个图片读取功能
    在linux 创建网络会话和绑定两块网卡
    安装yum仓库
    C#添加错误日志信息
    关于使用宏将csv批量转换成xls的分享
    C#关于MySQL中文乱码问题
    无法启动iis express web服务器解决
    关于关闭WPS锁屏屏保及设置电脑自动关闭显示屏及休眠的分享
    为什么QQ能上却打不开网页呢?
  • 原文地址:https://www.cnblogs.com/Finance-IT-gao/p/10387104.html
Copyright © 2011-2022 走看看