Py编程方法,尾递归优化,map函数,filter函数,reduce函数
函数式编程
1.面向过程
把大的问题分解成流程,按照流程来编写过程2.面向函数
面向函数编程=编程语言定义的函数+数学意义上的函数先弄出数学意义上的方程式,再用编程方法编写这个数学方程式
注意面向函数的是不能在函数内进行赋值操作的,有赋值操作的全部是面向过程的方法
示例(函数式编程是直接传递函数,把函数作为参数传给另一个参数,不用赋值操作)
def foo(n): print(n) def bar(name): return('my name is %s' %name) foo(bar('abc'))
高阶函数定义:函数接收的参数是一个函数名 或者 返回值中包含函数
3.面向对象
尾递归的优化:
由于函数是要等此部分函数执行完成后才会释放前面那部分函数所占用的内存。递归如果没有终止条件,不断调用时将会导致前面每次的调用的内存无法被释放,撑爆内存。
比如
def test(): print('1111') test() print('1111')
可以看见调用递归步骤的那一步并不是结尾句,下一步还有print111,因此函数没有结束
将会导致上一次递归的内存无法被释放,然后会撑爆内存因此要用尾调用
尾调用:在函数的最后一步来调用下一次递归,注意尾调用return的必须是原函数
map函数
针对将1,5,10这三个数需要将他们取平方num_l=[1,5,10] ret=[] for i in num_l: ret.append(i**2) print(ret)
对其进行函数的封装:
num_l=[1,5,10] def map_test(arry): ret=[] for i in num_l: ret.append(i**2) return ret readback=map_test(num_l) print(readback)
以上的方法过于冗长,因此介绍内置函数map()
写法map(处理方法,一个可迭代对象(比如说列表))map会把可迭代对象里面的值一个一个拿出来然后用前面的处理方法来处理
num_l=[1,5,10] res= map(lambda x:x**2,num_l) for i in res: print(i) #或者直接将它使用list变成一个数组 num_l=[1,5,10] res= map(lambda x:x**2,num_l) print(list(res))
filter函数
场景任务:有几个人,找出其中不是sb的人moviel=['sbalex','sb2','sb3','aaab'] ret=[] for i in moviel if not i.stratswith('sb') ret.append(i) print(ret)
可以用filter函数优化,主要用于筛选对象
filter写法:filter(处理方法然后逻辑判断,可迭代对象(可以是列表))将可迭代对象里面的每一个逐个放出来进行方法处理然后逻辑判断,如果逻辑判断之后
是true的保留,不是true的不保留
moviel=['alex','sb1','sb2','sb3'] res=filter(lambda n:n.startswith('sb'),moviel) print(list(res))
示例2:
将列表里的千年王八万年龟人去除掉
people=[ {'name':'alex','age':1000}, {'name':'wupeiqi','age':10000}, {'name':'yuanhao','age':9000}, {'name':'zqh','age':18} ] print(list(filter(lambda p:p['age']<=999,people)))
reduce函数
场景任务:把[1,2,3,100]里面的数字乘起来。
num=[1,2,3,100] def multi(x,y): return x*y def reduce_test(func,array): res=1 for num in array: res=func(res,num) return res print(reduce_test(multi,num))
可以使用reduce函数来进行优化
reduce作用,可以将一大堆数据压缩到一起(合并序列),得到一个最终的结果。
使用时需要先进行导入from functools import reduce
示例:
from functools import reduce numl=[1,2,3,100] print(reduce(lambda x,y:x+y,numl))

浙公网安备 33010602011771号