python函数 闭包 生成器 装饰器 递归函数 函数设计规范及执行环境

本文详细探讨了Python中的闭包、生成器、装饰器和递归函数的概念与应用。闭包提供了一种方式让内层函数访问外层作用域的变量。生成器通过`yield`关键字实现惰性计算,节省内存。装饰器可以增强函数功能,不改变原有函数代码。递归则是通过函数自身调用来解决问题。同时,文章还强调了函数设计规范,如保持低耦合和高聚合性,确保函数的独立性和简洁性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

def func_name(arg1,…)
func_suite
函数语句或者整个执行流程遇到def语句时候,会在内存中生成一个函数对象,并且此对象靠函数名来引用。那么但是这个函数体里的语句只有在函数调用的时候才会被执行。而函数调用结束了,函数返回时,其内部所使用数据都被销毁了。

python的闭合函数 闭包:lexical closure

外层函数给内层函数提供了环境,即外层中变量的修改,引起内层函数的改变。叫做闭包,或闭合函数。但是虽然表现为函数的形式,本身并不是函数。函数是可以嵌套的,在函数内部定义一个子函数,这个子函数并没有被调用,而是直接当做返回值返回,这种函数叫做python的闭合函数。

在这里插入图片描述
在这里插入图片描述
#回顾 列表解析的主要目的就是为了在原有列表的基础上生成新的列表。如果我们在使用列表时一次只需要使用一个元素时可以使用生成器。
如:使用生成器生成1到10中每个数的平方,如下图:

在这里插入图片描述
由于生成器并不会直接创建出一个列表,因此对于生成器不能进行切片,索引,也不能执行任何常规的列表操作如append(),extend()等等,不过我们可以将生成器表达式转换成列表。生成器是按需每次返回一个结果进行计算,叫做惰性求值。

在这里插入图片描述
之前,我们的生成器在某种意义上还是基于某个列表来生成得到的。事实上我们可以使用函数来完全实现类似生成器一样的效果,自定义函数来实现。
yield 自动生成一个生成器对象。
在这里插入图片描述
在这里插入图片描述
上图中函数genNum在被调用时候其不会直接执行,而是用yield返回一个生成器对象,对此生成器调用next()方法,生成器将不断的执行语句。在函数直到遇到yield语句,函数不再执行,直到调用next()方法之后,继续执行,反复继续,直到没有yield停止,即生成器的迭代过程结束。
在这里插入图片描述
在这里插入图片描述
函数中使用yield,会返回一个生成器的对象。
使用生成器实现斐波那契数列。

#  0    1     1      2       3       5          8           13    
#     21    34      55           89        ……
>>> a=0;b=1
>>> def feibonacii():
...     global a,b
...     while True:
...         future=a+b
...         yield a
...         a=b
...         b=future
...
>>> d=iter(feibonacii())
>>> next(d)
0
>>>
>>> next(d)
1
>>> next(d)
1
>>> next(d)
2
>>> next(d)
3
>>> next(d)
5
>>> next(d)
8
>>> next(d)
13
>>> next(d)
21
>>> next(d)
34
>>> next(d)
55
>>> next(d)
89
>>>





装饰器

1.装饰器本身是一个函数,这个函数的主要目的是为了装饰其它函数:
2.功能:增强被装饰函数的功能:
装饰器一般接受一个函数对象作为参数,已对其进行增强。
在这里插入图片描述
对带参数的函数进行写装饰器增强其功能,如下图:。
在这里插入图片描述

递归:

递归需要边界条件,递归前进段和递归返回段;
10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
10 * (10-1) * ( (10-1)-1) * … * 1

#代码即计算过程解释如下图:
在这里插入图片描述
考虑以python递归的方式实现斐波那契数列。

函数的设计规范:

1.耦合性:
        (1)通过参数接受输入,以及通过return产生输出以保证函数的独立性;
        (2)尽量减少使用全局变量进行函数间通信;
        (3)不要在函数中修改可变类型的参数;
        (4)避免直接改变定义在另外一个模块中的变量;
2.聚合性:
         (1)每个函数都应该有一个单一的、统一的目标;
         (2)每个函数功能都应该相对简单。

函数执行环境在这里插入图片描述

完结

下一篇 python类与面向对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值