总结的几个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 :1()
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 :1()
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计算文本有多少rn(2023年最新分享)
python读取TXT内容后怎么计算里面数据?读取的类型为str类型,使用int(txt)函数将其转化为数字,有小数的用float,txt里不能有除数字外的其他字符或者符号,你这种有,的,使用分隔函数split,怎么使用可以百度,分隔之后的为列表或者元组,有几个,就分成几个。如何用python统计文本中重复行的数目?这个...
Python字典中几个常用函数总结
参数:key 字典中要查找的键。default 如果指定键的值不存在时,返回该默认值值。例:dict={'Name':'alex','Age':21} print("Name is:%s"% dict.get('Name')+"\\n"+ "Age is:%d"% dict.get('Age'))显示结果为:Name is:alex Age is:21 2、update() 将一个字典中的值更新...
调用python类中的几个方法,为什么会重复执行第一个
如果在调用Python类中的几个方法时出现了重复执行第一个方法的情况,可能是因为您在调用时没有按照正确的顺序调用或者没有在方法之间正确地添加必要的参数或变量。这可能会导致代码出现逻辑错误,从而导致重复执行某些方法。另外,也有可能是代码中出现了类似于循环或递归的结构,导致重复执行第一个方法。这种...
python要三个条件同时成立,语句怎么写?
在回答这个问题之前先来简单了解一下 Python的import机制。Python在初始化运行环境的时候会预先加载一批内建模块到内存中,这些模块相关的信息被存放在sys.modules中。读者导入sys模块后在Python解释器中输入sys.modules.items()便可显示所有预加载模块的相关信息。当加载一个模块的时候,解释器实际上要完成以下...
python内置函数有多少个(2023年最新解答)
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数function(有两个参数)先对集合中的第1、2个元素进行操作,得到的结果再与第三个数据用function函数运算,最后得到一个结果。Python几个重要的内置函数 在学习Python的过程中,有几个比较重要的内 logo设计 创造品牌价值 ¥500元起 ...
python一个库要学多久(2023年最新分享)
Python开发软件可根据其用途不同分为两种,一种是Python代码编辑器,一种是Python集成开发工具,两者的配合使用可以极大的提高Python开发人员的编程效率。python可以自学吗?大概要学多久?可以自学,一般学习需要几个月左右的时间,Python入门简单,并不代表会一直简单。要学会用Python干活,还需要学习Python的...
python3.10好用吗?
可以将学习Python编程基础。将其分作几个板块进行学习了解,例如了解基本的语法元素,了解编程基本数据类型,了解程序的控制结构,关于函数和代码运用,了解数据的类型等等。将Python基础区域化,更有利于我们掌握和记住编程的相关知识。学习理论往往是不够的,更需要的是实际操作。从编写简单程序,例如建立一个...
python 如何把元组拆成几个包并输出
python把元组拆成几个元组并输出的方法:元组可以用平行赋值的办法来拆分元组的值。例如:元组“a = (2,3)”可以写成“b,c=a”分别输出b,c的值就可以了 示例代码如下:执行结果如下:更多Python知识,请关注:Python自学网!!
python最多能起多少携程?
不是进程越多越好,程序的速度就越快.一般有几个CPU核心,就开多少进程,或者核心数的N倍.python多线程作用总结起来,使用多线程编程具有如下几个优点:进程之间不能共享内存,但线程之间共享内存非常容易。操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。因此,使用多线程...
万字教你如何用 Python 实现线性规划
基本上,当您定义和求解模型时,您使用 Python 函数或方法调用低级库,该库执行实际优化工作并将解决方案返回给您的 Python 对象。 几个免费的 Python 库专门用于与线性或混合整数线性规划求解器交互: 在本教程中,您将使用SciPy和PuLP来定义和解决线性规划问题。 在本节中,您将看到线性规划问题的两个示例: 您...
孛辰布瑞: python内置了很多可以供我们直接调用的函数,这些函数的效率往往都非常高,我们在自己造轮子的同时,也非常有必要了解并且正确使用python给我们提供的大量的内置函数,在前面的博客里面我已经介绍了几个比较常用的函数,这里再介绍几个,它们分别是collections模块下的Counter函数,deque函数以及defaultdict函数.
连山区18054625879: 关于python中几个函数的用法 - ?
孛辰布瑞: 函数调用 myFun()# 函数的参数 # 单个参数 # 场景 # 需要动态的调整函数体中某一个处理信息 # 则可以, 以参数的形式接收到相关数据 # 定义 # def 函数名(参数名称): # 函数体 # 函数体中, 可以直接以变量的方式使用该参数 # 函数的调...
连山区18054625879: python中函数都有哪些简单点的例子零基础 - ?
孛辰布瑞: Python 中,函数的应用非常广泛,比如 input() 、print()、range()、len() 函数等等,这些都是 Python 的内置函数,可以直接使用. 除了可以直接使用的内置函数外,7a686964616fe4b893e5b19e31333431366361Python 还支持自定义函数,即...
连山区18054625879: 请教几个python3.1的函数与方法的用法! - ?
孛辰布瑞: NO.1.insert()是对列表进行操作,insert,顾名思义,插入,在列表中插入,所以insert(i, x)就是在列表的第i个位置之前插入对应的value,这个value就是x,比如:>>> l = [0, 1, 2, 3]>>> l.insert(0, 9)>>> l[9, 0, 1, 2, 3]>>> #这个就是把9插入到l列表...
连山区18054625879: python 最常用的内建函数. - ?
孛辰布瑞: writer = open('/tmp.log', 'a', encoding='utf-8') # 以追加模式打开tmp.log文件,编码为utf-8 writer.write('开始处理...') # 写入内容 writer.write('%(tile)s %(author)s %(size)d %(summary)s' % book) writer.write('处理完毕') writer.flush() # 刷新缓存 writer.close() # 关闭文件
连山区18054625879: python:用递归的方法编写一个函数gys(x,y),计算两个数字的最大公约数. (提示,大的?
孛辰布瑞: 1234567 defgys(x,y): a,b=max(x,y),min(x,y) c=a%b ifc==0: returnb else: returngys(b,c) 不知道行不行 你试试
连山区18054625879: 用python生成随机数的几种方法 - ?
孛辰布瑞: 1 从给定参数的正态分布中生成随机数 当考虑从正态分布中生成随机数时,应当首先知道正态分布的均值和方差(标准差),有了这些,就可以调用python中现有的模块和函数来生成随机数了.这里调用了Numpy模块中的random.normal函数,...
连山区18054625879: 请问这几个公式用Python语言怎么编写? - ?
孛辰布瑞: import math R=1 D=1 n=1 h=1 X=1 Y=1 m=1 M=1 L=1 d=R**(D*n-2*n)*(math.cos(h)-math.cos(((2*math.pi*(R**n))*math.sqrt(X**2+Y**2)*math.cos(math.atan(Y/X)*180/math.pi-(math.pi*m)/M)/L)+h)) print(d)
连山区18054625879: 用python设计一函数,实现输入一个列表,求出列表的总和 - ?
孛辰布瑞: def list_add(a):c = 0for i in range(len(a)):c = c + a[i]return c
连山区18054625879: 我想用Python 编一个1加到100的程序 ,该用什么函数,怎么做? - ?
孛辰布瑞: 一句话搞定,里面用到了2个函数,range是给出1到100,sum是求和. sum(range(1,101))