开发者社区> 潇洒坤> 正文

Python闭包函数和装饰器

简介: 2018年7月2日笔记 7.Python函数对象和闭包 1.函数对象 函数是对象,可以给函数增加属性 def funcF(x,y,z): print(x,y,z) funcF(1,2,3) funcF.abc = "hello python" print(funcF.abc 上面一段代码的运行结果如下: 1 2 3 hello python 2.函数闭包 1.概念:在一个外函数中定义了一个内函数,内函数运用了外函数的临时变量,并且外函数的返回值是内函数的引用 示例代码:演示函数嵌套和闭包。
+关注继续查看

2018年7月2日笔记

7.Python函数对象和闭包

1.函数对象

函数是对象,可以给函数增加属性

def funcF(x,y,z):
    print(x,y,z)
funcF(1,2,3)
funcF.abc = "hello python"
print(funcF.abc

上面一段代码的运行结果如下:

1 2 3
hello python

2.函数闭包

1.概念:在一个外函数中定义了一个内函数,内函数运用了外函数的临时变量,并且外函数的返回值是内函数的引用
示例代码:演示函数嵌套和闭包。

def outer(a):
    b = 10
    def inner():
        print(a+b)
    return inner

demo = outer(5)
demo()

上面一段代码的运行结果如下:

15

8.Python装饰器

1.定义

装饰器实质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。他经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

2.场景

2.1 通过变量也能调用该函数

def hello():
    print("我是最初的hello函数")
#函数也是一个对象,而且函数对象可以赋值给变量
f = hello
f()

上面一段代码的运行结果如下:

我是最初的hello函数

2.2 场景
函数对象有一个name属性,可以获取函数的名字

def hello():
    print("我是最初的hello函数")

#获取函数的名字
print(hello.__name__)

上面一段代码的运行结果如下:

hello

2.3 假设增加hello()函数的功能,而完全不改变原来的代码

def outer(func):
    def inner(*args,**kwargs):
        print("我是%s()函数" %func.__name__)
        return func(*args,**kwargs)
    return inner

@outer
def hello():
    print("我是最初的hello函数")
hello()

上面一段代码的运行结果如下:

我是hello()函数
我是最初的hello函数

2.4 支持多个装饰器

import time

def deco1(func):
    print("deco1 decorated")
    def wrapper(*args, **kwargs):
        print("this is deco1")
        startTime = time.time()
        func(*args, **kwargs)
        endTime = time.time()
        ms = (endTime - startTime) * 1000
        print("time is %s ms" % ms)
        print("deco1 end here")
    return wrapper

def deco2(func):
    print("deco2 decorated")
    def wrapper(*args, **kwargs):
        print("this is deco2")
        func(*args, **kwargs)
        print("deco2 end here")
    return wrapper

@deco1
@deco2
def func(a, b):
    print("hello, here is func for add:")
    time.sleep(1)
    print("result is %d" % (a + b))

func(3, 4)

上面一段代码的运行结果如下:

deco2 decorated
deco1 decorated
this is deco1
this is deco2
hello, here is func for add:
result is 7
deco2 end here
time is 1000.9815692901611 ms
deco1 end here

多个装饰器使用的调用顺序:

def one(func):
    print('----1----')
    def two():
        print('----2----')
        func()
        print('----3----')
    return two

def a(func):
    print('----a----')
    def b():
        print('----b----')
        func()
        print('----c----')
    return b

@one
@a
def demo():
    print('----demo----')

demo()

上面一段代码的运行顺序如下:

----a----
----1----
----2----
----b----
----demo----
----c----
----3----

图片.png-18.5kB
图片.png-18.5kB

如上图所示,红色箭头标记“1”和“3”处越靠近函数的装饰器先被执行,红色箭头标记“2”处越远离函数的装饰器先被执行。

练习

1.定义一个函数,需求:去除列表中重复的元素.

def dropDuplicates(lt):
    new_list = []
    for i in lt:
        if i not in new_list:
            new_list.append(i)
    return new_list
##第二种方法一行代码解决
def dropDuplicates2(lt):
    return list(set(lt))

2.定义一个函数,需求:合并两个列表

def concatList(lt1,lt2):
    return lt1 + lt2

def concatList2(lt1,lt2):
    lt1.extend(lt2)
    return lt1

def concatList3(lt1,lt2):
    for i in lt2:
        lt1.append(i)
    return lt1

3.定义函数,需求:判断三个数中的最大值

def my_max(*args):
    return max(*args)

def my_max1(*args):
    max_number = args[0]
    for i in args:
        if i > max_number:
            max_number = i
    return max_number

4.定义一个函数,需求:实现斐波那契数列

def fibonacci(length):
    if length < 1:
        print("参数应该为正整数")
    if length == 1:
        return [1]
    elif length == 2:
        return [1,1]
    lt = [1,1]
    for i in range(2,length):
        lt.append(lt[i-1] + lt[i-2])
    return lt

5.将下列字符串变成字典

t = "k:1|k1:2|k2:3|k3:4"
result = {x:y for x,y in [k.split(':') for k in t.split('|')]}
print(result)

字符串函数

s = 'i love You so much'

print(s.ljust(22, '*'))
print(s.rjust(22, '2'))
print(s.center(22, '*'))
print(s.zfill(22))
print(s.replace('u', '1', 1))
print(s.split(' '))
print(s.upper())
print(s.lower())
print(s.capitalize())
print(s.title())
print(s.swapcase())
print(s.count('o'))
print(s.startswith('i'))
print(s.endswith('!'))
print(s.isalnum())
print(s.isalpha())
print(s.islower())
print(s.isupper())
print(s.istitle())

上面一段代码的运行结果如下:

i love You so much****
2222i love You so much
**i love You so much**
0000i love You so much
i love Yo1 so much
['i', 'love', 'You', 'so', 'much']
I LOVE YOU SO MUCH
i love you so much
I love you so much
I Love You So Much
I LOVE yOU SO MUCH
3
True
False
False
False
False
False
False

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
python学习之路-闭包
开发者学堂课程,了解Python语言的基本特性、编程环境的搭建、语法基础、算法基础等,了解Python的基本数据结构,对Python的网络编程与Web开发技术具备初步的知识,了解常用开发框架的基本特性,以及Python爬虫的基础知识。 课程地址:https://developer.aliyun.com/learning/course/601/detail/8737
17 0
Python入门教程:什么闭包函数
闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。 提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇。
33 0
Python装饰器1-闭包与函数装饰器
闭包与函数装饰器:被装饰函数不带参数、被装饰函数带参数、装饰器带参数,装饰器的调用
17 0
猿创征文|Python迭代器、生成器、装饰器、函数闭包
猿创征文|Python迭代器、生成器、装饰器、函数闭包
22 0
Go 和Python中的闭包实现及使用
Go 和Python中的闭包实现及使用
42 0
Python闭包
Python闭包自制脑图中介绍了 闭包的定义和形成闭包的条件, 闭包的定义:将函数作为返回值返回,是一种高阶函数,这种高阶函数被称为闭包,通过闭包可以创建一些只有当前函数能访问的变量,可以将一些私有的数据藏到闭包中。 形成闭包的条件也就是形成闭包的要点:函数嵌套,将内部函数作为返回值返回,内部函数必须要使用外部函数的变量。
18 0
深入浅出Python闭包
闭包概念:在一个内部函数中,对外部作用域的变量进行引用, (并且一般外部函数的返回值为内部函数),那么内部函数就被认为是闭包 `(colsure)`。
57 0
Python 中闭包概念的条分缕析
Python 中闭包概念的条分缕析
84 0
【Python零基础入门篇 · 19】:递归函数、闭包、装饰器(语法糖用法、设置多个装饰器)
【Python零基础入门篇 · 19】:递归函数、闭包、装饰器(语法糖用法、设置多个装饰器)
25 0
[Python进阶]Python闭包的深入浅出
[Python进阶]Python闭包的深入浅出
41 0
+关注
潇洒坤
毕业于厦门大学软件学院软件工程专业,专注于人工智能,喜欢写能够让新手顺畅入门的教程性文章。
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
给运维工程师的Python实战课
立即下载
Python 脚本速查手册
立即下载
ACE 区域技术发展峰会:Flink Python Table API入门及实践
立即下载