190401装饰器-高阶函数-闭包

一、装饰器

  1. 装饰器本质是函数
  2. 为其他函数添加附加功能
  3. 不修改被修饰函数的源代码
  4. 不修改被修饰函数的调用方式
  • 装饰器示例
import time

def timmer(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        res = func(*args,**kwargs)
        stop_time = time.time()
        print("函数的运行时间:%s" % (stop_time - start_time))
        return res
    return wrapper

@timmer
def calc(l):

    s = 0
    for i in l:
        s += i
        time.sleep(0.1)
    return s

print(calc(range(20)))
  • 装饰器示例2
import time

def timmer(func):
    def wrapper():
        start_time = time.time()
        func()  #运行传进来的f函数
        stop_time = time.time()
        print("函数的运行时间是: %s" % (stop_time - start_time))
    return wrapper

@timmer  #f = timmer(f)  #将f函数传给timmer
def f():
    time.sleep(3)
    print("f 函数运行完成。")

f()  #执行wrapper()
  • 修饰带返回值的函数
import time

def timmer(func):
    def wrapper():
        start_time = time.time()
        res = func()  #运行传进来的f函数
        stop_time = time.time()
        print("函数的运行时间是: %s" % (stop_time - start_time))
        return res  #将f函数的返回值返回
    return wrapper

@timmer  #f = timmer(f)  #将f函数传给timmer
def f():
    time.sleep(3)
    print("f 函数运行完成。")
    return "f函数的返回值"
  • 修饰带参数的函数
import time

def timmer(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        res = func(*args,**kwargs)  #运行传进来的f函数
        stop_time = time.time()
        print("函数的运行时间是: %s" % (stop_time - start_time))
        return res  #将f函数的返回值返回
    return wrapper

@timmer  #f = timmer(f)  #将f函数传给timmer
def f(name):
    time.sleep(1)
    print("f 函数运行完成。函数的参数是:%s" %name)
    return "f函数的返回值"

res = f("dongfei")  #执行wrapper()
print(res)
  • 认证登录装饰器示例
def auth(func):
    def warpper(*args,**kwargs):
        username = input("your username: ")
        password = input("your password: ")
        if username == "dongfei" and password == "123":
            res = func(*args,**kwargs)
            return res
        else:
            print("username or password error!")
    return warpper

def index():
    print("welcome to my index page.")

@auth
def home(name):
    print("%s go home" %name)

@auth
def shopping_car():
    print("your shopping_car")

index()
home("dongfei")
shopping_car()
  • 模拟记录session
user_list = [
    {"username":"dongfei", "password":"123456"},
    {"username":"dongfei2", "password":"123456"},
    {"username":"dongfei3", "password":"123456"},
    {"username":"dongfei4", "password":"123456"},
]

current_dic = {"username":None, "login_status":False}

def auth(func):
    def warpper(*args,**kwargs):
        if current_dic["username"] and current_dic["login_status"]:
            res = func(*args, **kwargs)
            return res
        username = input("your username: ")
        password = input("your password: ")
        for user_dic in user_list:
            if username == user_dic["username"] and password == user_dic["password"]:
                current_dic["username"] = username
                current_dic["login_status"] = True
                res = func(*args,**kwargs)
                return res
        else:
            print("username or password error!")
    return warpper

def index():
    print("welcome to my index page.")

@auth
def home(name):
    print("%s go home" %name)

@auth
def shopping_car():
    print("your shopping_car")

index()
home("dongfei")
shopping_car()
  • 带参数的装饰器
user_list = [
    {"username":"dongfei", "password":"123456"},
    {"username":"dongfei2", "password":"123456"},
    {"username":"dongfei3", "password":"123456"},
    {"username":"dongfei4", "password":"123456"},
]

current_dic = {"username":None, "login_status":False}

def auth(auth_type):
    def auth_func(func):
        def warpper(*args,**kwargs):
            if auth_type == "file_db":
                if current_dic["username"] and current_dic["login_status"]:
                    res = func(*args, **kwargs)
                    return res
                username = input("your username: ")
                password = input("your password: ")
                for user_dic in user_list:
                    if username == user_dic["username"] and password == user_dic["password"]:
                        current_dic["username"] = username
                        current_dic["login_status"] = True
                        res = func(*args,**kwargs)
                        return res
                else:
                    print("username or password error!")
            elif auth_type == "mysql_db":
                print("请使用%s认证:" %auth_type)
            else:
                print("无效的认证类型")
        return warpper
    return auth_func

@auth("ldap")
def index():
    print("welcome to my index page.")

@auth(auth_type="mysql_db")  # @auth(auth_type="mysql") 等于 @auth_func
def home(name):
    print("%s go home" %name)

@auth(auth_type="file_db")
def shopping_car():
    print("your shopping_car")

index()
home("dongfei")
shopping_car()

二、高阶函数

  1. 函数接受的参数是一个函数名
  2. 函数的返回值是一个函数名
  3. 满足以上条件的任意一个都是高阶函数
import time

def foo():
    print("from foo")
    time.sleep(2)

def timmer(func):
    start_time = time.time()
    func()
    stop_time = time.time()
    print("函数的运行时间:%s" % (stop_time - start_time))
    return func

foo = timmer(foo)
foo()

三、解压序列

>>> a,*_,c = [1,2,3,4,5,6,7,8]  #取第一个和最后一个值
>>> a
1
>>> c
8
>>> _
[2, 3, 4, 5, 6, 7]

原文地址:https://www.cnblogs.com/L-dongf/p/10657651.html

时间: 2024-10-07 15:45:55

190401装饰器-高阶函数-闭包的相关文章

5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器

一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰器 1.1什么是高阶函数? 1.1.1函数接收的参数,包涵一个函数名. 1.1.2 函数的返回值是一个函数名. 其实这两个条件都很好满足,下面就是一个高阶函数的例子. def test1(): print "hamasaki ayumi" def test2(func): return t

js 高阶函数 闭包

摘自  https://www.cnblogs.com/bobodeboke/p/5594647.html 建议结合另外一篇关于闭包的文章一起阅读:http://www.cnblogs.com/bobodeboke/p/6127650.html 一.闭包 闭包某种程度上就是函数的内部函数,可以引用外部函数的局部变量.当外部函数退出后,如果内部函数依旧能被访问到,那么内部函数所引用的外部函数的局部变量就也没有消失,该局部变量的生存周期就被延续. 一个经典的例子如下: <script> //thi

装饰器之高阶函数

高阶函数概念引入:满足下面两个条件之一便可以称为高阶函数 1:把一个函数的函数名当作实参传给另外一个函数. 2:返回值中包含函数名. 下面是一段简单的高阶函数的代码使用条件1: # Author:Ju BO ''' def bar(): print("in the bar") def test1(func): print(func) #----相当于打印bar这个函数在内存中的门牌号即内存地址 func()#----相当于bar(),调用bar这个函数 test1(bar)#----将

Python高阶函数-闭包

高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 在这里我们首先回忆一下python代码运行的时候遇到函数是怎么做的. 从python解释器开始执行之后,就在内存中开辟了一个空间 每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来. 但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心. 等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪

python 高阶函数与装饰器

高阶函数定义1.函数接收的参数是一个函数名2.函数的返回值是一个函数名以上两者满足任意一个,就是高阶函数 装饰器定义本质就是函数,功能是为其他函数添加新功能 装饰器的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包     # 无返回值无参数 import time def timer(func): #func = test def w(): start_time = time.time() func(

Python高阶函数与函数装饰器-day4

上节回顾 高阶函数 闭包函数 函数装饰器 模块导入 一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首先是Python3-->代码文件都是用utf-8来解释的.将代码和文件读到内存中就变成了Unicode,这也就是为什么Python只有encode没有decode了,因为内存中都将字符编码变成了Unicode,而Unicode是万国码,可以"

Go的魅力, 函数式(柯里化, 闭包, 高阶函数), [email&#160;protected]装饰器, 封装

Go朴实无华的代码风格是函数式的无尽魅力. 函数式有3个别名, 高大上的"柯里化", 编程语言的"闭包", 数学气息的"高阶函数". Python没有Go的func匿名函数, 但是具有可爱的语法糖(@装饰器). 编程语言都是相通的, 层层封装造就了灵活的风格. 理解了Go的"函数式", 再理解内嵌/接口/重写(设计模式), 剩下的是各个领域的工具了, 就可以写出服务于业务的代码. 感悟于 函数式 http://www.jian

高阶函数、返回函数、闭包、匿名函数、装饰器、偏函数

整理多个网友知识: 一.高阶函数(函数作为变量,传给另外一个函数使用) 高阶函数例子: 备注:math模块sqrt()函数求平方根. #!/usr/bin/env python #-*- coding:utf-8 -*- import math def add(x, y, f):     return f(x) + f(y) print add(100, 16, math.sqrt) [[email protected] ~]# python test1.py  14.0 内置高阶函数: (1)

装饰器,闭包,高阶函数,嵌套函数

高阶函数代码形式:(1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名) def too(): print('from too') #高阶函数 def foo(): print('from foo') return too a = foo() a() def too(): print('from too') def foo(func): print('from foo') func() a = foo(too) 函数嵌套 定义一个函数,在该函数的代码块中在定义函数(可以一直定义下去)