总结的几个Python函数方法设计原则

 更新时间:2015年06月03日 10:31:36   投稿:junjie  
这篇文章主要介绍了总结的几个Python函数方法设计原则,本文讲解了每个函数只做一件事、保持简单、保持简短、输入使用参数、输出使用return语句等内容,需要的朋友可以参考下

在任何编程语言中,函数的应用主要出于以下两种情况:

1.代码块重复,这时候必须考虑用到函数,降低程序的冗余度
2.代码块复杂,这时候可以考虑用到函数,增强程序的可读性

当流程足够繁杂时,就要考虑函数,及如何将函数组合在一起。在Python中做函数设计,主要考虑到函数大小、聚合性、耦合性三个方面,这三者应该归结于规划与设计的范畴。高内聚、低耦合则是任何语言函数设计的总体原则。

1.如何将任务分解成更有针对性的函数从而导致了聚合性
2.如何设计函数间的通信则又涉及到耦合性
3.如何设计函数的大小用以加强其聚合性及降低其耦合性

【聚合】

每个函数只做一件事

完美的程序设计,每个函数应该而且只需做一件事。
比如说:把大象放进冰箱分三步:把门打开、把大象放进去、把门关上。
这样就应该写三个函数而不是一个函数拿所有的事全做了。这样结构清晰,层次分明,也好理解!

【大小】

保持简单、保持简短

Python即是面向过程的语言,也是面向对象的语言,但更多的是充当脚本语言的角色。
同样的功能,使用Python来实现其代码长度也许是C/C++/Java等语言的1/3. 几百行代码就能实现不小的功能!
如果项目中设计的一个函数需要翻页才能看完的话,就要考虑将函数拆分了。
在Python自带的200多个模块中,很少看到某个函数有两、三页的。
Python代码以简单明了著称,一个过长或者有着深层嵌套的函数往往成为设计缺陷的征兆。

【耦合】

输入使用参数、输出使用return语句

这样做可以让函数独立于它外部的东西。参数和return语句就是隔离外部依赖的最好的办法。

慎用全局变量

第一重考虑: 全局变量通常是一种蹩脚的函数间的进行通信的方式。
它会引发依赖关系和计时的问题,从而会导致程序调试和修改的困难。

第二重考虑: 从代码及性能优化来考虑,本地变量远比全局变量快。
根据Python对变量的搜索的先后顺序: 本地函数变量==》上层函数变量==》全局变量==》内置变量
从上面可以看出,本地变量优先被搜索,一旦找到,就此停下。下面专门对其做了测试,测试结果如下:

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数据类型比如说列表、字典属于可变对象。在作为参数传递给函数时,有时会像全局变量一样被修改。

这样做的坏处是:增强了函数之间的耦合性,从而导致函数过于特殊和不友好。维护起来也困难。

这个时候就要考虑使用切片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 

相关文章

  • python 基于卡方值分箱算法的实现示例

    python 基于卡方值分箱算法的实现示例

    这篇文章主要介绍了python 基于卡方值分箱算法的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • pandas中的.assign()方法的用法示例小结

    pandas中的.assign()方法的用法示例小结

    pandas中的.assign()方法用于创建一个新的DataFrame,其中包含现有DataFrame的副本,并附加了指定的新列或更新了现有列,.assign()方法还可以链式使用,以添加多个新列或更新现有列,对pandas中的.assign()方法感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • pycharm导入第三方库的两种方法(永不报错)

    pycharm导入第三方库的两种方法(永不报错)

    这篇文章主要介绍了pycharm导入第三方库的两种方法(永不报错),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • python实现rest请求api示例

    python实现rest请求api示例

    这篇文章主要介绍了python实现rest请求api示例,需要的朋友可以参考下
    2014-04-04
  • Python中向一个集合添加值的操作方法

    Python中向一个集合添加值的操作方法

    从数学上讲,集合是一个在逻辑上有联系的不同对象的集合,在Python中,集合是一个内置的数据类型,它是无索引的和不可变的,这篇文章主要介绍了Python中向一个集合添加值的操作方法,需要的朋友可以参考下
    2023-10-10
  • numpy.std() 计算矩阵标准差的方法

    numpy.std() 计算矩阵标准差的方法

    今天小编就为大家分享一篇numpy.std() 计算矩阵标准差的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python合并两个字典的常用方法与效率比较

    Python合并两个字典的常用方法与效率比较

    这篇文章主要介绍了Python合并两个字典的常用方法与效率比较,实例分析并对比了Python合并字典的常用方法,需要的朋友可以参考下
    2015-06-06
  • python3实现TCP协议的简单服务器和客户端案例(分享)

    python3实现TCP协议的简单服务器和客户端案例(分享)

    下面小编就为大家带来一篇python3实现TCP协议的简单服务器和客户端案例(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • python截取两个单词之间的内容方法

    python截取两个单词之间的内容方法

    今天小编就为大家分享一篇python截取两个单词之间的内容方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python利用imshow制作自定义渐变填充柱状图(colorbar)

    Python利用imshow制作自定义渐变填充柱状图(colorbar)

    这篇文章主要介绍了Python利用imshow制作自定义渐变填充柱状图(colorbar),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论