美文网首页
函数式编程(高阶函数 闭包 yield 装饰器 递归)

函数式编程(高阶函数 闭包 yield 装饰器 递归)

作者: 04a07ffbfb62 | 来源:发表于2016-05-23 14:30 被阅读142次

函数式编程

是一种编程范式
将电脑运算视为数学上的函数计算,并且避免可变数据
函数式编程最重要的基础是lambda演算,而且lambda演算的函数可以接受函数当作输入和输出

python支持有限的函数式编程功能

  • filter(func, seq)
    调用一个布尔函数 func 来迭代遍历每个 seq 中的元素; 返回一个func 返回值为 true 的元素的序列。
  • __map(func, seq1[,seq2...]) __
    将函数 func ‘映射’到给定序列的每个元素,并用一个列表来提供返回值;如果 func 为 None, func 表现为一个身份函数,返回一个含有每个序列中元素集合的 n 个元组的列表。

  • reduce(func, seq[, init]) (折叠函数)
    将二元函数(两个输入值,一个输出值的函数)作用于 seq 序列的元素。它通过取出序列的头两个元素,将他们传入二元函数来获得一个单一的值。把这个值和序列的下一个元素传入二元函数来获得又一个值,然后继续直到整个序列的内容都遍历完毕以及最后的值会被计算出来为止,返回最后的值;如果初始值 init 给定,第一个比较会是 init 和第一个序列元素而不是序列的头两个元素

    注意传递的是函数名,不能加(),不是调用函数

    filter()示例

    def f1(x):
    if x>20:
    return True
    else:
    return False
    l1 = [1, 3, 40, 24, 15]
    filter(f1, l1)

    [40, 24]
    # map()示例
    map((lambda x: x * 2), l1)
    >>> [2, 6, 80, 48, 30]
    map(lambda x: x2, range(6))
    >>> [0, 2, 4, 6, 8, 10]
    [x
    2 for x in range(6)] # 使用列表推导对map()进行替换
    >>> [0, 2, 4, 6, 8, 10]
    #reduce()示例
    def f5(x, y):
    return x + y
    reduce(f5, l1)
    >>>83

闭包 Closure

如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是 closure。
定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量。
通俗理解:一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。你在调用函数A的时候传递的参数就是自由变量。
详解python中的闭包

def f1(x):
    # 在函数内部再定义一个函数,这个函数就被认为是闭包
    def f2(y):
        return y ** x
    # 返回闭包的结果
    return f2
f1(4)
>>> <function __main__.f2>
f3 = f1(3)
type(f3)
>>> function
f3(2)
>>> 8
f3(3)
>>> 27

生成器、yield

yield语句挂起该函数并向调用者发送回一个值,但是,保留足够的状态以使得函数能够从它离开的地方继续。当继续时,函数在上一个yield返回后立即继续执行。
函数中使用yield语句会返回一个生成器对象。

def genNum(n):
    i = 1
    while i <= n:
        yield i ** 2
        i += 1
g1 = genNum(20)
for i in g1:
    print i,
>>> 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400
g2 = genNum(3)
g2.next()
>>> 1
g2.next()
>>> 4
g2.next()
>>> 9

装饰器

装饰器本身是一个函数,用于装饰其他函数;
装饰器增强装饰函数的功能;
装饰器一般接受一个函数对象作为参数,以对其进行增强;
扩展:什么时候会用到python装饰器?闭包、装饰器how can i make a chain of function decorators in python

def deco(func):
    # 闭包的应用
    def wrapper():
        print 'Say something:'
        func()
        print 'No zuo no die'
    return wrapper

@deco
def show():
    print 'I am Yuan'

show()
>>>Say something:
I am Yuan
No zuo no die

#有参数的装饰器
def deco(func):
    def wrapper(x):
        print 'Say something:'
        func(x)
        print 'No zuo no die'
    return wrapper

@deco
def show(x):
    print x

show('Help')
>>> Say something:
Help
No zuo no die

递归

如果一个函数包括对自身的调用,该函数就是递归的。
递归需要边界条件用以退出递归。

#阶乘
def fac(n):
    if n <= 1:
        return 1
    else:
        return n * fac(n - 1)

fac(5)
>>> 120

相关文章

  • 函数式编程(高阶函数 闭包 yield 装饰器 递归)

    函数式编程 是一种编程范式将电脑运算视为数学上的函数计算,并且避免可变数据函数式编程最重要的基础是lambda演算...

  • Python笔记四 装饰器

    装饰器 = 高阶函数+函数嵌套+闭包 高阶函数 = 参数 or 返回值为函数 函数嵌套 = 在函数中定义函数 闭包...

  • Kotlin 函数式编程思想 FP in Kotlin

    Kotlin 函数式编程思想 : FP in Kotlin 函数式编程特性 闭包和高阶函数 函数编程支持函数作为第...

  • python装饰器

    装饰器简述 要理解装饰器需要知道Python高阶函数和python闭包,Python高阶函数可以接受函数作为参数,...

  • 【五十二】 underscore

    前面我们已经讲过了,JavaScript是函数式编程语言,支持高阶函数和闭包。函数式编程非常强大,可以写出非常简洁...

  • 函数进阶_2

    目录 常用内置函数 匿名函数 高阶函数 闭包 装饰器 1. 常用内置函数 1.1 range()函数 语法:ran...

  • Python 之路03 - Python基础3

    本节内容 函数与函数式编程 函数式编程之参数详解 局部变量与全局变量作用域嵌套函数 递归 函数式编程介绍 高阶函数...

  • redux简介(二)源码解析

    写在开头 前置知识内容,闭包,高阶函数,函数式编程思想,redux核心概念。 redux文档:https://ww...

  • Kotlin语言(十):函数式编程

    1、闭包 闭包:函数式编程,函数可以作为方法的返回值,也可以作为方法的参数,lambda表达式 2、高阶函数 3、...

  • Javascript学习笔记-underscore

    JavaScript是函数式编程语言,支持高阶函数和闭包。你会发现Array有map()和filter()方法,而...

网友评论

      本文标题:函数式编程(高阶函数 闭包 yield 装饰器 递归)

      本文链接:https://www.haomeiwen.com/subject/yudarttx.html