python--004--函数(匿名函数、高阶函数)

1. 匿名函数:

print(lambda x:x+1)
func = lambda x:x+1
print(func(10))

name = "wendy"
func=lambda x:x+'_max'
res=func(name)
print('匿名函数运行的结果',res)

lambda 一般不把它赋值给变量,lambda x:x+'_max',一般直接和其他函数一起用,上面用法只是举例解释,匿名函数单独是如何用和运行的

lambda返回多个值:

# lambda 返回多个值
f = lambda x,y,z:(x+1,y+1,z+1)
print(f(1,2,3)

 

 

2. 编程的方法论:

面向对象

面向过程:将一个大的问题分解成小的问题
函数式编程:函数式=编程语言定义的函数+数学意义的函数

  结合数学模型 y = 2*x+1
  def cal(x):
    return 2*x+1

函数式编程可读性差,python不是严格意义上的函数式编程语言
hashell、clean erlang 纯函数式编程的语言

1.1 函数式编程尾递归调用优化

特征: 1.不可变数据  2.第一类对象  3.尾调用优化(尾递归)

  eg1:不可变:不用变量保存状态,不修改变量

#非函数式 ,函数体中可能存在global等,或是赋值的操作
a = 1
def incr_test1():
    global a
    a +=1
    return a
incr_test1()
print(a)
# 函数式
n = 1
def incr_test2(n):
    return n+1
print(incr_test2(2))
print(n)

 

eg2: 第一类对象:函数即“变量”
1.函数名可以当作参数传递
2.返回值可以是函数名

 

高阶函数,满足下列两个条件之一,就是高阶函数
1)把函数当作参数传给另一个函数

2)返回值中包含函数

#1)把函数当作参数传给另一个函数
def foo(n):
    print(n)
def bar(name):
    print('my name is %s'%name)

foo(bar)
foo(bar('wendy'))


-------
#2)返回值中包含函数
def bar():
    print('from bar')
def foo():
    print('from foo')
    return bar
n = foo()
n()

def test1():
    print('from test1')

def test2():
    print('from test2')
    return test1()    # 这相当于将test1的返回值拿来return

 

eg3: 尾调用:在函数的最后一步调用另一个函数(最后一行不一定是函数的最后一步)

  调用后,该函数已经执行完,不需要等待执行结果,优化递归中要等待结果导致栈溢出

# 函数bar在foo内为尾调用
def bar(n):
    return n
def foo(x):
    return bar(x)

# 函数bar在foo内为非尾调用
def bar(n):
    return n
def foo(x):
    return bar(x)+1

# 函数bar在foo内为非尾调用
def bar(n):
    return n
def foo(x):
    y = bar(x)
    return y

 

 

posted @ 2019-03-24 12:32  会长大的  阅读(210)  评论(0编辑  收藏  举报