函数装饰器

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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值