Python天天学_04_基础四
Python_day_04
金角大王: http://www.cnblogs.com/alex3714/articles/5765046.html
------Python是一个优雅的大姐姐
学习方式:通过老师的视频以及博客上面文档,以完成作业和知识点归纳的方式编写自己博客。
本节内容
1. 装饰器
2. 生成器
3. 迭代器
4. 软件目录结构规范
一、装饰器
允许向一个现有的函数添加新的功能,同时又不改变其结构。
“开放-封闭”原则
- 封闭:已实现的功能代码块不应该被修改
- 开放:对现有功能的扩展开放
现有N个函数,需求:打印函数运行时间
代码:

运行结果:

二、生成器
列表生成式

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
第一种generator创建方法:

通过next()取得的元素,如果超过元素则会报错

定义generator的另一种方法。
如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

Send()方法
传入一个值到yield前面参数接收
生成器综合举例
代码:
import time
def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
def producer():
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了2个包子!")
c.send(i)
c2.send(i)
producer()
运行结果:

小知识点:
一般通过for循环进行生成器next调用,不再用next方法
三、迭代器
我们已经知道,可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:

生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。把list、dict、str等Iterable变成Iterator可以使用iter()函数:

小结:
- 凡是可作用于for循环的对象都是Iterable类型;
- 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
- 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
- for循环用用于可迭代对象实现三个功能:
a)
默认调用iter()方法,将Iterable转换成Iterator
b)
默认用next()进行迭代调用
c)
默认判断并处理StopIteration异常
四、软件目录结构规范
具体看本文链接里面第四点
Python天天学_04_基础四的更多相关文章
- Python天天学_01_基础1
Python_day_01 金角大王:http://www.cnblogs.com/alex3714/articles/5465198.html ------Python是一个优雅的大姐姐 学习方式: ...
- Python天天学_03_基础三
Python_day_03 金角大王: http://www.cnblogs.com/alex3714/articles/5740985.html ------Python是一个优雅的大姐姐 学习方式 ...
- Python天天学_02_基础二
Python_day_02 金角大王:http://www.cnblogs.com/alex3714/articles/5717620.html ------Python是一个优雅的大姐姐 学习方式: ...
- python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)
一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...
- Python天天学_05_模块
Python_day_05 金角大王: http://www.cnblogs.com/alex3714/articles/5161349.html ------Python是一个优雅的大姐姐 学习方式 ...
- Python进阶(面向对象编程基础)(四)
1.方法也是属性 我们在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象: class Person(object): def __init__(self, name, score) ...
- 重学JAVA基础(四):线程的创建与执行
1.继承Thread public class TestThread extends Thread{ public void run(){ System.out.println(Thread.curr ...
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- Python全栈开发【基础四】
Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...
随机推荐
- [c++] WINAPI
int WINAPI WINMain 中,WINAPI含义 在windef.h头文件中有如下定义: #define WINAPI __stdcall #define APIENTRY WINAPI 函 ...
- 使用CompletableFuture进行异步任务编排
1.JDK5引入了Future进行异步任务的处理,Future 的接口主要方法有以下几个: (1)boolean cancel (boolean mayInterruptIfRunning) 取消任务 ...
- 新建项目报错'/Users/yanguobin/IdeaProjects/Demo/pom.xml' already exists in VFS
出现该情况的原因:是删除的时候并没有删除干净,点击如下位置会清除Idea的本地代码历史,然后重新创建项目就可以了
- JAVA基础--JAVA API常见对象(字符串&缓冲区)
一. String 类型 1. String类引入 第二天学习过Java中的常量: 常量的分类: 数值型常量:整数,小数(浮点数) 字符型常量:使用单引号引用的数据 字符串常量:使用双引号引用 ...
- 分层最短路(牛客第四场)-- free
题意: 给你边权,起点和终点,有k次机会把某条路变为0,问你最短路是多长. 思路: 分层最短路模板题.题目有点坑(卡掉了SPFA,只能用dijkstra跑的算法). #include<iostr ...
- JavaScript Let 和 Const
来源:菜鸟教程:https://www.runoob.com/js/js-let-const.html JavaScript let 和 const ECMAScript 2015(ECMAScrip ...
- session的垃圾回收机制
session.gc_maxlifetime session.gc_probability session.gc_divisor session.gc_divisor 与 session.gc_pro ...
- Adam作者大革新, 联合Hinton等人推出全新优化方法Lookahead
Adam作者大革新, 联合Hinton等人推出全新优化方法Lookahead 参与:思源.路.泽南 快来试试 Lookahead 最优化方法啊,调参少.收敛好.速度还快,大牛用了都说好. 最优化方 ...
- 面试常考的js题目(一)
1.找出dom文档中某个元素下面的所有文字(面试写的一塌糊涂,回来重写的) 1.返回回数组形式的 function getText(ele) { if (ele.nodeType === 3) { r ...
- window10提交代码到码云
1.创建项目文件夹,例如创建一个"爬虫项目码云仓库" 2.进入项目文件夹,在地址栏输入cmd然后回车,这样就在该文件夹打开了终端 3.终端输入git init初始化项目仓库,此时会 ...