函数与函数式编程
1 函数
函数定义:函数是逻辑结构化和过程化的一种编程方法。
函数式编程定义:先定义一个数学函数,然后按照这个数学模型用编程语言去实现它。
过程定义:过程就是简单特殊没有返回值的函数。
函数式编程实现的目的:可以使程序员写出更为精确和高效的代码。
函数式编程的优势:在以函数式风格写代码时,函数应该设计成没有其他副作用。函数接收参数并生成输出而不保留任何状态或修改任何不反映在返回值中的值。这种理想方式的函数可以被当成纯函数式函数。
非纯函数:
def test1(mylist):
mylist.pop(-1)
纯函数:
def test2(mylist):
return mylist[:-1]
Python中函数定义方法:
def test(x): #def 定义函数的关键字,test是函数名,()内可定义形参
“the function definitions” #文档描述
x+=1 #泛指代码块或程序处理逻辑
Return x #定义返回值
函数优势:
1、代码可重用
2、保持一致性
3、可扩展性
- 生成器
生成器(generator)是对象,在每次调用它的next()方法时返回一个值,直到它抛出StopIteration。
操作:创建一个生成器,只需要写一个普通的包含yield语句的python函数。
原理:python检测对yield的使用并将这个函数标识为一个生成器,当函数执行到yield语句时,它会像return语句那样返回一个值。
与return的区别:生成器会保存对栈的引用,它将被用来在下一次调用next函数时恢复函数的执行。
PS:当一个函数或过程没有返回值的时候,python解释器会默认返回为None.
- 列表解析
列表解析(list comprehension,简称listcomp):可以通过声明在单行内构造列表的内容。
没有列表解析的情况:
>>>x=[]
>>>for i in (1,2,3)
... x.append(i)
...
>>>x
[1,2,3]
使用列表解析的实现
>>>x=[i for i in (1,2,3)]
>>>x
[1,2,3]
可以同时使用多条for语句并使用if语句过滤元素:
x=[word.capitalize()
for line in (“hello world?”,”world”,”or not”)
for word in line.split()
If not word.startswith(“or”)
]
>>>x
[‘hello’,’world?’,’world!’,’Not’]
列表解析的目的:快速定义列表的简洁方式。
构建字典和集合:
>>>{x:x.upper() for x in [‘hello’,’world’]}
{‘world’:’WORLD’,’hello’:’HELLO’}
>>>{x.upper() for x in [‘hello’,’world’]}
set([‘WORLD’,’HELLO’])
3 函数式,函数的,函数化
map(function,iterable)返回可迭代的map对象 。
>>>map(lambda x:x+”bzz!”,[“I think”,”I’m good”]
<map object at 0x7fe7101abdd0>
>>>list(map(lambda x:x+”bzz!”,[“I think”,”I’m good”])
[“I thinkbzz”,”I’m goodbzz”]
Filter(function or None,iterable)对iterable中的元素应用function对返回结果进行过滤,并再python3中返回可迭代的filter对象。
>>>filter(lambda x:x.startswith(“I”),,[“I think”,”I’m good”])
<filter object at 0x7f9a0d36dd0>
>>>list(filter(lambda x:x.startswith(“I”),,[“I think”,”I’m good”]))
PS:生成器和列表解析实现与filter或者map等价的函数