Python基础-----函数式编程含义及特点(及尾递归)

一、定义    函数式就是用编程语言去实现数学函数。这种函数内对象是永恒不变的,要么参数是函数,要么返回值是函数,没for和while循环所有的循环都由递归去实现,无变量的赋值(即不用变量去保存状态),无赋值即不可改变。二、特点    1、不可变数据        不可变:不用变量保存状态,不修改变量        a. 非函数式            a = 1            def test():                global a                a += 1                return a            test()            print(a)            >>> 2        b. 函数式            n = 1            def test1(n):                return n+1            print(test1(2))            print(n)            >> 3               1    2、第一类对象        第一类对象:函数即变量        a.函数名可以作为参数传递            def a(n):                print(n)            def b(name):                print(‘My name is %s‘%name)            a(b)            >>> 上述调用为:b不带括号则表示b函数的内存地址,将内存地址作为实参传递给a函数,则a函数打印的为b函数的内存地址            a(b(‘Liming‘))            >>> ‘My name is Liming‘                None                上述调用为:首先会执行函数b,则先打印出‘My name is Liming’,但是b函数没有定义返回值,则默认为None            则将None作为实参传递给a函数,则a函数打印出None        b.返回值可以是函数名            def a():                print(‘from a‘)            def b():                print(‘from b‘)                return a            n = b()            n()            >>> ‘from a‘                ‘from b‘    3、尾调用优化(尾递归)        尾调用:在函数的最后一步调用另外一个函数(最后一行不一定是函数的最后一步)        尾调用优化:尾调用的关键就是在于函数的最后一步调用别的函数,这样的好处是:根据函数即‘变量’的定义,    定义a函数,a内调用b函数,b内调用c函数,在内存中会形成一个调用记录,又称调用帧,用于保存调用位置和内部变    量等信息,即a->b->c直到c返回结果给b,c的调用记录才会消失,b返回给a,b的调用记录消失,a返回结果,a的调用    记录消失,所有的调用记录都是先进后出,形成了一个调用栈。尾调用由于是函数的最后一步操作,所以不需要保留外    层函数的调用记录,因为调用位置、内部变量等信息都不会用到了,只要直接用内层函数的调用记录,取代外层函数的    调用记录就可以了。        def bar(n)            return n        def foo(x):            return bar(x)        print(foo(3))        >>> 3        上述foo(3)就等于bar(3),也就是说foo在最后一步调用了bar,然后foo的调用记录就清楚了,剩下的就是bar    自己的事情了。所以内存里永远只保留一个调用记录。

尾递归:函数调用自身成为递归,如果尾调用自身,就成为尾递归。        尾递归特点:重复相同的事情,每次重复会使问题规模减少。        尾递归举例:            问题:师傅,北京怎么去啊?            解决方法:a去问b,b不知道,b去问c,c去问d,最有由d得出结果,此过程可以发现,问题最有只需要d去        结局即可,a b c都无需保存任何记录,不干事,因为他们啥都不知道。        尾递归优点:递归通常非常耗费内存,因为需要同时保存成千上百个调用记录,很容易发生‘栈溢出’错误。    但对于尾递归来说,由于只存在一个调用记录,所以不会发生‘栈溢出’错误。        def cal(l):            print(l)            if len(l) == 1:                return l[0]            first,second,*args = l            l[0] = first + second            l.pop(1)            return cal(l)        x = cal([i for i in range(10)])        print(x)        >>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]            [1, 2, 3, 4, 5, 6, 7, 8, 9]            [3, 3, 4, 5, 6, 7, 8, 9]            [6, 4, 5, 6, 7, 8, 9]            [10, 5, 6, 7, 8, 9]            [15, 6, 7, 8, 9]            [21, 7, 8, 9]            [28, 8, 9]            [36, 9]            [45]            45        上例就是用到尾递归,最终求得1~9的和

原文地址:https://www.cnblogs.com/Meanwey/p/9741228.html

时间: 2024-08-30 04:43:44

Python基础-----函数式编程含义及特点(及尾递归)的相关文章

python基础-函数式编程

python基础-函数式编程  高阶函数:map , reduce ,filter,sorted 匿名函数:  lambda  1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 函数式编程:是使用一系列函数去解决问题,函数式编程就是根据编程的范式来,得出想要的结果,只要是输入时确定的,输出就是确定的. 1.2高阶函数 能把函数作为参数传入,这样的

python 入门 - 函数式编程

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819196283586a37629844456ca7e5a7faa9b94ee8000     函数 定义函数 def my_abs(x): if x >= 0: return x else: return -x result =my_

python之函数式编程

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程 序设计.函数就是面向过程的程序设计的基本单元. 而函数式编程(请注意多了一个“式”字)——Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算. 我们首先要搞明白计算机(Computer)和计算(Compute)的概念. 在计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条件判断和

python 之函数式编程

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 而函数式编程(请注意多了一个"式"字)--Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算. 我们首先要搞明白计算机(Computer)和计算(Compute)的概念. 在计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条

Python的函数式编程,从入门到?放弃?

转:http://python.jobbole.com/84927/ 很早以前就听说过了函数式编程,印象中是一种很晦涩难懂的编程模式,但却一直没有去进行了解. 恰好这周组内的周会轮到我主持,一时也没想到要分享什么.灵光一闪,就选定函数式编程这个主题吧,反正组里的同事都没有学过,只需要讲解入门方面的知识就好,也正好可以借这个机会逼迫自己去学习下这种新的编程方式. 经过初步了解,发现支持函数式编程的语言挺多的,除了像Lisp.Scheme.Haskell.Erlang这样专用的函数式编程语言,我们常

Python进阶-函数式编程

花了一个多小时学习python的函数式编程,终于算入门了,这接近一万字的教程,原作者分了十几课,我融合在一起方便查阅. 函数式编程 functional,是编程的一种范式 特点有: 把计算视为函数而不是指令 纯函数式编程不需要变量,没有副作用,测试简单 支持高阶函数,代码简洁 Python支持函数式编程: python不是纯函数式语言,允许有变量 支持高阶函数,函数也可作为变量传入 支持闭包,有了闭包就能返回函数 有限度地支持匿名函数 高阶函数是什么 先了解以下概念: 1.变量可以指向一个函数,

Python的函数式编程

Contents 1. 目标 2. 命令式编程 & 函数式编程 3. Python函数式编程的基本单元 3.1. lambda 3.2. map() 3.3. reduce() 3.4. filter() 4. 替换条件控制语句 5. 替换循环控制语句 5.1. 替换for循环 5.2. 替换while循环 6. 更多示例 7. 总结 8. 参考链接 很早以前就听说过了函数式编程,印象中是一种很晦涩难懂的编程模式,但却一直没有去进行了解. 恰好这周组内的周会轮到我主持,一时也没想到要分享什么.灵

python之函数式编程与函数闭包

防伪码:忘情公子著 Python函数式编程: 函数式编程: 也称作泛函编程,是一种编程范型,说白了就是实现可以把函数当参数传递给另一个函数: 它将电脑运算视为数学上的函数计算,并且避免状态以及可变数据: 函数式编程语言最重要的基础是lambda演算,而且lambda演算的函数可以接受函数当作输入和输出 Python支持有限的函数式编程功能: filter(func,seq): 调用一个布尔函数func来迭代遍历每个seq中的元素:返回一个使func返回值为true的元素的序列 In [1]: d

Python进阶 函数式编程和面向对象编程等

函数式编程 函数:function 函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式. 函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同 高阶函数:能接收函数做参数的函数 变量可以指向函数 函数的参数可以接收变量 一个函数可以接收另一个函数作为参数 例子: 接收abs函数, 定义一个函数,接收x,y,z三个参数.其中x,y是数值,z是函数 . 1 2 3 def add(x,y,z):     return z(x)+z(y) print ad