首页 » 未分类 » Python 从入门到放弃 - Lesson 4 迭代器、装饰器、序列化

Python 从入门到放弃 - Lesson 4 迭代器、装饰器、序列化

 
文章目录

装饰器

在不改变函数和函数调用方法的前提下,实现扩充函数的功能。其依赖三个基本要素

1. 函数即变量
2. 高阶函数
3. 嵌套函数

函数即变量

函数与变量的定义基本原理都是将内容存放到内存,将变量名和函数名作为指针指向内容的内存空间地址,唯一的区别就是变量在内空间存放的是变量值,而函数在内存空间存放的是函数体,其本质上也就是一块字符串

高阶函数

高阶函数包含两大特征

以一个函数名作为高阶函数的参数

高阶函数返回值可以是一个函数名(即函数所在的内存空间地址)

如果将上面例子中的myfunc = deco(test)修改为 test = deco(test), 则相当于替换了函数test的内存地址,同时deco函数体内继续用test()的方式调用函数而不影响原有功能,这就是装饰器的雏形

嵌套函数

在函数体中再定义一个函数,这个函数的作用域仅在当前函数中

上面例子中调用deco()将返回内部函数test所在的内存空间地址,通过print(deco())可以看到返回类似以下的结果

将这个返回值赋予一个变量,再执行这个变量,即可执行这个内部函数的函数体

装饰器基础版

结合上面三个部分的内容,高阶函数的两种特征和嵌套函数

以上例子已经完全实现了装饰器的基本要求,即:

1. 不改变函数本身
2. 不改变函数的调用方式
3. 实现对原函数的功能扩展

同时对于origin = deco(origin)这种表达式,python提供了专门的装饰器专用语法,在定义函数的上面加上

装饰器进阶版

基本版的装饰器实现了简单的装饰功能,但如果原函数是带参数的,还需要稍作修改

装饰器终极版

多样化的装饰器,装饰不同函数时赋予不同的功能

生成器generator

列表生成式

生成器

函数式生成器

使用yield关键字将函数变成一个生成器

yield进阶示例

一个协程式的消费者-生存者雏形

迭代器

可迭代对象

列表,字典,元组,字符串都是可迭代对象,数字不是

迭代器

可以通过next方法获取下一个对象

序列化

json序列化

json序列号只能处理简单的字符类型的对象,如字符串、列表、字典等

pickle序列化

pickle序列化与json序列化用法基本一直,但pickle序列化支持几乎所有Python数据类型(不支持生成器),pickle序列化后的对象为二进制对象

跨目录调用

原文链接:Python 从入门到放弃 - Lesson 4 迭代器、装饰器、序列化,转载请注明来源!

0