day19_生成器
20180730 初次上传
20180731 更新,4、列表生成式,以及部分注释
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# ********************day19_生成器 *******************
# ********************day19_生成器 *******************
# ********************day19_生成器 *******************
'''
# # 1、yield
# # 2、yield举例-->生孩子
# # 3、yiel举例--> 卖包子
# # 4、列表生成式----->不使用yield 举例--> 卖包子
# # # 生成列表,然后加载到内存当中,在进行使用
# # # 缺点1:占空间大
# # # 缺点2:效率低
# # # 4.1、yield-->for三元运算的过程
# # # for三元运算见 人口普查 实例
# # 5、yield 举例-->人口普查
# # # 对所有的人口进行总和等计算
# # 6、、yield 对文件
# # # 取出来的是字符串
# # 7、不同变量对yield所在函数多次取值
# # # 某一变量 对yield的所在的生成器取完所有的值,定义一个新的变量,可以对生成器再次取值
# #
# # 8、不同变量,对生成器,同时取值互不影响
# # 9、send 迭代器中的方法
# # # yield 3相当于return控制的是函数的返回值,这里返回3
# # # x = yiled的另一个特性是:接受send传过来的值,赋值给x
# # # next方法的过程: t.__next__()(第一次next) --> 拿到yield的返回值(如 yield 1 等同于 return1) -->保存当前状态-->
# # # --> t.__next__()(第2次next) --> 拿到yield的返回值(如 yield 1 等同于 return1) -->保存当前状态-->
# # # -->...-->迭代结束
# # # send()方法的过程:t.send(22)(第一次send)--> 将11赋值个yield左边的等式(如 firt = yield, firt得到的值是22 ) -->
# # # --> 执行下面的程序,直到下一次的yield之前-->保存运行位置的状态 -->重复上述过程--> 。。。-->结束
# #
# # 10、单线程单触发
# # # 这种方式,执行效率低下,可与下面的“单线程多触发对比”
# # 11、迭代器实现单线程多触发
# # # 功能说明:一边做包子,一边把做好的包子拿给别人吃
# # # 可以同时执行触发多个程序,
'''
# print("分割线".center(80,'-'))
# --------------------------------------分割线---------------------------------------
# --------------------------------------分割线---------------------------------------
# --------------------------------------分割线---------------------------------------
# 01
# 01
# 01
# # 1、yield
#
# def test():
# yield 1
# yield 2
# yield 3
# yield "没有了,再来就报错了"
# res = test()
# print("迭代器地址:",res)
# print("第一个:",res.__next__())
# print("第2 个:",res.__next__())
# print("第3 个:",res.__next__())
# print("第4 个:",res.__next__())
#
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day19_ShengChengQi/day19_ShengChengQi.py
# # 迭代器地址: <generator object test at 0x00000000039AFA40>
# # 第一个: 1
# # 第2 个: 2
# # 第3 个: 3
# # 第4 个: 没有了,再来就报错了
# #
# # Process finished with exit code 0
# # 2、yield举例-->生孩子
# #
# import time
# def test():
# print("开始生孩子啦...")
# print("开始生孩子啦...")
# print("开始生孩子啦...")
# yield "me" # return
# time.sleep(3)
#
# print("开始生'son'啦...")
# yield "son"
# time.sleep(3)
#
# print("开始生'Sunzi'啦...")
# yield "SunZi"
# time.sleep(3)
#
# yield "没有了,再来就报错了"
#
# res = test()
# print("迭代器地址:",res)
# print("第一个:",res.__next__())
# print("第2 个:",res.__next__())
# print("第3 个:",res.__next__())
# print("第4 个:",res.__next__())
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day19_ShengChengQi/day19_ShengChengQi.py
# # 迭代器地址: <generator object test at 0x000000000399FA40>
# # 开始生孩子啦...
# # 开始生孩子啦...
# # 开始生孩子啦...
# # 第一个: me
# # 开始生'son'啦...
# # 第2 个: son
# # 开始生'Sunzi'啦...
# # 第3 个: SunZi
# # 第4 个: 没有了,再来就报错了
# #
# # Process finished with exit code 0
# # 3、yiel举例--> 卖包子
# # # 使用yield 的好处就是,yield每次只迭代一个值,同时不再用内存,可以在执行某个功能回来后,
# # # 从之前的位置,继续向下取值
# #
#
# def product_bun():
# for i in range(100):
# print("正在生产包子")
# yield("一提包子 %s出来啦!"%i)
# print("卖包子")
#
# pro_b = product_bun()
#
# bun1 = pro_b.__next__()
# print("看-->",bun1)
# # 代码实现某个特定功能
# print("=======做某事,回来后再继续吃包子=========")
# bun2 = pro_b.__next__()
# print("看-->",bun2)
#
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day19_ShengChengQi/day19_ShengChengQi.py
# # 正在生产包子
# # 看--> 一提包子 0出来啦!
# # =======做某事后,回来再继续吃包子=========
# # 卖包子
# # 正在生产包子
# # 看--> 一提包子 1出来啦!
# #
# # Process finished with exit code 0
# # https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431779637539089fd627094a43a8a7c77e6102e3a811000
# # 4、列表生成式----->不使用yield 举例--> 卖包子
# # # 生成列表,然后加载到内存当中,在进行使用
# # # 缺点1:占空间大
# # # 缺点2:效率低
# #
#
# def product_bun():
# ret = []
# for i in range(5):
# # print("正在生产包子")
# ret.append("包子第 %s 盘出来啦!"%i)
# # print("卖包子")
# return ret
#
# bun_l = product_bun()
# print(bun_l)
#
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day19_ShengChengQi/day19_ShengChengQi.py
# # ['包子第 0 盘出来啦!', '包子第 1 盘出来啦!', '包子第 2 盘出来啦!', '包子第 3 盘出来啦!', '包子第 4 盘出来啦!']
# #
# # Process finished with exit code 0
# 03
# 03
# 03
# # # 4.1、yield-->for三元运算的过程
# # # for三元运算见 人口普查 实例
# # #
# #
#
# def xiadan():
# for i in range(3):
# yield '鸡蛋%s' %i
# alex_lmj = xiadan()
# print(alex_lmj.__next__())
# print(alex_lmj.__next__())
# print(alex_lmj.__next__())
# # print(alex_lmj.__next__()) # StopIteration
# # 5、yield 举例-->人口普查
# # # 对所有的人口进行总和等计算
# #
# # # 文件:人口普查.txt
'''
{'name':'北京','population':1}
{'name':'山东','population':2}
{'name':'山西','population':3}
{'name':'河北','population':4}
{'name':'台湾','population':5}
'''
#
# def get_population():
# with open('人口普查','r',encoding='utf-8') as f:
# for i in f:
# yield i
# g = get_population()
# print(g)
#
# all_pop = sum( eval(i)['population'] for i in g)
# print(all_pop)
#
# D:\Anaconda3\python.exe D:/C_cache/py/day19_ShengChengQi/day19_ShengChengQi.py
# <generator object get_population at 0x000000000399FAF0>
# 15
#
# Process finished with exit code 0
# # 6、、yield 对文件
# # # 取出来的是字符串
# #
# # # 文件:人口普查.txt
'''
{'name':'北京','population':1}
{'name':'山东','population':2}
{'name':'山西','population':3}
{'name':'河北','population':4}
{'name':'台湾','population':5}
'''
#
# def get_population():
# with open('人口普查','r',encoding='utf-8') as f:
# for i in f:
# yield i
# g = get_population()
# print(g)
# g1 = g.__next__() # 注意: 取出来的值是字符串
# print( g1,type(g1))
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day19_ShengChengQi/day19_ShengChengQi.py
# # <generator object get_population at 0x000000000399FAF0>
# # {'name':'北京','population':1}
# # <class 'str'>
# #
# # Process finished with exit code 0
# #
# #
# #
#
# # 7、不同变量对yield所在函数多次取值
# # # 某一变量 对yield的所在的生成器取完所有的值,定义一个新的变量,可以对生成器再次取值
# #
# # # 文件:人口普查.txt
'''
{'name':'北京','population':1}
{'name':'山东','population':2}
{'name':'山西','population':3}
{'name':'河北','population':4}
{'name':'台湾','population':5}
'''
# def get_population():
# with open('人口普查','r',encoding='utf-8') as f:
# for i in f:
# yield i
# g = get_population()
# print(g)
# all_pop = sum( eval(i)['population'] for i in g)
# print("总人口数:",all_pop)
# # print(g,g.__next__()) # StopIteration表示值已经取完了
#
# m = get_population() # 可以对它再起取值 不影响
# print(m,m.__next__())
#
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day19_ShengChengQi/day19_ShengChengQi.py
# # <generator object get_population at 0x000000000399FAF0>
# # 总人口数: 15
# # <generator object get_population at 0x000000000399FCA8> {'name':'北京','population':1}
# #
# #
# # Process finished with exit code 0
# # 8、、不同变量,对生成器,同时取值互不影响
# #
# # # 文件:人口普查.txt
'''
{'name':'北京','population':1}
{'name':'山东','population':2}
{'name':'山西','population':3}
{'name':'河北','population':4}
{'name':'台湾','population':5}
'''
# def get_population():
# with open('人口普查','r',encoding='utf-8') as f:
# for i in f:
# yield i
# g = get_population()
# m = get_population() # 不同变量,对生成器,同时取值
#
# print('g地址: ',g)
# print('m地址: ',m)
# print('g.__next__()',g.__next__()) # 不同变量,对生成器,同时取值互不影响
# print('m.__next__()',m.__next__())
#
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day19_ShengChengQi/day19_ShengChengQi.py
# # g地址: <generator object get_population at 0x000000000399FAF0>
# # m地址: <generator object get_population at 0x000000000399FCA8>
# # g.__next__() {'name':'北京','population':1}
# #
# # m.__next__() {'name':'北京','population':1}
# #
# #
# # Process finished with exit code 0
#
# 05
# 05
# 05
#
# # 9、send 迭代器中的方法
# # # yield 3相当于return控制的是函数的返回值,这里返回3
# # # x = yiled的另一个特性是:接受send传过来的值,赋值给x
# # # next方法的过程: t.__next__()(第一次next) --> 拿到yield的返回值(如 yield 1 等同于 return1) -->保存当前状态-->
# # # --> t.__next__()(第2次next) --> 拿到yield的返回值(如 yield 1 等同于 return1) -->保存当前状态-->
# # # -->...-->迭代结束
# # # send()方法的过程:t.send(22)(第一次send)--> 将11赋值个yield左边的等式(如 firt = yield, firt得到的值是22 ) -->
# # # --> 执行下面的程序,直到下一次的yield之前-->保存运行位置的状态 -->重复上述过程--> 。。。-->结束
# #
#
# def test():
# print("开始啦……")
# firt = yield 1 # 相当于,reutrn 1, firt =None, 运行状态保留在这里
# print("第一次,yield之后",firt)
#
# yield 2
# print("第2次", )
#
# t = test() # 这里并没有运行
# res = t.__next__() # next()内置函数方法也可以
# print("第一次调用next:",res)
#
# res1 =t.send("函数停留在first那个位置,我就是给first赋值的") # 字符串发送给 yiled,使得,firt = yiled = 字符串
# print("第一次调用send:",res1)
#
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day19_ShengChengQi/day19_ShengChengQi.py
# # 开始啦……
# # 第一次调用next: 1
# # 第一次,yield之后 函数停留在first那个位置,我就是给first赋值的
# # 第一次调用send: 2
# #
# # Process finished with exit code 0
# # 10、单线程单触发
# # # 这种方式,执行效率低下,可与下面的“单线程多触发对比”
# import time
# def produce():
# ret = []
# for i in range(3):
# time.sleep(1)
# ret.append('包子%s'%i)
# return ret
#
# def consumer(res):
# for index, baozi in enumerate(res):
# time.sleep(1)
# print('第%s个人,吃了%s'%(index,baozi))
#
# print("开始点包子啦……")
# res = produce() # 列表生成后才回继续下面的程序
# print("开吃咯……")
# consumer(res)
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day19_ShengChengQi/day19_ShengChengQi.py
# # 开始点包子啦……
# # 开吃咯……
# # 第0个人,吃了包子0
# # 第1个人,吃了包子1
# # 第2个人,吃了包子2
# #
# # Process finished with exit code 0
# # 11、迭代器实现单线程多触发
# # # 功能说明:一边做包子,一边把做好的包子拿给别人吃
# # # 可以同时执行触发多个程序,
# #
#
# import time
#
# def consumer(name):
# print("我是【%s】,我准备开始吃包子啦", name)
# while True:
# bun = yield
# time.sleep(1)
# print("%s 很开心的把【%s】吃掉啦"%(name,bun) )
#
# def producer():
# c1 = consumer("--wu--")
# c2 = consumer(" sb ")
# c1.__next__() # 开始运行迭代器
# c2.__next__()
# for i in range(3):
# time.sleep(1)
# c1.send("包子 %s" %i)
# c2.send("包子 %s" %i)
#
# producer()
#
#
# # D:\Anaconda3\python.exe D:/C_cache/py/day19_ShengChengQi/day19_ShengChengQi.py
# # 我是【%s】,我准备开始吃包子啦 --wu--
# # 我是【%s】,我准备开始吃包子啦 sb
# # --wu-- 很开心的把【包子 0】吃掉啦
# # sb 很开心的把【包子 0】吃掉啦
# # --wu-- 很开心的把【包子 1】吃掉啦
# # sb 很开心的把【包子 1】吃掉啦
# # --wu-- 很开心的把【包子 2】吃掉啦
# # sb 很开心的把【包子 2】吃掉啦
# #
# # Process finished with exit code 0
day19_生成器的更多相关文章
- 介绍一款原创的四则运算算式生成器:CalculateIt2
家里小朋友读一年级了,最近每天都有一些10以内的加减法口算练习,作为程序员爸爸,自然也是想办法能够偷懒,让电脑出题,给小朋友做些练习.于是,自己在业余时间开发了一个四则运算算式生成器,名为:Calcu ...
- 每天一个设计模式-7 生成器模式(Builder)
每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...
- Objective-C 生成器模式 -- 简单实用和说明
1.生成器模式的定义 将一个复杂的对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表示 2.生成器模式的UML Builder :生成器接口,定义创建一个Product各个部件的操作 Con ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(25)-权限管理系统-系统管理员(附生成器)
系列目录 这一节我们要着手建立系统管理员表,但发布之前,我先发布一个代码生成器给大家先用着. 这个生成器是为这个项目而生的,理论不能用于其他项目,而且写得比较潦草,但能用 下载地址 有兴趣要生成器源码 ...
- Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...
- ES6笔记(5)-- Generator生成器函数
系列文章 -- ES6笔记系列 接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还 ...
- C#/ASP.NET完善的DBHelper,配套Model生成器
支持Oracle.MSSQL.MySQL.SQLite四种数据库,支持事务,支持对象关系映射:已在多个项目中实际使用. 没有语法糖,学习成本几乎为0,拿来即用. DBHelper类完整代码: usin ...
- Python 生成器与迭代器 yield 案例分析
前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...
- Mockjs,模拟数据生成器
(推荐使用)Mock.js是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试. 提供了以下模拟功能: 1. 根据数据模板生成模拟数据. 2. 模拟Ajax请求,生成并返回模拟 ...
随机推荐
- SpringDataJpa实现自定义(更新)update语句
SpringDataJpa的框架没有线程的更新方法,只能调用save()方法实行保存,如果是只更新一处的话,这个也不太适用.所以楼主尝试着自定义sql语句来写. service层 @Overridep ...
- HTML中的相对路径与绝对路径
路径 实际工作中,通常新建一个文件夹专门用于存放图像文件,这时再插入图像,就需要采用“路径”的方式来指定图像文件的位置. 路径可以分为: 相对路径和绝对路径 相对路径 图像文件和HTML文件位于同一文 ...
- NOIp2018集训test-9-18
T1.Conjugate 只能选没选过的点,看成如果选了选过的堆的点就不管它继续选.如果第一次选到某一堆的点在第一次选到第一堆的点之前,这一堆对答案就会有1的贡献.那么a[i]有贡献的概率是a[i]和 ...
- 在linux中的rpm -ivh 是干什么的呢?
在linux中的rpm -ivh 是干什么的呢? RMP 是 LINUX 下的一种软件的可执行程序,你只要安装它就可以了.这种软件安装包通常是一个RPM包(Redhat Linux Packet ...
- sqlserver 调优(二)
良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能.操作系统的性能,甚至网卡.交换机等.这篇文章主要讲到如何改善SQL语句,还将有另一篇讨论如何改 ...
- UVA-10200-Prime Time-判断素数个数(打表预处理)+精度控制
题意: 给出a.b区间,判断区间内素数所占百分比 思路: 注意提前打表和控制精度1e-8的范围足够用了 细节: 精度的处理 判断素数的方法(且返回值为bool) 数据类型的强制转换 保存素数个数 提前 ...
- 可搭建SS服务上网的不限流量VPS推荐
https://itldc.com/en,7个机房,推荐指数:★★★★ 1995年运作至今,有多个机房,包括:新加坡.洛杉矶.新泽西.立陶宛.乌克兰.保加利亚.荷兰.VPS特征: KVM虚拟(支持BB ...
- Rabbit MQ 客户端 API 进阶
之前说了一些基础的概念及使用方法,比如创建交换器.队列和绑定关系等.现在我们再来补充一下细节性的东西. 备份交换器 通过声明交换器的时候添加 alternate-exchange 参数来实现. Con ...
- Nginx+win10安装配置
一.前言 Nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器,同时也提供了IMAP/POP3/SMTP服务.Nginx可以进行反向代理.负载均衡.HTTP服务器(动静分离).正向代 ...
- 整理及优化CSS代码的7个原则
作为网页设计师(前端工程师),你可能还记得曾经的那个网页大小建议:一个网页(包括HTML.CSS.Javacript.Flash和图片)尽量不要超过30KB的大小,随着互联网的日益庞大,网络带宽也在飞 ...