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

     1 # -*- coding:utf-8 -*-
     2 # LC
     3 # 列表生成式
     4 def func(x):
     5     print(x)
     6     return 2*x
     7 print([ func(i) for i in range(10) ])
     8 
     9 a = [ i*2 for i in range(1000000000000)]        #此列表生成式会占用大量内存空间,在没有调用的情况下,列表已经存在于内存中
    10 len(a)
    11 # 生成器
    12 b = ( i*2 for i in range(1000000000000))        #生成器,只有在调用b的时候,才会按着规则进行运算,将结果返回给b,使用的时候才占用内存,速度快
    13 #生成器不支持切片
    14 b[100]      #这种无法直接取出来
    15 for i in b:
    16     print(i)
    17 
    18 #生成器
    19 #1.只有在调用的时候,才会生成相应的数据
    20 #2.只记录当前的位置
    21 #3.只有一个__next()__方法
    22 
    23 #fibnacci函数
    24 #函数生成器,使用yield,用了yield的函数,就不在是一个函数,而是一个生成器
    25 def fib(max):
    26     n,a,b = 0,0,1
    27     while(n<max):
    28         n += 1
    29         yield b                 #yield是会返回当前值给函数,执行一次,__next__方法会调用yeild值
    30         a,b = b,a+b
    31     return "---done---"
    32 from collections import Iterator
    33 
    34 f = fib(1)
    35 print("-------",isinstance(f,Iterator))
    36 while True:
    37     try:
    38         g = f.__next__()
    39         print("function generator:",g)
    40     except StopIteration as e:
    41         print("Generator is stop,value is ",e.value)
    42         break
    43 #send 会唤醒当前生成器,并传递一个值给yeild
    44 
    45 def consumer(name):
    46     print("%s 准备开始吃包子了"%name)
    47     while True:
    48         baozi = yield
    49         print("包子{%s}来了,{%s}请吃吧!"%(baozi,name))
    50 
    51 def producer(name):
    52     c1 = consumer("A")              #此步骤仅是将函数变成生成器,而生成器不会执行,如果要执行则需要调用__next__方法,__next__方法遇到yield则中断
    53     c2 = consumer("B")
    54     next(c1)        #等于c1.__next__()方法
    55     next(c2)
    56     print("%s 做包子了"%name)
    57     for i in range(6):
    58         print("包子[%s]好了,分成两份"%i)
    59         c1.send(i)
    60         c2.send(i)
    61 
    62 producer("lvcheng")
    63 
    64 #1. 函数的执行流程是按着顺序执行,遇到return和最后一行的时候函数才结束执行,生成器是在每次调用__next__()的时候,在遇到yield语句的时候返回,并在下一次调用的时候,继续在上一次yield执行的位置继续
    65 #2. 可以通过for循环的对象称为可迭代对象,可以通过isinstance()判断一个对象是否为可迭代对象,列表,元组,字典,字符串都是可迭代对象,而整数则不是
    66 from collections import Iterable            #导入Iterable可以判断一个对象是否为可迭代对象
    67 print(isinstance([],Iterable))          #True
    68 print(isinstance({},Iterable))          #True
    69 print(isinstance((),Iterable))          #True
    70 print(isinstance("abcd",Iterable))      #True
    71 print(isinstance((x for x in range(10)),Iterable))  #True
    72 print(isinstance(100,Iterable))         #False
    73 
    74 #迭代器
    75 #1. 可以被next()函数调用并不断返回下一个值的对象称为迭代器
    76 #2. 可以同isinstance()判断一个对象是否是Iterator
    77 #3. 生成器都是迭代器,但列表,字符串,字典等不是迭代器,可以使用iter()函数变成迭代器
    78 from collections import Iterator
    79 print(isinstance((x for x in range(10)),Iterator))      #True
    80 print(isinstance([],Iterator))          #False
    81 print(isinstance(iter([]),Iterator))        #True
  • 相关阅读:
    Perl的Open函数
    较详细的介绍JNI
    Java多线程单元测试
    sleep函数的简单原理
    Struts与Servlet的冲突
    Ant学习记录
    JDK转码工具
    Throwable
    Entity Framework系列文章导航
    多核时代 .NET Framework 4 中的并行编程1概述
  • 原文地址:https://www.cnblogs.com/clv5/p/7103785.html
Copyright © 2011-2022 走看看