python的重重之器(生成器、迭代器、装饰器)
一、装饰器
1、定义:本质是函数,装饰其他函数就是为其他函数添加附件功能。
2、原则:
a.不能修改被装饰的函数的源代码;
b.不能修改被装饰的函数的调用方式;
实例:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:ye import time #装饰器
def time_cha(func):#func等于test
time_start = time.time()
func()#此时func()相当于test()
time.sleep(2)
time_stop = time.time()
print("the time cha is :%s" % (time_stop - time_start)) #主函数
def test():
print("*")
time.sleep(1)
print("*")
time.sleep(1)
print("in the test") #单独调用主函数
test() #将装饰器套用在主函数上
time_cha(test)#此方式改变了主函数的调用方式
3、实现装饰器的知识储备:
a.函数即“变量”
b.高阶函数
b1.把一个函数名当做实参传递给另外一个函数(在不修改被装饰函数的前提下,增加其功能)
实例:
def test1():#此函数时源代码
print("in the test1") def test2(func):#此函数时装饰器
print("in the test2")
print(func)#打印test1的内存地址
func()#这里相当于test1() test1()
test2(test1)#将test1这个函数名作为实参传递给test2,这样实现了高阶函数
b2.返回值中包含函数名(不改变函数(源代码)的调用方式)
实例:
def test1():#源代码
print("in the test1") def test2(func):#装饰器
print("in the test2")
func()
return test1#通过return,把函数名作为返回值 test1 = test2(test1)#此处是test1函数名的内存地址
test1()#执行test1函数
c.嵌套函数
def test1():#第一层函数
print("in the test1") def test2():#第二层函数
print("in the test2") test2()#第一层函数执行时,调用第二层函数 test1()#执行第一层函数
4、装饰器的案例分析:
案例背景:首先定义两个模块,欧美专区和河南专区,两个专区的使用前提是需要登录。
步骤一:首先实现两个专区的免登录访问;
步骤二:定义登录模块,然后以登录模块做为装饰器,装饰在欧美专区和河南专区上
步骤三:当调用到两个专区模块时,再进行登录验证,不能调用之前就进行验证(此处涉及到了嵌套函数的使用)
status = False #初始化登录状态,false表示未登录,true表示已登录 def login(func): #定义登录模块(装饰器函数)
def inner(): #定义嵌套函数
_uername = "zhangye" #定义用户数据
global status #将函数内变量全局化 if status ==False: #根据状态判断是否需要登录
username = input("请输入用户名:")
if username == _uername:
print("welcome...")
status = True #登录成功后,将默认状态由false转化为true
if status == True:
print(func)
func()
return inner #未调用时,不进行验证,只返回一个第二层的函数名(验证函数的函数名) @login #还未到真正调用函数的地方,所以此处不需要进行登录验证,只返回第二层的函数名即可。
def america():
print("*****欧美专区*****") @login #还未到真正调用验证函数的地方,所以此处不需要进行登录验证,只返回第二层函数名即可。
def henan():
print("*****河南专区*****") america() #调用时,执行第二层函数。因为上面已经拿到了第二层的函数名
henan() #调用时,执行第二层函数。因为上面已经拿到了第二层的函数名
二、生成器
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]
改成()
,就创建了一个generator:
实例一:
data = [1,2,3,4,5,6,7,8,9,]
#列表生成式(装逼的写法)
data = [i*2 if i > 4 else i for i in data]
print(data)
==》[1, 2, 3, 4, 10, 12, 14, 16, 18] #列表生成器(数据用到的时候才生成)
data2 = (i*2 if i > 4 else i for i in data)
print(data2)
==》<generator object <genexpr> at 0x000002797C151DB0> 小结:生成器只有在调用时,才会生成相应的数据。 实例二、
import time #定义消费者模型函数 def consumer(name): print("%s 准备吃包子啦!" %name)
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了!" % (baozi,name)) #定义生产者模型函数
def producer(name):
c_a = consumer("A")
c_b = consumer("B")
c_a.__next__()
c_b.__next__()
print("老子开始准备做包子了!")
for i in range(10):
time.sleep(1)
print("做了2个包子!")
c_a.send(i)
c_b.send(i) producer("alex") 三、迭代器
我们知道,可以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型:如list,tuple,dict,set,str等;
一类是 generator,包括生成器和带yield的generator函数。
这些可以直接作用于for循环的对象统称为可迭代对象,Iterable
可以使用isinstance()判断一个对象是否是Iterable对象:
from collections import Iterable #判断字符串是否可迭代
data = "abc"
print(isinstance(data,Iterable)) #===》True #判断列表是否可迭代
data = [1,2,3]
print(isinstance(data,Iterable)) #===》True #判断字典是否可迭代
data = {1:"ye",2:"zhang",3:"alex"}
print(isinstance(data,Iterable)) #===》True #判断元组是否可迭代
data = (1,2,3)
print(isinstance(data,Iterable)) #===》True 注1:可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
注2:字典、集合、元组、字符串等都是可迭代对象,但是不是迭代器。但是可以通过iter()函数获得一个迭代器。
python的重重之器(生成器、迭代器、装饰器)的更多相关文章
- Python之旅Day5 列表生成式 生成器 迭代器 装饰器
装饰器 器即函数,装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器涉及的知识点= 高阶函数+函数嵌套+闭包 在遵循下面两个原则的前提下为被装饰者新功能 ...
- python笔记--3--函数、生成器、装饰器、函数嵌套定义、函数柯里化
函数 函数定义语法: def 函数名([参数列表]): '''注释''' 函数体 函数形参不需要声明其类型,也不需要指定函数返回值类型 即使该函数不需要接收任何参数,也必须保留一对空的圆括号 括号后面 ...
- Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化
一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...
- python基础(八)生成器,迭代器,装饰器,递归
生成器 在函数中使用yield关键字就会将一个普通的函数变成一个生成器(generator),普通的函数只能使用return来退出函数,而不执行return之后的代码.而生成器可以使用调用一个next ...
- Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle
目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...
- Python学习笔记——基础篇【第四周】——迭代器&生成器、装饰器、递归、算法、正则表达式
目录 1.迭代器&生成器 2.装饰器 a.基本装饰器 b.多参数装饰器 3.递归 4.算法基础:二分查找.二维数组转换 5.正则表达式 6.常用模块学习 #作业:计算器开发 a.实现加减成熟及 ...
- python的迭代器、生成器、装饰器
迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...
- python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器
1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...
- python迭代器、生成器、装饰器
1 迭代器 这里我们先来回顾一下什么是可迭代对象(Iterable)? 可以直接作用于for循环的对象统称为可迭代对象,即Iterable. # 一是集合数据类型,如list.tuple.dict.s ...
- 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化
文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...
随机推荐
- HDU 1085 Holding Bin-Laden Captive! 活捉本拉登(普通型母函数)
题意: 有面值分别为1.2.5的硬币,分别有num_1.num_2.num_5个,问不能组成的最小面值是多少?(0<=每种硬币个数<=1000,组成的面值>0) 思路: 母函数解决. ...
- VS打包方法(安装和部署简介)——内含大量图片,密症慎入!
友情提示:内含大量文字.图片,密集恐惧症者慎入! 主要记述一下利用微软集成开发环境VS打包的方法和详细步骤. 1.新建打包工程 打开VS,文件->添加项目->新建项目(如图1),在添加新项 ...
- hive对有null值的列进行avg,sum,count等操作时会不会过滤null值
在hive中,我们经常会遇到对某列进行count.sum.avg等操作计算记录数.求和.求平均值等,但这列经常会出现有null值的情况,那这些操作会不会过滤掉null能呢? 下面我们简单测试下: wi ...
- 2018.5.30 Oracle数据库PLSQL编程---游标的使用
显示游标的步骤 /* 显示游标处理步骤 1.声明游标 语法结构:cursor 游标名称 is SQL 语句; 2.打开游标 语法结构:open游标名称; 3.提取数据 语法结构:fetch 4.关闭游 ...
- [vijos1066]弱弱的战壕
描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒 ...
- 洛谷P3371单源最短路径SPFA算法
SPFA同样是一种基于贪心的算法,看过之前一篇blog的读者应该可以发现,SPFA和堆优化版的Dijkstra如此的相似,没错,但SPFA有一优点是Dijkstra没有的,就是它可以处理负边的情况. ...
- java POI往word文档中指定位置插入表格
1.Service demo import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.a ...
- Nginx 如何处理一个请求
基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始: server { listen 80; server_na ...
- thinkcmf5 iis+php重写配置
TP在本机运行非常好,谁想到服务器上后,连http://www.***.com/wap/login/index都404错误了, 中间的郁闷过程不表. 解决方案分两步: 第一步: 下载rewrite_2 ...
- React学习记录一
半路出家直接上手React,其实有点吃力,所以开始研究create-react-app,从这里下手吧. create-react-app 官方网站:https://github.com/faceboo ...