Python函数设计原则

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

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

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

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

聚合

  • 每个函数只做一件事

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

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

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

大小

  • 保持简单、保持简短

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 s

   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    #局部变量测试结果: 11s

   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
时间: 2024-11-07 13:15:54

Python函数设计原则的相关文章

Python设计模式——设计原则

1.单一职责原则:每个类都只有一个职责,修改一个类的理由只有一个 2.开放-封闭远程(OCP):开放是指可拓展性好,封闭是指一旦一个类写好了,就尽量不要修改里面的代码,通过拓展(继承,重写等)来使旧的类满足新的需求,而不是修改一个类里面的代码. 3.依赖倒转原则:高层模块不应该依赖底层模块,两个都应该依赖抽象:抽象不应该依赖细节,细节应该依赖抽象.底层模块例如很多工具类,例如专门用于管理sql连接的类,管理文件,管理socket连接的类,高层类指具体实现需求的类.高层类和底层类都不应该相互依赖,

js函数设计原则

一般认为函数指具有返回值的子程序,过程指没有返回值的子程序.C++中把所有子程序成为函数,其实那些返回值为void的 函数在语义上也是过程.函数与过程的区别更多是语义上的区别,而不是语法的区别. 语言纯化论者认为一个函数应该只有一个返回值,这和数学函数一样.即函数只接受输入(参数),通过参数运算返回结果. 除此之外的效果被称为函数的副作用,比如修改全局变量. function sum1(x, y) { return x+y }function sum2(x, y) { alert(x+y) }s

第48课 函数设计原则

函数设计原则: 函数应该是无状态的,就是第一次调用和第二次调用是一样的. getchar返回值是int型. 优秀代码欣赏:Eclipse代码 1 /******************************************************************************* 2 * Copyright (c) 2000, 2005 IBM Corporation and others. 3 * All rights reserved. This program a

C之函数设计原则(四十二)

我们今天来讲下函数的设计原则.函数从意义上应该是一个独立的功能模块,函数名要在一定程度上反映函数的功能:函数参数名要能够体现参数的意义,尽量避免在函数中使用全局变量. A.当函数参数不应该在函数体内部被修改时,应加上 const 声明:如果参数是指针,且仅作输入参数,则一个加上 const 声明.例: void str_copy(char *str_dest, const char *str_src): B.不能省略返回值的类型,如果函数没有返回值,则应声明其为 void 类型:对参数进行有效性

python 函数设计概念

耦合性:对于输入使用参数并且对于输出使用return语句 耦合性:只有在真正必要的情况下使用全局变量 耦合性:不可改变类型的参数,除非调用者希望这样做 聚合性:每一个函数都应该有一个单一的统一的目标 每一个函数应该相对较小 耦合:避免直接改变在另一个模块文件中的变量

len(x) 击败 x.len(),从内置函数看 Python 的设计思想

内置函数是 Python 的一大特色,用极简的语法实现很多常用的操作. 它们预先定义在内置命名空间中,开箱即用,所见即所得.Python 被公认是一种新手友好型的语言,这种说法能够成立,内置函数在其中起到了极关键的作用. 举个例子,求字符串 x 的长度,Python 的写法是 len(x) ,而且这种写法对列表.元组和字典等对象也同样适用,只需要传入对应的参数即可.len() 函数是共用的. 这是一种极简哲学的体现:Simple is better than complex. 但是,有些语言并不

Python函数的默认参数的设计【原创】

在Python教程里,针对默认参数,给了一个“重要警告”的例子: def f(a, L=[]): L.append(a) return L print(f(1)) print(f(2)) print(f(3)) 默认值只会执行一次,也没说原因.会打印出结果: [1] [1, 2] [1, 2, 3] 因为学的第一门语言是Ruby,所以感觉有些奇怪. 但肯定的是方法f一定储存了变量L. 准备知识:指针 p指向不可变对象,比如数字.则相当于p指针指向了不同的内存地址. p指向的是可变对象,比如lis

python程序设计——函数设计与调用

一.函数定义与调用 def 函数名([参数列表]): '''注释''' 函数体 # 输出小于n的斐波那契数 >>def fib(n): a,b=1,1 while a < n: print(a,end=' ') a,b=b,a+b print() >>fib(3) 1 1 2 二.形参与实参 在绝大多数情况下,在函数内部直接修改形参的值不会影响实参 def addOne(a): print(a) a+=1 print(a) >>a=3 >>addOne

Python 五、Python函数

一.函数概述 1.函数的基础概念 函数是python为了代码最大程度地重用和最小化代码冗余而提供的基础程序结构. 函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件 函数用于将相关功能打包并参数化 在python中可以创建4种函数: 全局函数:定义在模块中 局部函数:嵌套于其它函数中 lambda(匿名)函数:仅是一个表达式 方法:与特定数据类型关联的函数,并且只能与数据类型关联一起使用 函数和过程的联系:每个Python函数都有一个返回值,默认为None,也可以使用"return