python学习之路(十三)[闭包,装饰器,函数式编程,生成器]

一,闭包

闭包从表现形式上的定义就是,在一个内部函数里面,对在外部作用域但不是在全局作用域的变量进行引用,那么这个内部函数就是闭包,例如:

def func (x):

def fund(y):

return x*y

temp = func(8)

那么temp(3)=24,由上可知我们闭包的概念是由内部函数而来的,所以说我们不能再外部函数意外的地方对内部函数进行调用,并且内部函数只能对外部函数的变量进行访问,而不能修改。

这里我们给一个简单的例子从而帮助理解:

二,装饰器

具体的定义,我也口述不出来(感觉装饰器和闭包都是比较抽象的东西),我们来看我甲哥给的定义:装饰器的功能就是将被装饰函数当作参数传递给与装饰器对应的函数,并返回包装后的被装饰的函数。这里给出代码帮助理解:

什么是语法糖?

说的直白一点,语法糖没有任何功能性的作用,它是用于让整个代码看上去更加美观和便于理解的。上述代码我i们使用语法糖之后就会变成这样:(虽然感觉并没有便于理解)

三,函数编程式

我们这里学习三个:lambda, filter, map

1.lambda

lambda是用于创建匿名函数的关键词。在使用的时候给它临时给他取一个名字就行了。

创建时的模型就是这样的:

复制代码
lambda 参数1, 参数2, ... : 表达式

举个例子:

2.filter

形式:filter(function, iterable)

他的第一个参数可以是函数也可以是none,在第一个参数是函数的情况下,我们将第二个参数里面的数做为参数带入到函数中进行计算,然后返回返回值是True的玩意,如果第一个参数是none,那么就直接返回值是true的参数。

我们来举个例子:

3.map

它的原型是这样的:map(function, iterable, ...)

第一个参数是规则,第二个是而迭代对象

map 是 Python 内置的高阶函数,用于对可迭代对象中的每个元素执行同一操作,返回一个惰性迭代器(可以和lambda搭配使用)

如果在传入第二个参数的时候有多个可迭代对象,那么会从左到右依次进行计算,一段的那个为基准,短的那个到头以后,长的那个的后边部分就会被忽略。

举个例子:

四,生成器

创建方式:把函数里的 return 换成 yield 就变成"生成器函数",调用时并不执行,而是返回一个"可迭代对象"; 列表推导式外面套 () 就是"生成器表达式"。

运行机理:每次遇到 yield 先"交值"再"暂停",记住现场,下一次 next() 从暂停处继续,直到函数跑完抛出 StopIteration------小甲鱼把它比作"能续杯的奶茶机",一次只倒一口,喝完再按开关。

内置高阶搭档:用 for i in generator: 可自动触发 next()enumerate()zip() 同样支持生成器,节省内存,适合"大文件逐行读取""无限斐波那契"等场景。

五,高阶函数

概念:函数当"一等公民"------既能赋给变量,也能当参数或返回值,满足其一就叫高阶函数。

课程重点练的三件套

-- map():把函数映射到可迭代对象每个元素,返回迭代器;例:将全班英语成绩 *1.5 换算成 150 分制。

-- filter():按真值条件筛元素;例:筛出数学、物理均 ≥85 的竞赛候选人。

-- sorted():通过 key= 自定义排序;例:按"物理+化学"总分给学生排名。

进阶玩法:把 lambda、偏函数 functools.partial、甚至自定义高阶函数(参数里再传函数)串成"函数流水线",实现"成绩转换→筛选→排序"一条龙。

六,函数文档、类型注释、内省

  1. 写法:在 def 下方第一行用三引号写 """说明""",标准顺序"功能→参数→返回值→异常"。

    查看:运行阶段用 help()函数名.__doc__ 就能把说明调出来,达到"代码即文档"的效果;课程强调"写给人看,不要吝啬打字"。

  2. 类型注释 & 内省

    小甲鱼把类型注释叫"给变量贴便签":def add(x: int, y: int) -> int:,解释器不强制,但 IDE 与 mypy 可静态检查,减少"传错类型"的低级 bug。

  3. 内省( introspection )常用接口:-- type() / isinstance() 看"我是谁";-- hasattr() / getattr() 动态探属性;-- callable() 判断能否"加括号";课程用"查户口"类比,演示在交互环境实时查看对象信息,方便调试与写通用装饰器。

相关推荐
Asus.Blogs20 小时前
SSE + Resty + Goroutine + Channel 完整学习笔记
笔记·学习·golang
charlie11451419121 小时前
Git团队协作完全入门指南(上)
笔记·git·学习·教程·工程
迷茫的启明星21 小时前
Git命令学习
git·学习
全栈陈序员21 小时前
说说你对 Vue 的理解
前端·javascript·vue.js·学习·前端框架
im_AMBER1 天前
Leetcode 85 【滑动窗口(不定长)】最多 K 个重复元素的最长子数组
c++·笔记·学习·算法·leetcode·哈希算法
nwsuaf_huasir1 天前
overleaf在线编译latex怎办编译中文
学习
wdfk_prog1 天前
[Linux]学习笔记系列 -- [fs]filesystems
linux·笔记·学习
jackaso1 天前
react学习笔记
笔记·学习·react.js
像名字一样难取的昵称1 天前
Linux学习笔记:十八、Linux文件的压缩,解压缩一站式学习
linux·运维·笔记·学习·ubuntu·ssh