函数装饰器

本文详细介绍了Python中的装饰器,包括其定义、优点、使用方法和通用装饰器的概念。接着讨论了可迭代对象,如列表、字典等,并展示了列表推导式和字典推导式的使用。进一步探讨了生成器的背景、特性和创建方法,以及它们如何优化内存管理。此外,还简述了迭代器的概念和与可迭代序列的关系。最后,提到了Python中的时间模块,包括时间戳、结构化时间和字符串时间的转换。
摘要由CSDN通过智能技术生成

1:装饰器

1.1:装饰器的定义

  • 特殊的闭包函数,装饰器必须满足函数闭包的条件
    1:有函数的嵌套
    2:内部函数必须调用外部函数的参数或变量
    3:外部参数必须把内部函数当作返回值返回
  • 在函数编程中,通过给函数来添加一些功能来使函数可以完成更加复杂的功能,就是装饰器

1.2:装饰器的优点

  • 我们可以直接通过修改函数中的代码来完成需求,但是会产生以下一些问题
    • 如果修改的函数多,修改起来会比较麻烦
    • 不方便后期的维护
  • 这样做会违反开闭原则(ocp)
    • 程序的设计,要求开发对程序的扩展,要关闭对程序的修改

1.3:装饰器的使用

  • 通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展
  • 在开发中,我们都是通过装饰器来扩展函数的功能的

1.4:通用装饰器

  • 使用不定长的位置参数和不定长的关键字参数来做为函数的参数,可以使装饰器成为通用修饰器

1.5:修饰器的语法糖

  • @ old_fun
  • 解释:@ old_fun = old_fun(fun)
  • @ old_fun ,只对靠仅自己并且在该语句下面的函数起到修饰作用

2:可迭代对象

  • 可以使用for … in …:循环的对象都可以当作可迭代对象
  • 可迭代对象:字符串、元组、列表、集合、字典
  • 迭代也可以叫做遍历

3:推导式

3.1:推导式的分类

  • 推导式分为 列表推导式、字典推导式、集合推导式等。在这里我们主要说其中一种也是用的最多列表推导式

3.2:列表推导式

  • 作用:可以快速生成一个列表
  • 语法:
list_1 = [i for i in range(11)]
print(list_1)
----------------------
[1, 2, 3, 4, ......, 10]

3.3:字典推导式

  • 语法
    {键表达式:值表达式 for 循环}
  • 实例1:直接创建一个字典
import random
dict_1 = {keys: random.randint(1, 101) for keys in range(10)}
print(dict_1)
----------------
输出:
{0: 15, 1: 41, 2: 63, 3: 31, 4: 21, 5: 5, 6: 83, 7: 30, 8: 64, 9: 10}
  • 实例2:使用两个列表来创建一个字典
name = ['张三', '李四', '王五', '赵六']
age = [20, 21, 22, 19, 21]
name_age = {name:age for name, age in zip(name, age)}
print(name_age)
  • 可以看出字典推导式只会推导出长度最短的一个列表里面的所有元素

4:生成器

4.1:生成器的背景

  • 通过列表推导式我们可以直接创建出一个列表,但是受到内存的限制,我们不可能创造出一个无限大的列表。而且创建一个有200万个元素的列表,会占用很大的内存空间,而这个时候我们仅仅需要访问列表中几个元素,那么后面的元素就占用着空间就是一种浪费的行为。那么我们可不可以用几个元素就创建出几个元素。这样在一定程度上就优化了内存。那么在Python中有一种一边循环一边计算的机制就是生成器

4.2:生成器的特性

  • 需要注意的使生成器是一次性的,用完里面的元素就没有了,还有就是必须使用next()函数才可以得到生成器里面的元素,并且元素是依次向下取的,不会中断和忘记取到的元素的位置

4.3:创建生成器的方法

  • 方法一
    • 使用类似元组推导式的方法来创建
g = (i ** 3 for i in range(5))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
--------------------------
输出:
0
1
8
27
64
出错

- 方法二

  • 使用函数+yield来实现
def a(c):
    while c < 5:
        c += 1
        yield c
  • 只要在函数中出现yield关键字它就是一个生成器函数
  • 在函数中若是遇到yield不会跳出函数会继续执行函数的内容,这一点与return不同

5:迭代器

5.1:迭代器的分类

image.png

5.2:迭代器的定义

  • 迭代器是访问集合元素的一种方式。
  • 迭代器是一个可以记住遍历位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束。
  • 可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator

5.3:迭代器与可迭代序列的关系

  • 生成器是可迭代的,也是迭代器
    列表是可迭代的,但不是迭代器
    通过iter()函数可以将可迭代的变成一个迭代器

6:时间模块简介

  • 需要导入time模块,

6.1:时间戳

  • 自1970.01.01 00-00-00开始计时,到现在

6.1.1:语法

print(time.time)
  • 作用:不是给人看的而给机器看的计时

6.2:结构化时间

  • 把时间戳转换为结构化时间

6.2.1:转换为所在地的时区时间(北京时间,东八区)

语法:

# t = 时间戳
print(time.localtime(t))

###6.2.2:转换为零时区的时间
语法:

print(time.gmtime(t))

6.3:字符串时间

  • 作用:
    用来让人理解的时间格式

6.3.1:语法

print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(t)))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的函数装饰器是一种特殊类型的函数,它可以用来修改其他函数的功能。装饰器可以在不修改被装饰函数源代码的情况下,为其添加额外的功能。装饰器本质上是一个返回函数函数,它使用了闭包的概念。 Python提供了@符号作为装饰器的语法糖,使得应用装饰器更加方便。使用装饰器时,可以直接在被装饰函数的定义上方使用@符号加上装饰器函数的名称,就可以将被装饰函数作为参数传递给装饰器函数进行处理。 函数装饰器的应用场景很广泛,它可以用于添加日志记录、性能分析、权限验证、缓存等功能。通过使用装饰器,我们可以将这些功能从原始函数中分离出来,提高代码的可读性和可维护性。 以下是一个简单的示例,演示了如何使用函数装饰器: ``` def decorator(func): def wrapper(*args, **kwargs): # 添加额外的功能 print("装饰器添加的功能") # 调用原始函数 return func(*args, **kwargs) return wrapper @decorator def my_function(): print("原始函数") my_function() ``` 在上面的例子中,我们定义了一个装饰器函数`decorator`,它接受一个函数作为参数,并返回一个新的函数`wrapper`。在`wrapper`函数中,我们可以添加额外的功能,并调用原始函数。通过使用`@decorator`语法,我们将`my_function`函数传递给装饰器进行处理。 当我们调用`my_function()`时,实际上调用的是装饰器返回的`wrapper`函数。在执行`wrapper`函数之前,会先执行装饰器添加的额外功能,然后再调用原始函数。 这就是Python函数装饰器的基本原理和用法。通过使用装饰器,我们可以轻松地修改函数的功能,使代码更加简洁和可重用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值