一、分类

当下主流的编程方法大体分为三类

1. 面向过程

2. 函数式

3. 面向对象

二、函数式编程:函数式 = 编程语言定义的函数 + 数学意义的函数

特征:1. 不可变数据

   2. 第一类对象

3. 尾调用优化(尾递归)

例一、不可变:不用变量保存状态,不修改变量

#非函数式

a = 1
def test1():
global a
a += 1
return a
b = test1()
print(b)

#函数式

n = 1
def test2(n):
return n + 1
print(test2(2))
print(n)例

例二、第一类对象:函数即变量

1. 函数名可以当作参数传递

2. 返回值可以是函数名

def foo(n):
print(n)
def bar(name):
print('my name is %s'%name) foo(bar('dabai'))

def handle():
print('from hamdle')
return handle
h = handle()
h()
print(h) #打印handle的内存地址

def test1():
print('from test1')
def test2():
print('from test2')
return test1() #return了test1的返回值 a = test2()
print(a)

三、尾调用优化

尾调用的关键就在于是在函数的最后一步去调用别的函数,那么在最后一步调用有何好处,根据函数即变量的定义,定义a 函数,a 内调用函数b,b内调用函数c,在内存中会形成一个调用记录,又称调用帧(call frame),用于保存调用位置和内部变量等信息,即a-->b-->c,直到c返回结果给b,c的调用记录才会消失,b返回给a,b的调用记录消失,a返回结果,a的调用记录消失,所有的调用记录都是先进后出,形成一个调用栈(call stack)

尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用记录,因为调用位置、内部变量等信息都不会再用到了,只要直接用内层函数的调用记录,取代外层函数的调用记录就可以了。

def bar(n):
return n
def foo(x):
return bar(x)
print(foo(3))

#foo(3)就等于bar(3),也就是说,foo在最后一步调用了bar,然后foo的调用记录就清除了,

剩下得就是bar自己得事情了,所有内存里永远只保留一个调用记录

#函数bar在foo内为非尾调用

def bar(n):
return n
def foo(x):
y = bar(x)
return y
a = foo(3)
print(a)

#函数bar在foo内为非尾调用

def bar(n):
return n
def foo(x):
return bar(x) + 1
a = foo(3)
print(a) 

由递归转化为尾递归:

下面代码是一个阶乘函数,计算n的阶层,最多需要保留n个调用记录

def fact(n):
if n == 1:
return n
return n * fact(n - 1) print(fact(5))

#如果改为尾递归,只保留一个记录

def fact(n, m):
if n == 1:
return m
return fact(n - 1 , n * m)
print(fact(5, 1))

python课堂整理14---函数式编程的更多相关文章

  1. python【6】-函数式编程

    一.高阶函数 map,reduce 1.map() 函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. def f(x): retur ...

  2. Python入门笔记(21):Python函数(4):关于函数式编程的内建函数

    一.关于函数式编程的内建函数 apply()逐渐被舍弃,这里不讨论 1.filter() #filter(func,seq) """纯Python描述filter函数&q ...

  3. Python修饰器的函数式编程

    Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都 ...

  4. 小白的Python之路 day3 函数式编程,高阶函数

    函数式编程介绍   函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的 ...

  5. python的高阶函数式编程

    首先   函数式编程≠函数编程,就跟计算机≠计算,因为计算机基于硬件,计算基于算法,所以函数式编程是倾向于算法. 高阶函数定义: 一个函数接受的这个参数,而这个参数也是一个函数,称之为高阶函数 例如: ...

  6. python中函数与函数式编程(一)

    在学习之前,我们先去区分面对对象.面对过程.函数式编程他们之间的区别,从改图可以看出,他们之间不是完全相同的,也不是没有任何相同点的 1.函数和过程的基本认识 def func1(): "& ...

  7. Python学习(20):Python函数(4):关于函数式编程的内建函数

    转自http://www.cnblogs.com/BeginMan/p/3178103.html 一.关于函数式编程的内建函数 apply()逐渐被舍弃,这里不讨论 1.filter() #filte ...

  8. python笔记三:函数式编程

    1.概念: 函数式编程就是一种抽象程度很http://i.cnblogs.com/EditPosts.aspx?opt=1高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要 ...

  9. Python修饰器的函数式编程(转)

    From:http://coolshell.cn/articles/11265.html 作者:陈皓 Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Desi ...

随机推荐

  1. ThreadLocal使用原理、注意问题、使用场景

    想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码 ...

  2. 使用ln -s解决库冲突的问题

    1. linux系统下软连接ln -s的使用方法: 软连建立:ln  -s  源文件 软链接文件 对源文件创建软连接文件,举例说明 举例: 当前目录是/local,而我经常要访问/usr/local/ ...

  3. ZooKeeper学习之路(四)—— Java 客户端 Apache Curator

    一.基本依赖 Curator是Netflix公司开源的一个Zookeeper客户端,目前由Apache进行维护.与Zookeeper原生客户端相比,Curator的抽象层次更高,功能也更加丰富,是目前 ...

  4. Python将pyc转为py

    安装pip install uncompyle2, 使用uncompyle2 xxx.pyc > xxx.py

  5. 苹果二代TWS无线耳机AirPods调研

    产品介绍 苹果AirPods二代自从2018年9月份上市以来,到现在将近一年的时间了,据江湖传闻,苹果AirPods的总售卖个数,已经超过了5000W部,这样价格的TWS耳机,能够卖那么多的量,估计也 ...

  6. JavaScript-倒计时效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. scrapy实战7爬取搜狗微信:

    爬取微信热门文章标题,内容,内容地址,微信公众号,公众号地址,发布日期等 如图 源码地址:https://github.com/huwei86/sougouweixin

  8. Python题整理

    1.Python的多态.鸭子类型? 2.Python的序列化工具有哪些? 3.Python处理Excel的工具有哪些? 4.Python处理Graph的算法库有哪些? 5.Python的dict是基于 ...

  9. find文件删除

    find /root/title/test -type f -name '*.txt' -exec rm {} \;   查找并删除test文件夹下所有txt文件 find /root/title/t ...

  10. 玩转SpringBoot之整合Mybatis拦截器对数据库水平分表

    利用Mybatis拦截器对数据库水平分表 需求描述 当数据量比较多时,放在一个表中的时候会影响查询效率:或者数据的时效性只是当月有效的时候:这时我们就会涉及到数据库的分表操作了.当然,你也可以使用比较 ...