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 3hello python2.函数闭包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
目录
相关文章
|
3天前
|
数据安全/隐私保护 Python
探索Python中的装饰器:简化代码,提升效率
【9月更文挑战第32天】在Python编程世界中,装饰器是一个强大的工具,它允许我们在不改变函数源代码的情况下增加函数的功能。本文将通过直观的例子和代码片段,引导你理解装饰器的概念、使用方法及其背后的魔法,旨在帮助你写出更加优雅且高效的代码。
|
2天前
|
开发者 Python
深入理解Python中的装饰器
【9月更文挑战第33天】本文将通过浅显易懂的语言和生动的比喻,带领读者走进Python装饰器的奇妙世界。我们将从装饰器的基本概念出发,逐步探索其背后的原理,并通过实际代码示例,展示如何运用装饰器优化我们的代码结构。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你打开一扇通往高效编码的大门。
|
1天前
|
中间件 Python
探索Python中的装饰器:从基础到高级应用
本文将深入探讨Python中装饰器的使用,从最基础的语法开始,逐步讲解其高级应用。通过具体示例,帮助读者理解装饰器的本质和强大功能,从而在实际编程中灵活运用这一技术。
9 4
|
2天前
|
存储 缓存 开发者
探索Python中的装饰器:从基础到高级应用
【9月更文挑战第33天】本文将带你走进Python的装饰器世界,从理解其核心概念出发,逐步深入到实现机制与应用场景。我们将通过实际代码示例,展示如何利用装饰器简化代码、增强函数功能,并讨论装饰器的高级用法,如带参数装饰器和装饰器嵌套。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的洞见和实用技巧。
12 4
|
2天前
|
监控 数据安全/隐私保护 Python
探索Python装饰器的本质与应用
本文深入探讨了Python中装饰器(Decorator)的工作原理、实际应用及其在软件开发中的重要性。通过浅显易懂的语言解释什么是装饰器,如何创建和运用装饰器来增强函数和类的功能。同时,文章还涵盖了一些高级主题,如带参数的装饰器、多层装饰以及装饰器的实际应用案例,帮助读者更全面地理解和掌握这一强大的编程工具。
6 1
|
6天前
|
Python
python函数进阶
python函数进阶
|
5天前
|
安全 Python
Python量化炒股的获取数据函数—get_industry()
Python量化炒股的获取数据函数—get_industry()
15 3
|
7天前
|
Python
? Python 装饰器入门:让代码更灵活和可维护
? Python 装饰器入门:让代码更灵活和可维护
12 4
|
6天前
|
Python
Python sorted() 函数和sort()函数对比分析
Python sorted() 函数和sort()函数对比分析
|
7天前
|
缓存 测试技术 Python
探索Python中的装饰器:简化代码,提高可读性
【9月更文挑战第28天】在Python编程中,装饰器是一个强大的工具,它允许我们在不修改原有函数代码的情况下增加额外的功能。本文将深入探讨装饰器的概念、使用方法及其在实际项目中的应用,帮助读者理解并运用装饰器来优化和提升代码的效率与可读性。通过具体示例,我们将展示如何创建自定义装饰器以及如何利用它们简化日常的编程任务。
11 3
下一篇
无影云桌面