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类与面向对象