elike.python.function()
现关于python的函数式编程做出以下总结。
问题一:物理公式里有很多的小公式,一个一个的def太麻烦了,有什么好的解决办法?
应对以上问题,匿名函数是一个方便的工具。python里面匿名函数的关键字是lambda。如下
一个函数为f(x,y)=sin(x+y)+x^y,在python里面可以这样定义
f = lambda x,y : math.sin(x+y)+x**y
使用的时候可以直接拿来用,要知道某个值,就可以直接输入f(a,b),注意这里不是说函数的返回值只能是一个数,也可以是两个数,可以将两个函数和在一起写,如下
ff = lambda x,y : [math.sin(x+y)+x**y, math.e**(x+y)]
由函数里面的返回值,可以看出返回一个list,包含两个值。
问题二:要画图的时候需要的x,y都是一个list,难道非要用for或whiel循环,一个一个地代入函数吗?
这时就需要用映射了,也就是map,数学理论中的一一映射,在c++和java里都有,用法类似。但在python中用法,与数学函数的定义完全一致。只需将原像x[]经过映射关系f,就可以得到像y[]。注意map()的返回值是一个map对象,可以将这个对象放入list中,就能得到所需要的list。
z=list(map(f,x,y))
问题三:对于重复调用一个长函数,为了减少系统占用的资源,只需重复里面的部分片段,怎么办?
可以用返回函数的函数实行嵌套函数,基本思想是,把每次调用时基本不会变的部分放在主函数里,随着函数参数变化而变化的部分在函数内部命名为一个新的内部函数。如下
def shell(a) :
sh=a**a
#there are many other operation, which only depends on a
def kell(b) :
ke=b*a
return ke
return kell
调用的时候注意,由于外部函数返回是一个函数,所以你如果直接写
sf=shell(a)
这里的sf就是一个函数,所以后面再跟一对小括号才能得到ke的值
s=sf(b) #same as s=shell(a)(b)
问题四:在计算的时候,我们经常会在外面用到某个类的函数内的局部变量的值,这时怎么办?
应对此问题的方法,我个人认为直接使用全局变量比较方便。全局变量的关键字是global。
#one.py
a=1
b=0
def apple(s):
global b
b=s+a
t=s**b
return t
#two.py
import one
#use the value of b from one.py
one.apple(2)
b=one.b
##############
注意,如果b的值与函数的参数有关,在调用b之前,必须先运行这个函数,使得全局变量b的值得到改变,要不然b的值是不会变的,始终都是初始值。