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
目录
相关文章
|
2月前
|
开发者 Python
探索Python中的装饰器:从基础到高级应用
本文将带你深入了解Python中的装饰器,这一强大而灵活的工具。我们将一起探讨装饰器的基本概念,它们如何工作,以及如何使用它们来增强函数和类的功能,同时不改变其核心逻辑。通过具体代码示例,我们将展示装饰器的创建和使用,并探索一些高级应用,比如装饰器堆栈和装饰带参数的装饰器。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角,帮助你更有效地使用装饰器来简化和优化你的代码。
|
2月前
|
测试技术 数据安全/隐私保护 开发者
探索Python中的装饰器:从基础到高级应用
装饰器在Python中是一个强大且令人兴奋的功能,它允许开发者在不修改原有函数代码的前提下增加额外的功能。本文将通过具体代码示例,带领读者从装饰器的基础概念入手,逐步深入到高级用法,如带参数的装饰器和装饰器嵌套等。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
2月前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
56 6
|
29天前
|
测试技术 数据库 Python
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
103 61
Python装饰器实战:打造高效性能计时工具
|
29天前
|
设计模式 前端开发 Shell
Python装饰器是什么?
装饰器是Python中用于动态修改函数、方法或类功能的工具,无需改变原代码。通过将函数作为参数传递并返回新函数,装饰器可以在原函数执行前后添加额外逻辑。例如,使用`@logger`装饰器可以打印函数调用日志,而`@timethis`则可用于计算函数执行时间。为了保持被装饰函数的元信息(如`__name__`和`__doc__`),可使用`functools.wraps`装饰器。此外,带参数的装饰器可通过嵌套函数实现,如`@timeitS(2)`,以根据参数条件输出特定信息。
90 59
|
1月前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
31 3
|
1月前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
41 2
|
29天前
|
存储 人工智能 Python
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
本文介绍了Python中如何使用`input()`函数接收用户输入。`input()`函数可以从标准输入流获取字符串,并将其赋值给变量。通过键盘输入的值可以实时赋予变量,实现动态输入。为了更好地理解其用法,文中通过实例演示了如何接收用户输入并存储在变量中,还介绍了`input()`函数的参数`prompt`,用于提供输入提示信息。最后总结了`input()`函数的核心功能及其应用场景。更多内容可参考蓝桥、GitHub和Gitee上的相关教程。
16 0
|
2月前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
64 18
|
2月前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
85 8

热门文章

最新文章