## 复习 '''函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰器:装饰器名就是外层函数 @outer@outer  # fn = outer(fn)def fn(): pass''' def wrap(func):    def inner(*args, **kwagrs):        # res = func(*args, **kwagrs)    …
复习 ''' 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰器:装饰器名就是外层函数 @outer @outer # fn = outer(fn) def fn(): pass ''' def wrap(func): def inner(*args, **kwagrs): # res = func(*args, **kwagrs) res = outer.i…
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰器:装饰器名就是外层函数 @outer @outer  # fn = outer(fn) def fn(): pass 今日内容 1.带参装饰器  |  2.wrapper  |  3.可迭代对象 |   4.迭代器对象  |  5.for 迭代器工作原理 |  6.枚举对象…
一,复习 ''' 1.函数的参数:实参与形参 形参:定义函数()中出现的参数 实参:调用函数()中出现的参数 形参拿到实参的值,如果整体赋值(自己改变存放值的地址),实参不会改变,(可变类型)如果修改内部内容,实参会跟着变化 位置实参 - 只能对位置形参赋值 关键字实参 - 可以对所有(不包含可变长位置形参)形参赋值 位置形参 - 必须出现在最前,且必须传值 默认形参 - 出现在位置形参后*前,可以不用传参 可变长位置形参 - 接收所有位置形参.默认形参没有接收完的位置实参 有无默认值关键字形参…
""" 今日内容: 1.带参装饰器及warps 2.迭代器 3.生成器 """ """ # 一.带参装饰器及warps系统装饰器 # 1.为什么需要带参装饰器? -- 昨天的内容已经讲了装饰器,但是讲的都是增加的函数不需要外界传人参数,如果装饰器也需要外界传入参数呢? -- 此时就需要带参装饰器 # 2.装饰器的推导过程 -- 如果添加的功能也需要外界传入参数时,参数应该如何通过谁进行传递呢? -- 如果通过inne…
带参装饰器 通常,装饰器为被装饰的函数添加新功能,需要外界的参数  -- outer参数固定一个,就是func -- inner参数固定同被装饰的函数,也不能添加新参数 -- 可以借助函数的嵌套定义,外层给内层传参 def wrap(info): def outer(func): # info = 0 def inner(*args, **kwargs): print('新:拓展的新功能,可能也需要外界的参数%s' % info) res = func(*args, **kwargs) retu…
简单点就是这种 def deco2(param=1): def _deco2(fun): def __deco2(*args, **kwargs): print (param) fun(*args, **kwargs) return __deco2 return _deco2 @deco2 # 错误的写法 def f2(strx): print (strx) f2('hello') 运行上面这个,期待打印1和hello 实际上是不会打印任何东西的,因为@deco2后面忘了加括号,这样就悲剧了,把…
一.什么是装饰器 装饰器是用来给函数动态的添加功能的一种技术,属于一种语法糖.通俗一点讲就是:在不会影响原有函数的功能基础上,在原有函数的执行过程中额外的添加上另外一段处理逻辑 二.装饰器功能实现的技术基础--闭包 什么是闭包?闭包就是:一个内部函数被一个外部函数当做返回值进行返回,并且内部函数引用了外部函数提供的变量, 此时将内部函数和引用的外部变量构成的整体称为闭包 闭包的特征?闭包有一个明显的特征就是:引用了外部变量的闭包能够让外部函数不被释放,如果外部函数被释放,就会导致内部函数访问变量…
一,复习 ''' 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.验证执行 开放封闭原则: 功能可以拓展,但源代码与调用方式都不可以改变 装饰器:装饰器名就是外层函数 @outer @outer # fn = outer(fn) def fn(): pass ''' def wrap(func): def inner(*args, **kwagrs): # res = func(*args, **kwagrs) res = outer…
目录 2. 带参数的装饰器 3. 多个装饰器装饰一个函数 2. 带参数的装饰器 #在装饰器的基础上再套一层 def auth(argv): def wrapper(func): def inner(*args,**kwargs): func(*args,**kwargs) return inner return wrapper @auth() # 可传参 def func(): pass func() #解开: """ wrapper = auth() func = wrap…
我跟别人说我精通python,别人问我wrapper是啥,我说不知道,尼玛,原来wrapper就是装饰器,熟的不得了啊,英语真是我的克星啊. 闭包 closure 在认识装饰器之前先认识下闭包 闭包,顾名思义就是把什么东西封闭在保内,什么东西呢?变量和函数. 在一个函数里装了另一个函数,里面那个函数称为内部函数,外面那个函数称为外部函数, 在内部函数里,对在外部作用域(非全局作用域)里的变量进行引用,这个内部函数就称为闭包 定义在外部函数内但被内部函数引用或调用的变量称为自由变量,所以闭包又被称…
有参装饰器的引入: import time import random from functools import wraps def timmer(func): @wraps(func) def wrapper(): # wrapper.__doc__=func.__doc__ start_time = time.time() func() stop_time = time.time() print('run time is %s' % (stop_time-start_time)) # wr…
Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练习 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 1.有参装饰器 # def auth(argv): # def wrapper(func): # def inner(*args,**kwargs): # func(*args,**kwargs) # return inner # retur…
1.有参装饰器 模板: def auth(x): def deco(func): def timmer(*args,**kwargs ): res = func(*args,**kwargs ) return timmer return deco 例子: import timecurrent_user={'user':None}def auth(engine='file'): def deco(func): def wrapper(*args,**kwargs): if current_user…
装饰器 装饰器就是闭包函数的一种应用场景 一 为何要用装饰器 #开放封闭原则:对修改封闭,对扩展开放 二 什么是装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则: 1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能 三 装饰器的使用 1. 无参装饰器 def 装饰器名字(func): def wrapper(*args,**kwargs): #func是被装饰的对象,这里…
1.有参装饰器:给装饰器添加一个参数.来控制装饰器的行为. @auth(参数) auth里层的函数名 = auth(参数) 被装饰的函数名 = auth里层的函数名(被装饰的函数名) 被装饰的函数名() 应用场景:flask框架的路由就是有参装饰器 def arg(argv): def wrapper(func): def inner(*args,**kwargs): if argv: print("开始装饰") ret = func(*args,**kwargs) if argv:…
叠加装饰器: 叠加装饰器 - 每一个新的功能都应该写一个新的装饰器 - 否则会导致,代码冗余,结构不清晰,可扩展性差 在同一个被装饰对象中,添加多个装饰器,并执行. @装饰1 @装饰2 @装饰3 def 被装饰对象(): pass 注意: 装饰器在调用被装饰对象时才会执行添加的功能. - 叠加装饰器: - 装饰的顺序: 由下到上装饰 - 执行的顺序: 由上往下 注意: 无论inner中出现任何判断,最后都要返回“调用后的被装饰对象” func(*args, **kwargs) def wrapp…
day15 装饰器的进阶 有参装饰器 @auth(chose) 相等于以下两行代码的解构 wrapper = auth(chose) foo = wrapper(foo) # dic = {'username': None, # 'flag': False # } # # def auth(argv): # def wrapper(f): # def inner(*args, **kwargs): # if dic['flag']: # f(*args, **kwargs) # else: #…
一.装饰器 二.装饰器修正1 三.装饰器修正2 四.装饰器的语法糖 五.有参.无参装饰器 六.global与nonlocal 一.装饰器 ''' 1 什么是装饰器 器=>工具 装饰=>指的是为被装饰对象添加新功能 装饰器本身可以是任意可调用的对象=>函数 被装饰的对象也可以是任意可调用的对象=>函数 目标:写一个函数来为另外一个函数添加新功能 2 为何要用装饰器 开放封闭原则: 软件一旦上线就应该对修改封闭,对扩展开放 对修改封闭: 1. 不能修改功能的源代码 2. 也不能修改功能…
一.为什么要有有参装饰器? 来看之前的无参装饰器 # 无参装饰器 def outter(func): def wrapper(*args,**kwargs): start = time.time() res = func(*args,**kwargs) # 我们需要一个变量接受函数的返回值 end = time.time() print("run time is %s" % (end - start)) return res # 我们装饰器的核心是wrapper函数,只需要在wrapp…
今日内容 1.有参装饰器 2.无参装饰器 什么是装饰器? 用来为被装饰对象添加新功能的工具. 注:装饰器可以是任意可调用对象,被装饰对象也可以是任意可调用对象. 为何要用装饰器? 开放封闭原则:对修改封闭,对扩展开放 装饰器的实现需要遵循两大原则: 1.不修改被装饰对象的源代码 2.不修改装饰器对象的调用方式 有参装饰器模板: def outter(func): def warpper(*args,**kwargs): res=func(*args,**kwargs) return res re…
多个装饰器: 加载顺序:由下而上 执行顺序:由上而下 有参装饰器: 闭包,给函数传参的一种方法 当装饰器内需要参数时,可以采用闭包形式给其传参,第三层函数接收完参数时,就变为无参装饰器 三元表达式: 在不影响可读性的情况下,将只有两种结果的if判断,写为一行 x if x>y else y 左边为条件成立时的返回值,else后为条件不成立的返回值 匿名函数 lambda x,y :x+y 冒号左边为传入的参数,右边为返回的结果 应用场景:用一次就不用了 匿名函数不会单独使用,与内置函数配套使用…
有参装饰器 def timmerout(flag1): #flag1 =flag def timmer(f): def inner(*args,**kwargs): if flag1: start_time = time.time() ret = f(*args,**kwargs) end_time = time.time() print('此函数的执行效率%s' % (end_time - start_time)) return ret else: ret = f(*args, **kwarg…
python的装饰器简单来说就是函数的一种形式,是为了扩展原来的函数功能而设计的. 装饰器的特别之处在于它的返回值也是一个函数,可以在不改变原有函数代码的基础上添加新的功能 # 先定义一个函数及引用# 思路:# outer 函数相当于 decorator的func参数# outoo 调用decorator,将outer传入到函数当中# 函数返回的是 decorator内部的inner函数 执行outoo相当于执行innerdef decorator(func): def inner(*args,…
本章内容概要 1. 多层装饰器 2. 有参装饰器 3. 递归函数 4. 算法(二分法) 本章内容详解 1. 多层装饰器 1.1 什么是多层装饰器 多层装饰器是从下往上依次执行,需要注意的是,被装饰的函数名所指代的函数是一直被装饰器中的内层函数所取代. 1.2 语法糖的功能 会自动将下面紧挨着的函数名当做参数传递给@符号2后面的函数名(加括号调用) 1.3 代码讲解 def outter1(func1): # 13.func1 = wrapper2函数名 print('加载了outter1') #…
带参数的装饰器:就是在原装饰器外再包一层函数 def auth(driver='file'): def auth2(func): def wrapper(*args,**kwargs): name=input("user: ") pwd=input("pwd: ") if driver == 'file': if name == 'egon' and pwd == '123': print('login successful') res=func(*args,**k…
一.global与nonlocal #global x = 1 def f1(): global x # 声明此处是全部变量x x = 2 print(x) f1() # 调用f1后,修改了全局变量x = 2 print(x) # 打印结果为2 # nonlocal def f1(): x = 1 def f2(): nonlocal x # 此处声明使用外层函数的变量x x = 2 # 将外层函数进行了修改 print(x) # f2() print(x) # 因为f1()下的x已经被修改,所…
# import time## def timmer(func): #func=最原始的index的内存地址# def wrapper(*args,**kwargs):# start=time.time()# res=func(*args,**kwargs)# stop=time.time()# print(stop - start)# return res# return wrapper## @timmer #index=timmer(index) #index=wrapper的内存地址# d…
需求:想要在test_func函数前后执行一些代码   1.第一步(定义函数,将调用原函数,使用新函数替换) def test_func(): return 'test_func' def test_wrapper_func(): print 'before' rt = test_func() print 'after' return rt print test_wrapper_func() 2.第二步(原函数可以定义参数) def test_func(): return 'test_func'…