day4装饰器-迭代器&&生成器
一、装饰器
定义:本质是函数,(装饰其他函数)就是为其它函数添加附加功能
原则:1、不能修改被装饰的函数的源代码
2、不能修改被装饰的函数的调用方式
实现装饰器知识储备:
1、函数及“变量”
2、高阶函数
a、把一个函数名当做实参传给另一个函数(在不修改被装饰器函数源代码的情况下为其添加新功能)
b、返回值中包含函数名
3、嵌套函数
高阶函数+嵌套函数 = 装饰器
延迟3秒
import time def test1():
time.sleep(3)
print('in the test1')
test1()#延迟3秒
例一:装饰器
def bar ():
print("in the bar")
def foo ():
print ("in the foo")
bar()
foo()
例二:
def deco(func):
start_time = time.time()
func()
return func
stop_time = time.time()
print ("in func run time is %s" %(stop_time-start_time))
return deco
def foo ():
print("in the foo")
bar()
def bar():
print("in the bar")
foo()
例三:
import time
def timer(func):
def deco (*args, **kwargs):
start_time = time.time()
func(*args, **kwargs)
stop_time = time.time()
print("in func run time is %s" %(stop_time- start_time))
return deco
@timer #等于test1 = timer(test1)
def test1():
time.sleep(3)
print('in the test1')
test1()
@timer
def test2(name,age):
time.sleep(3)
print("in the :",name age)
test2('liudong',23)
例四:终极装饰器
user,passwd = 'liudong',''
def auth (auth_type):
print("auth_func:",auth_type)
def outer_wrapper(func):
def wrapper(*args, **kwargs):
print("wrapper func args:", *args, **kwargs)
if auth_type == "local":
username = input("Username:").strip()
password = input("Password:").strip()
if user == username and passwd == password:
print("\033[32;1mUser has passed authentication\033[0m")
res = func(*args, **kwargs)#form home
print("------------after authentication ")
return res
else:
exit("\033[31;1mInvalid username or password\033[0m")
elif auth_type == "ldap":
print("不会-------------")
return wrapper
return outer_wrapper
def index():
print("welcome to index page")
@auth(auth_type="local") #home = wrapper
def home ():
print("welcome to home page")
return "form home"
@auth(auth_type="ldap")
def bbs():
print("welcome to bbs page")
index()
print(home()) #wrapper()
bbs()
匿名函数:
res = filter(lambda n:n>5,range(10))
for i in res:
print(i)
#print(globals()) 打印整个文件里的所有你变量
二、迭代器&生成器
1、只有在调试时,才会生成相应的数据
2、c.__nest__ 一个一个的往下生成,只记录当前的位置,之前生成过的就没了。
3、只有一个__nest__()方法
生成器
def fib (max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return '------------done-------------'
g = fib(10)
while True:
try:
x = next(g)
print('g:', x)
except StopAsyncIteration as e:
print('Generator return value:', e.value)
break
生成器并行
def consumer(name):
print("%s准备吃包子了" %name)
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了" %(baozi,name))
c = consumer("liudong")
c.__next__()
c.send('胡萝卜馅,人肉馅') def producer(name):
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("老子开始吃包子啦!")
for i in range(5):
time.sleep(1)
print("做了1个包子,分两半!")
c.send(i)
c2.send(i)
producer("liudong")
#迭代器 可以使用isinstance()判断一个对象是否是Iterator(迭代器)对象
json序列化
info = {'name':'liudong','age':23}
f = open("test.txt","w")
f.write(json.dumps(info))
f.close()
day4装饰器-迭代器&&生成器的更多相关文章
- Day4 装饰器——迭代器——生成器
一 装饰器 1.1 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多 ...
- python中的装饰器迭代器生成器
装饰器: 定义:本质是函数(装饰其它函数) 为其它函数添加附加功能 原则: 1 不能修改被装饰函数源代码 2 不修改被装饰函数调用方式 实现装饰器知识储备: 1 函数即‘’变量‘’ 2 高阶函数 ...
- Python学习---装饰器/迭代器/生成器的学习【all】
Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210
- day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数
回顾下上次的内容 转码过程: 先decode 为 Unicode(万国码 ) 然后encode 成需要的格式 3.0 默认是Unicode 不是UTF-8 所以不需要指定 如果非要转为U ...
- python_装饰器——迭代器——生成器
一.装饰器 1.什么是装饰器? 器=>工具,装饰=>增加功能 1.不修改源代码 2.不修改调用方式 装饰器是在遵循1和2原则的基础上为被装饰对象增加功能的工具 2.实现无参装饰器 1.无参 ...
- python装饰器,迭代器,生成器,协程
python装饰器[1] 首先先明白以下两点 #嵌套函数 def out1(): def inner1(): print(1234) inner1()#当没有加入inner时out()不会打印输出12 ...
- python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式
闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...
- Python中的装饰器,迭代器,生成器
1. 装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的 ...
- 装饰器、生成器,迭代器、Json & pickle 数据序列化
1. 列表生成器:代码例子 a=[i*2 for i in range(10)] print(a) 运行效果如下: D:\python35\python.exe D:/python培训/s14/day ...
随机推荐
- 【TFS】TFS2015链接TFS出现TF31002/TF400324问题解决方案
安装VS2015后链接TFS发现出现TF31002错误,然后用浏览器打开TFS URL能正常访问,在TFS online中点击用vs打开按钮,提示TF400324错误 1. VS2015中打开: 2. ...
- Cesium调用Geoserver发布的 WMS、WFS服务
1 GeoServer服务发布 1.1 WMS服务 下载GeoServer安装版安装,同时安装geopackage扩展,以备使用.使用XX地图下载器下载地图,导出成GeoPackage地图文件. (1 ...
- Maven学习使用Nexus搭建Maven私服
原文:http://www.cnblogs.com/quanyongan/archive/2013/04/24/3037589.html 为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给 ...
- js上传文件研究
https://github.com/shengulong/javascript-file-upload
- 怎样提高hbase的入库性能
hbase写数据首先先写入memstore.当memstore满64MB以后,会flush到disk上而成为storefile.当storefile数量超过3时,会启动compaction过程将它们合 ...
- 【自用】OI计划安排表一轮
网络流√ 上下界最大流√ 线性规划转费用流√ RMQ优化建图√ 单纯形√ 字符串相关 hash√ 扩展KMP 回文自己主动机 数据结构 平衡树 启示式合并 替罪羊树 LCT 树套树 KD-Tree 二 ...
- Cocos2d-x游戏《雷电大战》开源啦!要源代码要资源快快来~~
写在前面的话:这是笔者开发的第二个小游戏<雷电大战>,之前就过这个游戏和<赵云要格斗>一样,终于将会开源. 因为自己的一些个人原因. 这个游戏还没有完毕.可是很多网友都过来寻求 ...
- linux操作系统下查看某rpm包是32bit 还是x64bit的命令
[root@hosta ~]# rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n" | grep l ...
- XUtils BitmapUtils 改造以加入drawable支持
=== XUtilsBitmapUtils 改造以加入drawable支持 === # XUtils 简单介绍 XUtils 是一套少有的早期国产安卓框架, 其源于AFinal, 文件夹结构也与之相似 ...
- centos下的hadoop集群实现ssh的无密码登陆
CentOS 下SSH无密码登录的配置 最近学习Hadoop.它要求各节点之间通过SSH无密码登录,配置SSH的时候费了一番功夫,记录下来,以备忘. 配置SSH无密码登录需要3步: 1.生成公钥和私钥 ...