介绍:
当下主流的编程方法有三种:函数式,面向过程,面向对象,三者相当于编程界的三个门派,每个门派有自己的独门秘籍,都是用来解决问题的。三种流派都是一种编程的方法论,只不过是各自的风格不同,在不同的应用场景下也各有优势。
一:函数式编程:函数式=编程语言定义的函数+数学意义的函数
通俗来讲,函数式就是用编程语言去实现数学函数。这种函数内对象是永恒不变的,要么参数是函数,要么返回值是函数,没有for和while循环,所有的循环都由递归去实现,无变量的赋值(即不用变量去保存状态),无赋值即不改变。
y = 2*x+1def cal(x): return 2*x+1
特征:
1.不可变数据
2.第一类对象
3.尾调用优化(尾递归)
例一:不可变:不用变量保存状态,不修改变量
#非函数式ta=1def incr_test1(): global a a+=1 return aincr_test1()print(a)#函数式n = 1def incr_test2(n): return n+1print incr_test2(2)print(n)
例二:第一类对象:函数即“变量”
1.函数名可以当参数传递
def foo(n): print(n)def bar(name): print('my name is %s' %name)foo(bar('丢丢'))
2.返回值可以是函数名
def bar(): print('from bar')def foo(): print('from foo') return barn = foo()n()
例三:尾调用:在函数的最后一步调用另外一个函数(最后一行不一定是函数的最后一步)
#函数在bar内为尾调用def bar(n): return ndef foo(x): return bar(x)#函数在bar1和bar2在foo内均为尾调用,二者在if判断条件不同的情况下都有可能作为函数的最后一步def bar1(n):return ndef bar2(n):return n+1def foo(x): if type(x) is str: return bar1(x) elif type(x) is int: return bar2(x)#函数bar在foo内为非尾调用def bar(n): return ndef foo(x): y=bar(x) return y#函数bar在foo内尾非尾调用def bar(n): return ndef foo(x): return bar(x)+1
高阶函数(满足下列条件之一即为高阶函数)
1.函数的传入参数是一个函数名
2.函数的返回值是一个函数名
map函数:依次处理列表每一个元素,得到结果是一个‘列表’,该‘列表’元素个数及位置与原来列表顺序一样
1 array=[1,3,4,71,2] 2 3 ret=[] 4 for i in array: 5 ret.append(i**2) 6 print(ret) 7 8 #如果我们有一万个列表,那么你只能把上面的逻辑定义成函数 9 def map_test(array):10 ret=[]11 for i in array:12 ret.append(i**2)13 return ret14 15 print(map_test(array))16 17 #如果我们的需求变了,不是把列表中每个元素都平方,还有加1,减一,那么可以这样18 def add_num(x):19 return x+120 def map_test(func,array):21 ret=[]22 for i in array:23 ret.append(func(i))24 return ret25 26 print(map_test(add_num,array))27 #可以使用匿名函数28 print(map_test(lambda x:x-1,array))29 30 31 #上面就是map函数的功能,map得到的结果是可迭代对象32 print(map(lambda x:x-1,range(5)))33 34 35 #终极版本36 37 num_l = [2, 5, 9, 8]38 def map_test(func, array):39 40 ret = []41 for i in num_l:42 res = func(i)43 ret.append(res)44 return ret45 46 47 print(map_test(lambda x:x+1,num_l))
filter函数:遍历序列中每个元素,判断每个元素布尔值,如果是True则留下来
people = [ { 'name':'huanhuan','age':500}, { 'name':'diudiu','age':500}, { 'name':'haha','age':5}, ]print(list(filter(lambda p:p['age']<=18,people)))
#课堂上集聚了一群打游戏的同学,找出他们class_people=['yunlai','lvzhi','lianhua','yx_longtao','yx_wukequn','yx_zhiying']def tell_yx(x): return x.startswith('yx')def filter_test(func,array): ret=[] for i in array: if func(i): ret.append(i) return retprint(filter_test(tell_yx,class_people))#函数filter,返回可迭代对象print(filter(lambda x:x.startswith('yx'),class_people))print(list(filter(lambda x:x.startswith('yx'),class_people)))
reduce函数:处理一个序列,然后把序列进行合并操作
# 求和num_l=[2,5,6,9,14,56]res = 0for num in num_l: res+=numprint(res)# 函数形式num_l=[1,6,9,15,100]def reduce_test(array): res=0 for num in num_l: res += num return resprint(reduce_test(num_l))# 乘积num_l=[2,6,5]def reduce_test(func,array): res=1 #程序容易写死 for num in array: res=func(res,num) return resprint(reduce_test(lambda x,y:x*y,num_l))# 方法二:num_l = [2, 6, 5]def reduce_test(func, array): res = array.pop(0) for num in array: res = func(res, num) return resprint(reduce_test(lambda x, y: x * y, num_l))# 支持用户自己传入初始值num_l = [2, 6, 9, 15]def reduce_test(func, array, init=None): if init is None: res = array.pop(0) else: res=init for num in array: res = func(res, num) return resprint(reduce_test(lambda x, y: x * y, num_l, 100))#reduce 函数def reduce_test(func, array, init=None): if init is None: res = array.pop(0) else: res=init for num in array: res = func(res, num) return resfrom functools import reducenum_l = [2, 6, 9, 15]print(reduce(lambda x,y:x*y,num_l,100))
总结