# 函数式编程
# 语法都会,但是仍然不会写程序.
# 比如,英语单词和语法达到一定的量之后,就自动说出英语了.
# 不会写程序,还是语法不熟悉.坚持练
# 有的人写代码需要很多行,有的人需要一行就搞定了.
"""
编程的方法论:
# 面向过程
# 函数式
# 面向对象
1)面向过程
大的问题拆分成几部来完成
每一步一步的完成
# 没有返回值的函数
def cal(x):
res = 2*x
res += 1
return res
2)函数式编程
并不是简单的函数封装
函数式 = 编程语言定义的函数+数学意义的函数
先定义数学模型,y=2*x + 1
用python实现上面的数学逻辑.
def cal(x):
return 2*x + 1
代码精简,可读性差
python不是严格意义上的函数式编程语言.
函数式编程语言:hashell clean erlang
3)面向对象
函数式编程有哪些特点?
"""
# 1) 不可变:不用变量保存状态,不修改变量
a = 1
def incr_test1():
global a
a += 1
return a
print(incr_test1())
# 没有变量的定义
# 不修改变量
n = 1
def incr_test2(n):
return n + 1
print(incr_test2(10))
# 2) 第一类变量:函数即"变量"
# 函数可以作为一个参数进行传递
def foo(n):
print(n)
def bar(m):
print("bar" + m)
foo(bar) # print bar函数的地址<function bar at 0x1019ac598>
foo(bar("alex")) # bar函数返回值传给foo None
# 返回值中可以包含函数,可以是自己
def foo():
print("from foo")
return foo
func = foo()
func()
# 也可以是其他任意函数
def bar():
print("from bar")
def foo():
print("from foo")
return bar
func = foo()
func() # from bar
def test1():
return "from test1"
def test2():
return test1()
print(test2()) # from test1
"""
函数接受的参数是一个函数
返回值中可以包含函数,可以是自己,也可以是其他任意函数
满足这两个条件之一就是高阶函数.
"""
# 3) 尾调用:在函数最后一步调用另外一个函数(最后一步不一定是函数的最后一行)
# 最后一步不一定是函数的最后一行
def test(x):
if x > 1:
return True
elif x == 1:
return False
else:
return True
test1()
# bar 在foo内非尾调用
def bar(n):
return n
def foo(x):
return bar(x) + 1 # notes: 这里最后一步并不是调用函数,实际上是两步
# bar 在foo内是尾调用
def bar(n):
return n
def foo(x):
bar(x)
# 尾递归优化,进入递归,上一层递归的状态不进行保存,立马丢弃.因为已经完全执行完了.解决一部分递归效率低的问题(因为递归开辟内存大,需要保存每一层的状态.)
