day13 装饰器与语法糖
day13 装饰器与语法糖
一、装饰器
1、什么是装饰器
装饰器就是装饰别人的工具,具体是指为被装饰者添加新功能
装饰器-》函数
被装饰者-》函数
2、为何要用装饰器
装饰器的核心思想:(开放封闭原则)
在不修改被装饰者源代码以及调用方式的前提下,为被装饰者添加新功能
3、如何实现装饰器
可以用闭包函数去实现装饰器
被装饰者
import time
def index():
print('welcome to index page')
time.sleep(3)
index()
方案一:问题-》修改了被装饰者的源代码
import time
def index():
start = time.time()
print('welcome to index page')
time.sleep(3)
stop = time.time()
print(stop - start)
index()
方案二:问题-》会造成代码冗余
import time
def index():
print('welcome to index page')
time.sleep(3)
start = time.time()
index()
stop = time.time()
print(stop -start)
start = time.time()
index()
stop = time.time()
print(stop -start)
# 方案三:问题-》修改了被装饰对象的调用方式
import time
def index():
print('welcome to index page')
time.sleep(3)
def wrapper(func):
start = time.time()
func()
stop = time.time()
print(stop -start)
wrapper(index)
# 方案四:我们用wrapper函数赋值给原函数名index,wrapper应该与原函数保持一致,但是现在的问题是不一致
import time
def index():
print('welcome to index page')
time.sleep(3)
def outter(func): # func = 最原始那个index函数的内存地址
def wrapper():
start = time.time()
func()
stop = time.time()
print(stop -start)
return wrapper
index = outter(index) # f=outter(最原始那个index函数的内存地址)
# f=函数wrapper的内存地址
# print(f)
index()
方案四:让wrapper的参数与返回值与被装饰者保持一致
import time
def index(x,y,z):
print('welcome to index page',x,y)
time.sleep(3)
return 123
def outter(func): # func = 最原始那个index函数的内存地址
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
stop = time.time()
print(stop -start)
return res
return wrapper
index = outter(index) # f=outter(最原始那个index函数的内存地址)
# f=函数wrapper的内存地址
res = index(111,222,333) # res = wrapper(111,222,333)
print(res)
二、装饰器语法糖
# 装饰器语法糖:在不修改源代码情况下,为其新增功能称之为装饰器语法糖。
import time
from functools import wraps # wraps:别人写好的装饰器模块
def outter(func):
@wraps(func)
def wrapper(*args, **kwargs): # 可变长参数
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print(stop - start)
return res
return wrapper
@outter # index = outter(index)
def index(x, y, z):
"""index函数的文档注释"""
print('welcome to index page', x, y)
time.sleep(3)
return 123
# res = index(111, 222, 333)
# print(res)
# print(index)
help(index)
三、装饰器模板
# 装饰器模板
def outter(func):
def wrapper(*args,**kwargs):
print('hello')
res = func(*args,**kwargs)
return res
return wrapper
@outter
def index():
print('index=========>')
index() # 调用
# 案例
def auth(func):
def wrapper(*args,**kwargs):
username = input('username>>>: ').strip()
password = input("password>>>: ").strip()
if username == 'meng' and password == '123':
res = func(*args,**kwargs)
return res
else:
print("认证失败")
return wrapper
@auth
def index():
print('index=========>')
index()
四、迭代器
1、什么是迭代器
迭代器指的是迭代取值的工具
什么是迭代???
迭代是一个重复的过程,但是每一次重复都是基于上一次结果而继续的
dic = {'k1':111,'k2':2222,'k3':33333}
def foo(xxx):
i = 0
while i < len(xxx):
print(xxx[i])
i += 1
foo(dic)
2、为何要用迭代器
1.为了找到一种统一迭代取值方案(适用于str、list、tuple、dict、set,文件对象)
2.节省内存
3、如何用迭代器
可迭代的对象iterable:
内置有__iter__方法的对象(str、list、tuple、dict、set,文件对象)
迭代器对象iterator:
内置有__iter__方法:生成一个可迭代对象
内置有__next__方法:取值
# 可迭代对象:
"abc".__iter__()
[1,23].__iter__()
(1,2,3).__iter__()
{'k1':111}.__iter__()
{1,2,3}.__iter__()
f = open('a.txt',mode='wt')
f.__iter__()
案例1:代码冗余
dic = {'k1':1111,'k2':2222,'k3':3333}
iter_dic = dic.__iter__() # iter_dic=iter(dic) 变成一个可迭代对象
print(iter_dic.__next__()) # print(next(iter_dic))
print(iter_dic.__next__())
print(iter_dic.__next__()) # 只能去列表的3个值,取完再取会报错。
# print(iter_dic.__next__()) # 报错
new_iter = dic.__iter__() # 从新取只能在新建一个可迭代对象
print(new_iter.__next__()) # 在从新取值
案例2:用捕捉异常让代码继续执行
dic = {'k1': 1111, 'k2': 2222, 'k3': 3333,'k4':4444,'k5':5555}
def did():
iter_dic = iter(dic)
while True:
try:
print(next(iter_dic))
except StopIteration:
break
did()
for x in dic: # for循环原理:迭代器对象
print(x)
自定义迭代器
# yield可以返回多次值
def func():
print('hello1')
print('hello1')
yield 111
print('hello2')
print('hello2')
yield 222
print('hello3')
print('hello3')
yield 333
print('hello4')
print('hello4')
# 函数内但凡出现yield语法,我们再调用函数就不会立即触发函数体代码运行,会返回一个生成器对象,生成器对象就是一种自定义的迭代器
g = func()
print(g) # 会打印出111
day13 装饰器与语法糖的更多相关文章
- python_装饰器_语法糖
什么是高阶函数? -- 把函数名当做参数传给另外一个函数,在另外一个函数中通过参数调用执行 #!/usr/bin/python3 __author__ = 'beimenchuixue' __blog ...
- PYTHON-有参装饰器,无参装饰器,语法糖
装饰器 装饰器就是闭包函数的一种应用场景 一 为何要用装饰器 #开放封闭原则:对修改封闭,对扩展开放 二 什么是装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强 ...
- Python学习——装饰器/decorator/语法糖
装饰器 定义:本质是函数,为其他函数添加附加的功能. 原则:1.不能修改原函数的源代码 2.不能修改被原函数的调用方式 重点理解: 1.函数即“变量” 2.高阶函数:返回值中包含函数名 3.嵌套函数 ...
- Python基础之函数:2、globlal与nonlocal和闭包函数、装饰器、语法糖
目录 一.global与nonlocal 1.global 2.nonlocal 二.函数名的多种用法 三.闭包函数 1.什么是闭包函数 2.闭包函数需满足的条件 3.闭包函数的作用 4.闭包函数的实 ...
- python中装饰器(语法糖)概念
“”“” 什么是装饰器? """ 还是通过一个例子来慢慢说明 先看下面的例子 def func_1(x): return x*2 def fun_2(x): return ...
- day-13装饰器
函数的嵌套定义 概念:在一个函数的内部定义另一个函数 为什么要有函数的嵌套定义:1)函数fn2想直接使用fn1函数的局部变量,可以将fn2直接定义到fn1的内部,这样fn2就可以直接访问fn1的变量2 ...
- python学习 day13 装饰器(一)&推导式
装饰器&推导式 传参位置参数在前,关键词参数在后 函数不被调用内部代码不被执行 函数在被调用的时候,每次都会开辟一个新的内存地址,互不干扰 #经典案例 def func(num): def i ...
- day13.装饰器进阶,迭代器
1.from functools import wraps 这个函数可以保留原来函数的属性 # from functools import wraps def car_time(fun): # @wr ...
- Python 语法糖装饰器的应用
Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...
随机推荐
- 【JavaScript基础】Js的定时器(你想看的原理也在哟)
[JavaScript基础]Js的定时器(你想看的原理也在哟) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 本章是经历 ...
- Android编译执行envsetup.sh,产生工具命令m、mm、mmm、mmma、tapas 、croot、cgrep、jgrep、 resgrep、godir
一般来说编译一个sdk或者一个比较大的工程项目,第一步都是执行 envsetup.sh这个脚本,比如编译android,qt源码以及其他一些嵌入式的sdk. 而且执行的时候需要特别注意使用 sourc ...
- hdu 2999 Stone Game, Why are you always there? (简单SG,有个优化)
题意: 一排石头,个数是K. 有n个数,a1...an. 每人每次取石子只能取连续的x个.x属于a1...an的一个. 没法取者负. 思路: 简单的SG.但是TLE!后面加了一个优化~这个优化不好想到 ...
- 深入剖析Redis客户端Jedis的特性和原理
一.开篇 Redis作为目前通用的缓存选型,因其高性能而倍受欢迎.Redis的2.x版本仅支持单机模式,从3.0版本开始引入集群模式. Redis的Java生态的客户端当中包含Jedis.Rediss ...
- systemd-nspawn以及container的学习
container的分类 目前container可以分为两大类,一类是Privileged container,一类是Unprivileged container. Privileged contai ...
- JS中如何将yyyy-MM-dd HH:mm:ss格式的字符串转成Date类型
var deadline = '2019-04-11 13:11:00'; var result = new Date(deadline.replace(/-/g, '/'));
- Markdown For EditPlus插件使用说明(基于EditPlus快速编辑Markdonw文件,写作爱好者的福音来啦)
Markdown For EditPlus插件使用说明 开发缘由 特点好处: 中文版使用说明 相关命令(输入字符敲空格自动输出): EditPlus常用快捷键: 相关教程: English descr ...
- Django笔记&教程 1-1 一 新建项目
Django 自学笔记兼学习教程第1章第1节--一 新建项目 点击查看教程总目录 1- 命令行新建Django项目 新建项目命令(project_name处为项目名) django-admin sta ...
- java 获得 微信 UserId
.... public String cs() throws Exception{ /*访问页面,服务器会得到 code(request.getParameter("code")) ...
- Matplotlib (一)
Matplotlib 用于 创建出版质量图标的绘图工具库 目的是为python构建一个 Matlab 式的绘图接口 import matplotlib.pyplot as plt pyplot 模块包 ...