生成器

'''
三元运算:python中没有其他语言中的三目运算符,但有类似的实现方式
          变量=“表达式1  if Ture else False 表达式2”
          当判断为真,表达式1被赋值给变量,
          当判断为假,表达式2被赋值给变量
列表解析:提供了一种优雅的生成列表的方法,能用一行代码代替十几行代码
        例:[i**2 for i in range(1,10)]      等效于

            l=[]
            for i in range(1,10):
                l.append(i**2)

        列表解析能与三元运算结和使用
            [i**2 for i in range(1,10) if i**2>=4]

生成器:一种自动实现了迭代器协议的数据类型

python中生成器的表现形式:
        一、生成器函数:以常规的方式定义一个函数,但使用yield关键字取代return
        二、生成器表达式:类似于列表解析,但用圆括号()取代方括号[]

    '''
# mikufufu=[]
# for i in range(1,10):
#     mikufufu.append('fufu%s'%i)
# print(mikufufu)
#
#
#
#          V
# mikufufu=['fufu%s' %i for i in range(1,10)]
# print(mikufufu)
'''
无论是普通的for循环创建一个列表,还是采用列表解析,都会直接生成一个列表
当数据过大时,会占用很多内存
采用列表解析会很好的帮我们解决这个问题
'''
# makefufu=('fufu%s'%i for i in range(1,10))    #makefufu,一个生成器对象
# makefufu.__nex_()


'''
python中不仅for循环使用迭代器协议访问对象,大部分内置函数也是通过迭代器协议访问对象
将生成器表达式放入这些函数的时候可以将外层括号去掉直接传递给函数
'''
# print(sum(i for i in range(1,10)))

'''
生产者消费模型:通过利用yeild关键字有保存函数运行状态的特性,
             在另一个函数中send()触发生成器实现两个函数
             的并发运行

!!!!!!!!!!!!!!生成器必须触发后才能使用send()方法!!!!!!!!!!!!!!

'''
import time
def consumer(name):
    print('消费者%s进入了商场'%name)
    while 'Ture':

        shangping=yield
        print('%s消费了商品%s'%(name,shangping))


def producer():
    consumer1=consumer('miku')
    consumer1.__next__()
    for i in range(1,10):
        time.sleep(1)
        consumer1.send(i)

 

posted @ 2020-06-27 13:09  雑音未来  阅读(134)  评论(0编辑  收藏  举报