Python函数设计原则
来源:程序员人生 发布时间:2015-01-15 08:29:31 阅读次数:4417次
在任何编程语言中,函数的利用主要出于以下两种情况:
- 代码块重复,这时候候必须斟酌用到函数,下降程序的冗余度
- 代码块复杂,这时候候可以斟酌用到函数,增强程序的可读性
当流程足够复杂时,就要斟酌函数,及如何将函数组合在1起。在Python中做函数设计,主要斟酌到函数大小、聚合性、耦合性3个方面,这3者应当归结于计划与设计的范畴。高内聚、低耦合则是任何语言函数设计的整体原则。
- 如何将任务分解成更有针对性的函数从而致使了聚合性
- 如何设计函数间的通讯则又触及到耦合性
- 如何设计函数的大小用以加强其聚合性及下降其耦合性
【聚合】
完善的程序设计,每一个函数应当而且只需做1件事。
比如说:把大象放进冰箱分3步:把门打开、把大象放进去、把门关上。
这样就应当写3个函数而不是1个函数拿所有的事全做了。这样结构清晰,层次分明,也好理解!
【大小】
Python即是面向进程的语言,也是面向对象的语言,但更多的是充当脚本语言的角色。
一样的功能,使用Python来实现其代码长度或许是C/C++/Java等语言的1/3. 几百行代码就可以实现不小的功能!
如果项目中设计的1个函数需要翻页才能看完的话,就要斟酌将函数拆分了。
在Python自带的200多个模块中,很少看到某个函数有两、3页的。
Python代码以简单明了著称,1个太长或有着深层嵌套的函数常常成为设计缺点的征象。
【耦合】
这样做可让函数独立于它外部的东西。参数和return语句就是隔离外部依赖的最好的办法。
第1重斟酌: 全局变量通常是1种蹩脚的函数间的进行通讯的方式。
它会引发依赖关系和计时的问题,从而会致使程序调试和修改的困难。
第2重斟酌: 从代码及性能优化来斟酌,本地变量远比全局变量快。
根据Python对变量的搜索的前后顺序:
本地函数变量==》上层函数变量==》全局变量==》内置变量
从上面可以看出,本地变量优先被搜索,1旦找到,就此停下。下面专门对其做了测试,测试结果以下:
import profile
A = 5
def param_test():
B = 5
res = 0
for i in range(100000000):
res = B + i
return res
if __name__=='__main__':
profile.run('param_test()')
>>> ===================================== RESTART =====================================
>>>
5 function calls in 37.012 seconds #全局变量测试结果:37 秒
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 19.586 19.586 19.586 19.586 :0(range)
1 1.358 1.358 1.358 1.358 :0(setprofile)
1 0.004 0.004 35.448 35.448 <string>:1(<module>)
1 15.857 15.857 35.443 35.443 Learn.py:5(param_test)
1 0.206 0.206 37.012 37.012 profile:0(param_test())
0 0.000 0.000 profile:0(profiler)
>>> ===================================== RESTART =====================================
>>>
5 function calls in 11.504 seconds #局部变量测试结果: 11 秒
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 3.135 3.135 3.135 3.135 :0(range)
1 0.006 0.006 0.006 0.006 :0(setprofile)
1 0.000 0.000 11.497 11.497 <string>:1(<module>)
1 8.362 8.362 11.497 11.497 Learn.py:5(param_test)
1 0.000 0.000 11.504 11.504 profile:0(param_test())
0 0.000 0.000 profile:0(profiler)
Python数据类型比如说列表、字典属于可变对象。在作为参数传递给函数时,有时会像全局变量1样被修改。
这样做的坏处是:增强了函数之间的耦合性,从而致使函数过于特殊和不友好。保护起来也困难。
这个时候就要斟酌使用切片S[:]和copy模块中的copy()函数和deepcopy()函数来做个拷贝,避免修改可变对象
具体参考这篇文章:
Python中的深浅拷贝详解
比如说在b.py文件中导入a模块,a中有变量PI = 3.14, 但b.py想将其修改成:PI = 3.14159, 在这里你就弄不清楚变量PI本来的值究竟是多少。碰到这类情况,可以斟酌用易懂的函数名来实现:
#模块a.py
PI = 3.14
def setPi(new):
PI = new
return PI
这样既有自己想要的PI的值,又没有改变a模块中PI的值import a
PI = a.setPi(3.14159)
print PI;a.PI
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠