学习路线
1、基础
2、网络编程
3、Web框架:用于写网站
4、设计模式+算法
5、项目阶段
匿名函数
func=lambda x:x+1 #这里x是形参,x+1是返回值
print(func(10))
#匿名函数修改名字的操作
name='alex'
func1=lambda name:name+'_ll'
newname=func1(name)
print(newname)
#匿名函数不该有名字,上边给名字只是便于理解
#匿名函数通常是结合其他函数一起使用
#python返回多个值是自动变成了元祖
#但是匿名函数中要自己加括号
#lambda x,y,z:(x+1,y+1,z+1)
函数式编程
- 定义函数式编程
用编程语言实现数学函数,要么参数是函数,要么返回值是函数,没有for和while循环,所有的循环用递归实现,无变量赋值,即不用变量保存状态。并且使用尾调用优化(即尾递归,在函数的最后一步调用另外一个函数,但最后一行不一定是最后一步)
不修改变量,不用变量保存状态
n=1
def test(n):
return n+1
- 什么是高阶函数
满足下边两个条件之一便是
1)函数的传入参数是一个函数名
2)函数的返回值是一个函数名
#函数式编程
#函数是参数
def foo(n):
print(n)
def bar(name):
print('my name is %s' %name)
foo(bar('alex'))
#返回值是函数,还可以是自己
def foo1():
print('fron foo1')
def bar1():
print('from bar1')
return foo1
def handle():
print('from handle')
return handle
n=handle()
n()
def foo2():
print('from foo2')
def bar2():
print('from bar2')
return foo2() //foo2先运行结束。才运行return
print(bar2())
结果:
from handle
from handle
from bar2
from foo2
None
尾调用
#尾调用
def foo3():
print('from foo3')
foo3() #这种尾调用,第一层执行完进行第二层,但是不用再保存第一层的调用栈了,因为第一层已经结束
def foo4(x):
if x>1:
return 1
else:
return 2 #函数的最后一行不一定是最后一步
print(foo4(2))
map函数
#将函数写活
num_1=[1,6,3,25]
def add_one(x):
return x+1
def map_test(fun,array):
ret=[]
for i in num_1:
res=fun(i)
ret.append(res) #平方
#这样的好处,方法可以更改,函数被写活了,这里fun可以任何数据操作函数
return ret
ret=map_test(add_one,num_1) #这里函数名字可以做参数
print (ret) #更改函数只需更改函数名参数
#加上匿名函数
ret=map_test(lambda x:x+1,num_1) #同样实现了加一的功能
print (ret)
#以上就是python内置函数map的逻辑
#map的处理结果是一个迭代器,且只能迭代一次
res=map(lambda x:x+1,num_1)
#print(list(res)) #是一个迭代的结果,将迭代列表化
for i in res:
print(i)
#so,要知道map的用法,map(处理方法,可迭代对象)
#内部实现将迭代对象的每个值都交给处理方法处理一下
filter函数
#filter函数,并且写活
movie_people=['alex','x_cc_sa','x_rr_sa','aa_sa']
def filter_test(func,array):
res3=[]
for p in movie_people:
if not func(p):
res3.append(p)
return res3
res=filter_test(lambda n:n.endswith('sa'),movie_people)
print(res)
#以上便是filter函数的逻辑
#在python的内置函数中,filter
res1=filter(lambda n:n.endswith('sa'),movie_people)
print(res1) #会返回一个内存地址,和map一样
print(list(res1)) #功能是筛选出满足前边逻辑的值,真才保留
要知道filter函数怎么用,第一个是逻辑函数,第二个是一个可迭代对象,会对这个可迭代对象依次进行遍历将对象中的每一个值用前边的函数处理筛选出布尔值为1的值。
reduce函数
#reduece函数
#python3中被集成到模块中了
num_1=[1,2,3,4,5,6]
def multi(x,y):
return x*y #同样可以写成匿名函数
def reduce_test(fun,array,init=None): #默认参数值,可有可无
if init is None:
res=array.pop(0)
else:
res=init #现将第一个值取出来
for num in array:
res=fun(res,num)
return res
print(reduce_test(lambda x,y:x*y,num_1),100)
#resuce 内置函数
#reduce函数可以把一个可迭代对象压缩成一个结果,类似于大数据中的 map和reduce函数
#map函数仍按照原来顺序打印迭代对象,但是会把其中的每一个值处理一遍
#filter函数将迭代对象的不符合逻辑函数要求的值筛选掉,再打印
#如何用Reduce
from functools import reduce
print(reduce(lambda x,y:x+y,num_1,1))