zoukankan      html  css  js  c++  java
  • Python函数式编程

    函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。

    函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

    Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

    高阶函数:一个函数就可以接收另一个函数作为参数

    变量可以指向函数,函数本身可以赋值给变量,函数名也是变量

    如:

    In [20]: abs
    Out[20]: <function abs>
    
    In [21]: abs(-20)
    Out[21]: 20
    
    In [22]: x = abs
    
    In [23]: x(-2)
    Out[23]: 2

    传入函数

    In [24]: def sum(x,y):
       ....:     return x+y
    
    In [26]: def de(x,y):
       ....:     return x-y
       ....:
    
    In [27]: def cal(x,y,sum,de):
       ....:     return sum(x,y)*de(x,y)
       ....:
    
    In [28]: cal(2,5,sum,de)
    Out[28]: -21

    下面是一些很有用的高阶函数使用方法:

      1、Map/Reduce

    之前听说过Map/reduce是在做大数据分析的时候,用到的Hadoop的map/reduce。主要的思想还是不变的:map就是对每个数据分开处理,而reduce则是将分开的数据合在一起

      1)map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。

    如:把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']

    In [10]: map(str.capitalize,['adam','lisa','bart'])
    Out[10]: ['Adam', 'Lisa', 'Bart']

      2)reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

    In [6]: def func(x,y):
       ...:     return x+ y
       ...:
    
    In [2]: a = [1,2,3,4,5,6,7]
    
    In [7]: reduce(func,a)
    Out[7]: 28

    一般而言,map和reduce通常会一起使用

      2、filter

    filter()函数用于过滤序列,filter()接收一个函数和一个序列。filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

    请尝试用filter()获取1~100的素数。In [20]: def su(a):

       ....:     i = 2
       ....:     while(i<a):
       ....:         if a % i == 0:
       ....:             return False
       ...:         i = i + 1
    ....:
    return True ....: In [21]: filter(su,range(1,101))

      3、 sorted

    sorted()可以接受传入list,也可以接收一个比较函数来实现自定义的排序。

    如:

    def reversed_cmp(x, y):
        if x > y:
            return -1
        if x < y:
            return 1
        return 0
    
    >>> sorted([36, 5, 12, 9, 21], reversed_cmp)
    [36, 21, 12, 9, 5]

    返回函数:函数作为返回值

    闭包:在函数的内部定义函数,在里面的函数可以调用外面的函数的局部变量,然后返回该内部函数。是为了读取函数内部的变量,这个在js中也有提到,一般而言,函数用完后就会释放掉,但是闭包函数会保存局部变量供内部函数使用不被释放掉

    返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

    如:

    def count():
        fs = []
        for i in range(1, 4):
            def f():
                 return i*i
            fs.append(f)
        return fs
    
    f1, f2, f3 = count()

    要想使用迭代,将循环变量保存下来

    >>> def count():
    ...     fs = []
    ...     for i in range(1, 4):
    ...         def f(j):
    ...             def g():
    ...                 return j*j
    ...             return g
    ...         fs.append(f(i))
    ...     return fs
    ... 
    >>> f1, f2, f3 = count()
    >>> f1()
    1
    >>> f2()
    4
    >>> f3()
    9

    匿名函数

    关键字lambda表示匿名函数,冒号前面的x表示函数参数。

    匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

    装饰器

    偏函数

  • 相关阅读:
    普元EOS中nui(对jquery MiniUi的封装)合并表头
    css--让箭头动起来
    在开发中说一说你最讨厌什么函数????
    前端开发学习路线
    默哀日,网页置灰,开发人员你应该掌握的
    window--环境下升级node的版本(因为低版本node运行Vue项目有问题)
    小程序--模板<template>的定义和使用
    小程序--app.js之App方法
    小程序---页面配置文件,只对自己的页面有效果
    javascript 内存模型
  • 原文地址:https://www.cnblogs.com/sker/p/5798700.html
Copyright © 2011-2022 走看看