一、分类

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

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. js一道面试题

    题目是这样的,按照以下函数的结果写一个sub()方法: sub(1)(2)(3);/*return 6*/ sub(4)(3)(3);/*return 10*/ 我的山寨做法: function su ...

  2. shell多线程

    a='a1' b='b1' c='c1' d='d1' e='e1' ARR=($a $b $c $d $e) rd=`date +%N` for i in ${ARR[*]} do { ;>& ...

  3. 使用 Gitlab CI/CD 实现自动化发布站点到 IIS

    说明 这里先介绍下两个东西 CI/CD.GitLab Runner,当然在此之前你需要对 git 有所了解,关于 git 这里不做说明,可以自行百度. 首先介绍 CI/CD :随着我们开发方式的转变, ...

  4. 关于CORS 应该注意的几点

    前言 对于跨域,随着w3c的CORS的出现,相比较于有些年头的jsonp,CORS以其简单安全,支持post的优势越来越收到大家的欢迎.具体如何CORS的原理和实现,直接推荐阮老师的文章,十分详细.本 ...

  5. Spring Boot:使用Memcached缓存

    综合概述 Memcached是一个自由开源的,高性能,分布式内存对象缓存系统.Memcached基于内存的key-value存储,用来存储小块的任意数据,这些数据可以是数据库调用.API调用或者是页面 ...

  6. 一篇文章概括 Java Date Time 的使用

    本文目的:掌握 Java 中日期和时间常用 API 的使用. 参考:Jakob Jenkov的英文教程Java Date Time Tutorial 和 JavaDoc 概览 Java 8 新增 AP ...

  7. 系统学习 Java IO (一)----输入流和输出流 InputStream/OutputStream

    目录:系统学习 Java IO ---- 目录,概览 InputStream 是Java IO API中所有输入流的父类. 表示有序的字节流,换句话说,可以将 InputStream 中的数据作为有序 ...

  8. .Net之使用Jquery Ajax通过FormData对象异步提交图片文件到服务端保存并返回保存的图片路径

    前言: 首先对于图片上传而言,在我们的项目开发中可以说出现的频率是相当的高的.这篇文章中,我将要描述的是在我们.Net中如何使用Jquery Ajax通过FormData对象异步提交图片文件到后台保存 ...

  9. MAC iterm2 常用快捷键大全

    标签 新建标签:command + t 关闭标签:command + w 切换标签:command + 数字 / command + 左右方向键 切换全屏:command + enter 查找:com ...

  10. BFS(一):广度优先搜索的基本思想

    广度优先搜索BFS(Breadth First Search)也称为宽度优先搜索,它是一种先生成的结点先扩展的策略. 在广度优先搜索算法中,解答树上结点的扩展是按它们在树中的层次进行的.首先生成第一层 ...