Python函数式编程
主要内容
1.函数基本语法及特性
2.参数与局部变
3.返回值4.递归
5.名函数6.函数式编程介绍
7.阶函数8.内置函数
函数基本语法及特性
定义
数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的函数。自变量x的取值范围叫做这个函数的定义域。
但编程中的「函数」概念,与数学中的函数是有很同的函数是逻辑结构化和过程化的一种编程方法
函数的优点
减少重复代码
使程序变的可扩展
使程序变得易维护
函数与过程
定义函数
deffun1():#函数名称
"Thefunctiondecription"print("inthefunc1")return0#返回值
定义过程
deffun2(): "Theprogressdecription" print("inthefunc2")
函数与过程过程就是没有返回值的函数但是在python中,过程会隐式默认返回none,所以在python中即便是过程也可以算作函数。
deffun1(): "Thefunctiondecription" print("inthefunc1") return0 deffun2(): "Theprogressdecription" print("inthefunc2") x=fun1() y=fun2() print("fromfunc1returnis%s"%x) print("fromfunc2returnis%s"%y)
结果为:
inthefunc1 inthefunc2 fromfunc1returnis0 fromfunc2returnisNone
返回值
要想获取函数的执结果,就可以return语把结果返回。
函数在执过程中只要遇到return语,就会停执并返回结果,所以也可以解为return语代表着函数的结束,如果未在函数中指定return,那这个函数的返回值为None。
接受返回值
赋予变量,例如:
deftest(): print('inthetest') return0 x=test()
返回什么样的变量值
return个数没有固定,return的类型没有固定。例如:
deftest1(): print('inthetest1') deftest2(): print('inthetest2') return0 deftest3(): print('inthetest3') return1,'hello',['alex','wupeiqi'],{'name':'alex'} deftest4(): print('inthetest4') returntest2 x=test1() y=test2() z=test3() u=test4() print(x) print(y) print(z) print(u)
结果是:
inthetest1
inthetest2
inthetest3
inthetest4
None
0
(1,'hello',['alex','wupeiqi'],{'name':'alex'})
返回值数=0:返回None没有return
返回值数=1:返回objectreturn一个值,python基本所有的数据类型都是对象。
返回值数>1:返回tuple,return多个值。
返回可以返回函数:returntest2会将test2的内存地址返回。
为什么要有返回值?
想要整个函数执行的结果。可能对执行结果进行相关操作。比如登陆,返回true接下来就可以进行其他操作。如果是false则不给操作。
函数参数
形参和实参定义
形参
形式参数,不是实际存在,是虚拟变量。在定义函数和函数体的时候使用形参,目的是在函数调用时接收实参(形参个数,类型应与实参一一对应)。
变量只有在被调时才分配内存单元
实参
实际参数,调用函数时传给函数的参数,可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
区别
形参是虚拟的,不占用内存空间.形参变量只有在被调用时才分配内存单元,,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调函数后,则不能再使该形参变量。
实参是一个变量,占用内存空间,数据传送单向,实参传给形参,不能形参传给实参。
defcalc(x,y):#x,y为形参 res=x**y returnres c=calc(a,b)#a,b为实参 print(c) deftest(x,y):#x,y为形参 print(x) print(y) x=1#x为实参 y=2#y为实参
test(x=x,y=y)#等号左边x,y为形参,等号右边x,y为实参,引用不分顺序,按关键字引用。
默认参数
定义函数的时候,还可以有默认参数。函数的默认参数的作用是简化调用,你只需要把必须的参数传进去。但是在需要的时候,又可以传入额外的参数来覆盖默认参数值。
#定义一个计算x的N次方的函数,默认是2次方 deftest6(x,n=2): s=1 whilen>0: n=n-1 s=s*x print(s) returns test6(2)
默认参数只能定义在必需参数的后面.
可变参数
如果想让一个函数能接受任意个参数,我们就可以定义一个可变参数:
deffn(*args):
printargs
可变参数的名字前面有个*号,我们可以传入0个、1个或多个参数给可变参数:Python解释器会把传入的一组参数组装成一个tuple传递给可变参数,因此,在函数内部,直接把变量args看成一个tuple就好了。
定义可变参数的目的也是为了简化调用。假设我们要计算任意个数的平均值,就可以定义一个可变参数:
defaverage(*args):
...
这样,在调用的时候,可以这样写:
>>>average()
0
>>>average(1,2)
1.5
>>>average(1,2,2,3,4)
2.4
位置参数和关键字
位置参数调用:实参与形参位置一一对应;关键参数调用:位置无需固定。
正常情况下,给函数传参数要按顺序,如果不按顺序就可以用关键参数调用,只需指定参数名即可,但关键参数必须放在位置参数之后。
deftest5(u,v,w): print(u) print(v) print(w) test5(3,w=2,v=6)
函数调用
Python内置了很多有用的函数,我们可以直接调用。
要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,它接收一个参数。
调用abs函数:
>>>abs(-21)
21
调用函数的时候,如果传入的参数数量不对,会报TypeError的错误,并且Python会明确地告诉你:abs()有且仅有1个参数,但给出了两个:
>>>abs(21,8)
Traceback(mostrecentcalllast):
File"/Users/cathy/PycharmProjects/p51cto/day3/func_test3.py",line67,in
abs(21,8)
TypeError:abs()takesexactlyoneargument(2given)
如果传入的参数数量是对的,但参数类型不能被函数所接受,也会报TypeError的错误,并且给出错误信息:str是错误的参数类型:
>>>abs('a')
Traceback(mostrecentcalllast):
File"/Users/cathy/PycharmProjects/p51cto/day3/func_test3.py",line69,in
abs('a')
TypeError:badoperandtypeforabs():'str'
递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
举个例子,我们来计算阶乘n!=1*2*3*...*n,用函数fact(n)表示:
deffact(n): ifn==1: return1 returnn*fact(n-1)
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
嵌套函数
python允许在定义函数的时候,其函数体内又包含另外一个函数的完整定义。
name="test1" defchangeout(): name="test2" defchangeinner(): name="test3" print("changeinner赋值打印",name) changeinner()#调用内层函数 print("外层调用内层打印",name) changeout() print("调用外层打印",name)
内部函数可以访问其外部函数的作用域,但是外部函数不能访问内部函数的作用域。
defchange1(name):
匿名函数
匿名函数就是不需要显式的指定函数
#这段代码defcalc(n):returnn**nprint(calc(10))
#换成匿名函数calc=lambdan:n**nprint(calc(10))
函数式编程
单说,"函数式编程"是一种"编程范式"(programmingparadigm),也就是如何编写程序的方法论。
主要思想是把运算过程尽量写成一系列嵌套的函数调用。
参考页面
http://www.cnblogs.com/alex3714/articles/5740985.html
http://www.imooc.com/code/3516
http://blog.csdn.net/suncherrydream/article/details/51682560
https://www.nhooo.com/article/68314.htm