您的位置:首页 > 编程语言 > Python开发

【Python学习】python学习手册--第十九章 函数的高级话题

2018-03-19 13:47 567 查看

函数设计概念

耦合性:对于输入使用参数并且对于输出使用return语句。一般来讲,要降低模块或函数之间的耦合性,通常是通过参数和return语句来隔离依赖,降低耦合性

耦合性:只有在真正必要的情况下使用全局变量。全局变量通常是在必要的情况下使用,大量使用全局变量增加了依赖性,导致调试和编程困难。

耦合性:不要改变可变类型的参数,除非调用者希望这样做

聚合性:每一个函数都应该有一个单一的,统一的目标。函数目标越单一,函数的可用性就越高。

大小:每一个函数应该相对较小

耦合性:避免直接改变在另一个模块中的变量

递归函数

简单的递归函数有个特定就是在函数的内部,总会调用函数本身。它允许程序遍历任意的,不可预知的形状数据结构。递归甚至是简单的循环和迭代替换。递归在内存空间和执行时间方面效率较低。

对于一些线性迭代我们通常使用for循环语句,而对于一些任意结构的处理,for循环就无法处理,这时就要考虑用递归函数。

函数对象

函数是在Python中属于是一种对象类型,可以被赋值或引用,可以赋值给另外一个变量名,可以返回,可以嵌入数据结构等等,总之函数支持一系列python对象所支持的操作,甚至可以把函数对象的内容填入到数据结构中。函数名特别之处就在于,函数名后跟上括号,括号中包含有参数列表,这样的可以实现函数的调用操作。Python的通用对象模式和无须类型声明使得该编程语言有了令人惊讶的灵活性。

由于函数是一个对象,而常用的调用和定义只是该对象很常用的两个操作,函数还提供了内省工具来允许我们探索函数实现细节。可以使用dir来查看函数内部其它属性或方法。

可以直接利用class.object=value的方式来对函数的属性直接赋值或创建。属性与对象相关而不是作用域,但是直接效果是类似的。

Python3.0中的函数注解

在Python3.0上,也可以给函数对象附加注解信息,与函数的参数和结果相关的任意的用户自定义的数据。这完全是可选的,在程序中不做任何事情,出现注解时,只是附加到函数的__annotations__属性以供其它用户使用。

>>> def func(a,b,c): return a+b+c
...
>>> func.__annotations__
{}  #注解为空
>>> def func(a:'lxm',b:'lxm2',c:'lxm3') -> int: return a+b+c
...
>>> func.__annotations__
{'b': 'lxm2', 'a': 'lxm', 'return': <class 'int'>, 'c': 'lxm3'} #注解存储在属性中
>>>


注解只出现在def语句中,在lambda语句中无效。

匿名函数lambda

除了def语句之外,Python还提供了一种生成函数对象的表达形式,lambda返回一个函数对象,而不是将函数对象赋值给一个变量名。lambda常常以一种行内进行函数定义的形式使用,或者用作推迟执行一些代码。

lambda的一般表达形式:

lambda argument1,argument2,argument3,…argumentN:expressing using arguments

lambda是表达式,而不是语句,只因为如此,lambda可以出现def语句无法使用的地方,作为一个lambda表达式,它返回了一个值(新的函数),可以选择性的赋值给一个变量名。相反def语句总是在函数头部,把函数对象赋值给一个变量名。

lambda的主题是一个单个的表达式,而不是一个代码块。lambda简单的就好像在def的代码块中只有return语句一样。因为lambda是表达式而不是语句,在它内部不会有复杂的逻辑,连if语句都不会存在,lambda表达式只是为编写简单的函数而设计。

>>> f=lambda x,y,z:x+y+z
>>> f
<function <lambda> at 0x7fc4542f2048>
>>> f(1,2,3)
6
>>>


lambda起到了一种函数速写的作用,允许在使用的代码嵌套入一些简单的函数设定。相比def语句而言,针对很简单逻辑的函数,lambda表达式,提供一种更简介的编码体验。

lambda定义函数只限于表达式,这样编写出来的代码会比较简单而易读。简洁优于复杂,明确优于晦涩。

在序列中映射函数:map

map函数可以对序列(可迭代对象)中的每一个元素应用于被传入的函数,并且返回一个由所有返回值组成的列表(在python3.0中,map函数是返回一个可迭代的map对象):

>>> f=lambda x : x+10
>>> l=[1,2,3,4,5]
>>> map(f,l)
<map object at 0x7fc4542f4d68>
>>> list(map(f,l))          #对每一个l中的元素都应用了f函数,并且将返回值组成一个可迭代的map对象
[11, 12, 13, 14, 15]
>>>


map还有一些性能方面的优势,它会比自己编写for循环更快一些。它是对每个元素应用一个函数对象而不是表达式,这就与列表解析有明显的区别。但是在某些情况下,map函数比列表解析运行起来更快,并且它所编写的代码较少。

函数式编程工具:filter和reduce

filter函数可以对一些迭代对象中的元素实行一个返回True或False的函数并返回执行函数后为True的元素。

>>> f=lambda x : x>0      #传入参数大于零会返回True
>>> l=list(range(-5,5))
>>> filter(f,l)
<filter object at 0x7fc4542f4d68>
>>> list(filter(f,l))   #将返回值为True的元素都输出为可迭代的对象
[1, 2, 3, 4]
>>>


在Python3中reduce函数位于functools模块中,它接收一个迭代器,返回一个单一的结果。

>>> from functools import reduce
>>> l=[1,2,3,4,5]
>>> reduce(lambda x,y: x+y, l)
15
>>>


reduce每一步从迭代器中取一个元素和上一次执行函数后的结果,将两者相加,最后迭代完成后,返回单一结果

小结

本章内容介绍了Python函数设计思想,讲解了Python中的函数对象,介绍了函数方面一些高级的函数工具filter,map,reduce。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: