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

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

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
(0)

相关推荐

  • Python函数可变参数定义及其参数传递方式实例详解

    本文实例讲述了Python函数可变参数定义及其参数传递方式.分享给大家供大家参考.具体分析如下: python中 函数不定参数的定义形式如下: 1.func(*args) 传入的参数为以元组形式存在args中,如: def func(*args): print args >>> func(1,2,3) (1, 2, 3) >>> func(*[1,2,3]) #这个方式可以直接将一个列表的所有元素当作不定参数 传入(1, 2, 3) 2.func( **kwargs)

  • 详细介绍Python函数中的默认参数

    import datetime as dt def log_time(message, time=None): if time is None: time=dt.datetime.now() print("{0}: {1}".format(time.isoformat(), message)) 最近我在一段Python代码中发现了一个因为错误的使用默认参数而产生的非常恶心的bug.如果您已经知道关于默认参数的全部内容了,只是想嘲笑一下我这可笑的错误,请直接跳到本文末尾.哎,这段代码是我

  • 实例讲解python函数式编程

    函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是"怎么干",而函数函数式编程的思考方式是我要"干什么". 至于函数式编程的特点暂不总结,我们直接拿例子来体会什么是函数式编程. lambda表达式(匿名函数): 普通函数与匿名函数的定义方式: 复制代码 代码如下: #普通函数def add(a,b):    return a + b print add(2,3) #匿名函数add = lambda a,b : a + bprint a

  • Python中特殊函数集锦

    以下内容主要针过滤函数filter , 映射和归并函数map/reduce , 装饰器@ 以及 匿名函数lamda,具体内容如下: 1. 过滤函数filter 定义:filter 函数的功能相当于过滤器.调用一个布尔函数bool_func来迭代遍历每个列表中的元素:返回一个使bool_func返回值为true的元素的序列. 复制代码 代码如下: a=[0,1,2,3,4,5,6,7] b=filter(None, a) print b 输出结果:[1, 2, 3, 4, 5, 6, 7] 回到顶

  • 初学Python函数的笔记整理

     定义 返回单值 def my_abs(x): if x >= 0: return x else: return -x 返回多值 返回多值就是返回一个tuple import math def move(x, y, step, angle=0): nx = x + step * math.cos(angle) ny = y - step * math.sin(angle) return nx, ny 空函数 def nop(): pass 指定默认参数 必选参数在前,默认参数在后.默认参数需指向

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

    在任何编程语言中,函数的应用主要出于以下两种情况: 1.代码块重复,这时候必须考虑用到函数,降低程序的冗余度 2.代码块复杂,这时候可以考虑用到函数,增强程序的可读性 当流程足够繁杂时,就要考虑函数,及如何将函数组合在一起.在Python中做函数设计,主要考虑到函数大小.聚合性.耦合性三个方面,这三者应该归结于规划与设计的范畴.高内聚.低耦合则是任何语言函数设计的总体原则. 1.如何将任务分解成更有针对性的函数从而导致了聚合性 2.如何设计函数间的通信则又涉及到耦合性 3.如何设计函数的大小用以

  • Python编程应用设计原则详解

    目录 1.单一职责原则 SRP 2.开闭原则 OCP 3.里氏替换原则 (LSP) 4.接口隔离原则 (ISP) 5.依赖反转原则 (DIP) 最后的话 写出能用的代码很简单,写出好用的代码很难. 好用的代码,也都会遵循一此原则,这就是设计原则,它们分别是: 单一职责原则 (SRP) 开闭原则 (OCP) 里氏替换原则 (LSP) 接口隔离原则 (ISP) 依赖倒置原则 (DIP) 提取这五种原则的首字母缩写词,就是 SOLID 原则.下面分别进行介绍,并展示如何在 Python 中应用. 1.

  • python面向对象编程设计原则之单一职责原则详解

    目录 一,封装 (一)什么是封装 (二)封装与访问 (三)私有化与访问控制 1,属性与方法的私有化 2,变量名压缩 3,方法重载 (四)属性引用:getter.setter与property 二,单一职责原则 (一)一个不满足单一职责原则的例子 (二)单一职责原则 三,封装与单一职责原则 总结 一,封装 封装是面向对象编程思想的重要特征之一. (一)什么是封装 封装是一个抽象对象的过程,它容纳了对象的属性和行为实现细节,并以此对外提供公共访问. 这样做有几个好处: 分离使用与实现.可直接使用公共

  • Python基础学习之函数方法实例详解

    本文实例讲述了Python基础学习之函数方法.分享给大家供大家参考,具体如下: 前言 与其他编程语言一样,函数(或者方法)是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. python的函数具有非常高的灵活性,可以在单个函数里面封装和定义另一个函数,使编程逻辑更具模块化. 一.Python的函数方法定义 函数方法定义的简单规则: 1. 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(). 2. 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数. 3.

  • 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指向的是可变对象,

  • 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

  • 用C语言模仿Python函数的一种简单实现方法

    首先得说明一点,C 语言不是函数式编程语言,要想进行完全的函数式编程,还得先写个虚拟机,然后再写个解释器才行(相当于 CPython ). 下面我们提供一个例子,说明 C 语言函数可以"适度地模仿" Python 函数. 我们有如下的 Python 程序: def line_conf(a, b): def line(x): return a*x + b return line line1 = line_conf(1, 1) line2 = line_conf(4, 5) print(l

  • 对python函数签名的方法详解

    函数签名对象,表示调用函数的方式,即定义了函数的输入和输出. 在Python中,可以使用标准库inspect的一些方法或类,来操作或创建函数签名. 获取函数签名及参数 使用标准库的signature方法,获取函数签名对象:通过函数签名的parameters属性,获取函数参数. # 注意是小写的signature from inspect import signature def foo(value): return value # 获取函数签名 foo_sig = signature(foo)

  • Python函数装饰器常见使用方法实例详解

    本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所以我们应该遵循开放封闭的原则. 也就是说:我们必须找到一种解决方案,能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能. 总结:原则如下: 1.不修改源代码 2.不修改调用方式 目的:在遵循1和2原则的基础上扩展新功能. 二.什么是装饰器? 器:指的是工具, 装饰:指的是为被装饰对象添加

  • python 函数内部修改外部变量的方法

    如果内部修改外部变量需要nonlocal,global def f1(): print("in f1..") num=111 def f2(): nonlocal num num=222 print(num) f2() print(num) f1() 以上这篇python 函数内部修改外部变量的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

随机推荐