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

   这篇文章主要介绍了总结的几个Python函数方法设计原则,本文讲解了每个函数只做一件事、保持简单、保持简短、输入使用参数、输出使用return语句等内容,需要的朋友可以参考下

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

  1.代码块重复,这时候必须考虑用到函数,降低程序的冗余度

  2.代码块复杂,这时候可以考虑用到函数,增强程序的可读性

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

  1.如何将任务分解成更有针对性的函数从而导致了聚合性

  2.如何设计函数间的通信则又涉及到耦合性

  3.如何设计函数的大小用以加强其聚合性及降低其耦合性

  【聚合】

  每个函数只做一件事

  完美的程序设计,每个函数应该而且只需做一件事。

  比如说:把大象放进冰箱分三步:把门打开、把大象放进去、把门关上。

  这样就应该写三个函数而不是一个函数拿所有的事全做了。这样结构清晰,层次分明,也好理解!

  【大小】

  保持简单、保持简短

  Python即是面向过程的语言,也是面向对象的语言,但更多的是充当脚本语言的角色。

  同样的功能,使用Python来实现其代码长度也许是C/C++/Java等语言的1/3. 几百行代码就能实现不小的功能!

  如果项目中设计的一个函数需要翻页才能看完的话,就要考虑将函数拆分了。

  在Python自带的200多个模块中,很少看到某个函数有两、三页的。

  Python代码以简单明了著称,一个过长或者有着深层嵌套的函数往往成为设计缺陷的征兆。

  【耦合】

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

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

  慎用全局变量

  第一重考虑: 全局变量通常是一种蹩脚的函数间的进行通信的方式。

  它会引发依赖关系和计时的问题,从而会导致程序调试和修改的困难。

  第二重考虑: 从代码及性能优化来考虑,本地变量远比全局变量快。

  根据Python对变量的搜索的先后顺序: 本地函数变量==》上层函数变量==》全局变量==》内置变量

  从上面可以看出,本地变量优先被搜索,一旦找到,就此停下。下面专门对其做了测试,测试结果如下:

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

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原先的值到底是多少。碰到这种情况,可以考虑用易懂的函数名来实现:

  ?

1
2
3
4
5
6

#模块a.py
PI = 3.14
 
def setPi(new):
PI = new
return PI

  这样既有自己想要的PI的值,又没有改变a模块中PI的值

  ?

1
2
3
4

import a
 
PI = a.setPi(3.14159)
print PI;a.PI

时间: 2024-11-02 10:00:07

总结的几个Python函数方法设计原则的相关文章

23、Python与设计模式--设计原则

一.六大设计原则 在法理学中,法律规则与法律原则都是法律规范的重要构成.但二者也会有些不同:法律规则是指采取一定的结构形式具体规定人们的法律权利.法律义务以及相应的法律后果的行为规范,内容比较明确,比如,交通法规中规定,禁止闯红灯:法律原则是指在一定法律体系中作为法律规则的指导思想,基本或本原的.综合的.稳定的原理和准则,内容上只包含"大方针",而并未有具体规则,比如,如果车上有马上临产的孕妇,闯红灯不会被处罚,这是符合重视生命的原则.设计模式与设计原则,基本符合规则与原则的关系,设计

python的方法 是什么?与函数有什么区别?

问题描述 python的方法 是什么?与函数有什么区别? 最近在使用headfirstpython一书,书中一个语法也没讲,刚刚学了c语言,所以我不是很清楚方法和函数的区别 解决方案 主要是在面向对象的思想中,有差别: 函数function -- A series of statements which returns some value to a caller. It can also be passed zero or more arguments which may be used in

Python函数的周期性执行实现方法_python

本文实例讲述了Python函数的周期性执行实现方法.分享给大家供大家参考,具体如下: 需要用到python的sched模块: #coding=utf-8 import time,sched,os #初始化sched模块的scheduler类 #第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞. s = sched.scheduler(time.time,time.sleep) #被周期性调度触发的函数 def event_func(): print "Current Ti

python魔法方法-自定义序列详解_python

自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python 的相关的协议.所谓的协议就是一些约定内容.例如,如果要将一个类要实现迭代,就必须实现两个魔法方法:__iter__.next(python3.x中为__new__).__iter__应该返回一个对象,这个对象必须实现 next 方法,通常返回的是 self 本身.而 next 方法必须在每次调用的时

Python专用方法与迭代机制实例分析_python

本文实例讲述了Python专用方法与迭代机制,分享给大家供大家参考之用.具体分析如下: 众所周知,Python 设计哲学是"优雅"."明确"."简单",对于一件事只用一种最好的方法来做,而这种优雅在于背后很自然的隐藏了很多细节.比如对一些对象直接用for 语句来迭代,一些全局函数可以作用于很多具有共同特征的对象,还有生成器装饰器自省等特性.其中很多实现都是借助 Python  内部专用方法,而对外则使用统一的全局函数来进行操作,在配合一些语法糖,

Python函数总结

声明和调用函数: 声明函数的方法是用def关键字,函数名及小括号里面的参数列表. def foo(x): print x 调用函数:给出函数名和一小对括号,并放入所需参数: #!/usr/bin/env pythonimport httplibdef check_web_server(host,port,path): h=httplib.HTTPConnection(host,port) h.request('GET',path) resp=h.getresponse() print 'Http

Python函数返回值实例分析

  本文实例讲述了Python的函数返回值用法.分享给大家供大家参考.具体分析如下: 最近学一些Python的基本用法,看到定义函数,发现似乎只能返回一个返回值,想想matlab里返回多个返回值多方便啊,网上查了查,看到有返回多个值的方法. python 函数返回值有两种形式: 1 返回一个值. 2 返回多个值. 现看看返回一个值的吧. ? 1 2 3 4 def firstvalue(a,b): c = a + b return c print firstvalue(1,2) #结果:3 再看

python函数装饰器用法实例详解

  本文实例讲述了python函数装饰器用法.分享给大家供大家参考.具体如下: 装饰器经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计, 有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #! coding=u

关于python input方法的使用

问题描述 关于python input方法的使用 在python程序中定义了一个方法a(x)然后使用了input方法用户输入了a(x)此时input返回的是一个字符串要怎么样将这个字符串转换成命令来执行函数a呢? 解决方案 def a(x): ...x=...b=input()eval(b)