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 装饰器与语法糖的更多相关文章

  1. python_装饰器_语法糖

    什么是高阶函数? -- 把函数名当做参数传给另外一个函数,在另外一个函数中通过参数调用执行 #!/usr/bin/python3 __author__ = 'beimenchuixue' __blog ...

  2. PYTHON-有参装饰器,无参装饰器,语法糖

    装饰器 装饰器就是闭包函数的一种应用场景 一 为何要用装饰器 #开放封闭原则:对修改封闭,对扩展开放 二 什么是装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强 ...

  3. Python学习——装饰器/decorator/语法糖

    装饰器 定义:本质是函数,为其他函数添加附加的功能. 原则:1.不能修改原函数的源代码 2.不能修改被原函数的调用方式 重点理解: 1.函数即“变量” 2.高阶函数:返回值中包含函数名 3.嵌套函数 ...

  4. Python基础之函数:2、globlal与nonlocal和闭包函数、装饰器、语法糖

    目录 一.global与nonlocal 1.global 2.nonlocal 二.函数名的多种用法 三.闭包函数 1.什么是闭包函数 2.闭包函数需满足的条件 3.闭包函数的作用 4.闭包函数的实 ...

  5. python中装饰器(语法糖)概念

    “”“” 什么是装饰器? """ 还是通过一个例子来慢慢说明 先看下面的例子 def func_1(x): return x*2 def fun_2(x): return ...

  6. day-13装饰器

    函数的嵌套定义 概念:在一个函数的内部定义另一个函数 为什么要有函数的嵌套定义:1)函数fn2想直接使用fn1函数的局部变量,可以将fn2直接定义到fn1的内部,这样fn2就可以直接访问fn1的变量2 ...

  7. python学习 day13 装饰器(一)&推导式

    装饰器&推导式 传参位置参数在前,关键词参数在后 函数不被调用内部代码不被执行 函数在被调用的时候,每次都会开辟一个新的内存地址,互不干扰 #经典案例 def func(num): def i ...

  8. day13.装饰器进阶,迭代器

    1.from functools import wraps 这个函数可以保留原来函数的属性 # from functools import wraps def car_time(fun): # @wr ...

  9. Python 语法糖装饰器的应用

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

随机推荐

  1. ASP的调试技术解答

    一. 调试 ASP.NET 应用程序时出现"未将项目配置为进行调试"的错误信息 症状 当您在 Visual Studio .NET 中调试 ASP.NET 应用程序时,可能会出现下 ...

  2. 确定字符互异 牛客网 程序员面试金典 C++ Python

    确定字符互异 牛客网 程序员面试金典 C++ Python 题目描述 请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniStri ...

  3. cf17B Hierarchy(额,,,水)

    题意: Nick's company employed n people. Now Nick needs to build a tree hierarchy of «supervisor-surbod ...

  4. hdu 2086 A1 = ? (公式推导)

    有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).若给出A0, An+1, 和 C1, C2, .....Cn.请编程计算A1 = ? Inp ...

  5. cf Make It Nondeterministic (简单贪心)

    有N个人.每个人都有两个名字. 给出这N个人的一个排列.p[1]...p[N]. 现在让每个人挑自己丙个名字中的一个名字.问是否存在一种方案,使得挑出来的N个名字按字典序排完以后正好是p[1]...p ...

  6. 【Java】String、StringBuffer、StringBuilder

    java.lang.String类 概述 String:代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现 String声明为final,不可被 ...

  7. 一文了解cookie

    @ 目录 什么是Cookie? Cookie 的作用 Cookie原理 Cookie的分类 会话 Cookies 永久性 Cookies Cookie 的属性 name value Domain Pa ...

  8. JS和JQUERY常见函数封装方式

    JS中常用的封装函数4种方法: 1. 函数封装法: function box(){ } 2. 封装成对象 : let Cookie = { get(){ }, set(){ } } 3. 封装成构造函 ...

  9. Maven 依赖调解源码解析(三):传递依赖,路径最近者优先

    本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第三篇,主要介绍依赖调解的第一条原则:传递依赖,路径最近者优先.本篇内容较多,也是开始源码分析的第一篇,请务必仔细阅读,否则后 ...

  10. [spojQTREE5]Query on a tree V

    合理的正解大概是动态点分治,这里给出其实现 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100005 4 st ...