精华内容
下载资源
问答
  • 1 递归函数的特点 特点 一个函数 内部 调用自己 函数内部可以调用其他函数,当然在函数内部也可以调用自己 代码特点 函数内部的 代码 是相同的,只是针对 参数 不同,处理的结果不同 当 参数满足一个条件 时,函数...
  •  即函数与其他数据类型一样,处于平等地位,可以赋值给变量,也可以作为参数传入另一个函数,或者作为别的函数的返回值。  2.只用表达式,不用语句  表达式是一个单纯的运算过程,总有返回值;语句是执行某种...
    函数式编程的五个鲜明特点:
        1.函数是第一等公民。
        即函数与其他数据类型一样,处于平等地位,可以赋值给变量,也可以作为参数传入另一个函数,或者作为别的函数的返回值。
        2.只用表达式,不用语句
        表达式是一个单纯的运算过程,总有返回值;语句是执行某种操作,没有返回值。函数式编程每一步都是单纯的运算,而且都有返回值。
        原因是函数式编程的开发动机,一开始就是为了处理运算,不考虑系统的IO。语句属于对系统IO的操作,所以排除在外。
        3.没有副作用    所谓副作用,就是指函数内部与外部互动,产生运算以外的其他结果。函数式编程强调没有副作用,意味着要保持独立,所有的功能就是返回一个新的值,没有其他行为,尤其是不修改外部变量的值。
        4.不修改变量    函数式编程只返回新的值,不修改系统变量。在其他语言中,变量往往用来保持状态,不修改变量,即不能将状态保持在变量中,函数式编程使用参数保持状态,最好的例子就是递归。由于使用了递归,函数式编程的运行速度往往较慢。
        5.引用透明
        引用透明指的是函数的运行不依赖于外部变量或状态,只依赖于输入的参数,只要参数相同,返回的结果总是相同的。
    函数式编程的价值
        1.代码简洁,开发迅速
        函数式编程大量使用函数,减少了代码的重复度,因此程序比较短,开发速度较快。
        2.接近自然语言,易于理解
        函数式编程的自由度很高,可以写出很接近自然语言的代码。
        3.更方便的代码管理
        函数式编程 不依赖也不改变外部环境,只要输入参数相同,即返回相同的结果。因此,每一个函数即可看做独立单元,有利于测试。
        4.易于并发编程
        函数式编程不需要考虑死锁,因为它不修改变量,所以根本不需要考虑死锁问题,函数之间并不会相互影响,因此可以用多线程进行处理。
        5.代码的热升级
        函数式编程没有副作用,即不修改外部变量,所有可以在运行状态下直接升级,不需要重启,也不需要停机。
       
    展开全文
  • 主要介绍了Python递归函数特点及原理解析,文中通过示例代码介绍非常详细,对大家学习或者工作具有一定参考学习价值,需要朋友可以参考下
  • 引言学习神经网络的时候我们总是听到激活...激活函数的用途(为什么需要激活函数)?有哪些激活函数,都有什么性质和特点?应用中如何选择合适的激活函数?如果你对以上几个问题不是很清楚,下面的内容对你是有价值...

    引言

    学习神经网络的时候我们总是听到激活函数这个词,而且很多资料都会提到常用的激活函数,比如Sigmoid函数、tanh函数、Relu函数。那么我们就来详细了解下激活函数方方面面的知识。本文的内容包括几个部分:

    1. 什么是激活函数?
    2. 激活函数的用途(为什么需要激活函数)?
    3. 有哪些激活函数,都有什么性质和特点?
    4. 应用中如何选择合适的激活函数?

    如果你对以上几个问题不是很清楚,下面的内容对你是有价值的。

    什么是激活函数?

    首先要了解神经网络的基本模型
    单一神经元模型如下图所示。
    这里写图片描述
    神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。

    如果你觉得这篇文章看起来稍微还有些吃力,或者想要系统地学习人工智能,那么推荐你去看床长人工智能教程。非常棒的大神之作,教程不仅通俗易懂,而且很风趣幽默。点击这里可以查看教程。

    激活函数的用途(为什么需要激活函数)?

    如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。

    有哪些激活函数,都有什么性质和特点?

    早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。
    近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多层神经网络中应用比较多。下面我们来总结下这些激活函数:

    Sigmoid函数

    Sigmoid 是常用的非线性的激活函数,它的数学形式如下:
    f(z)=11+ezf(z)=11+ezf(z)=11+ezf(z)=11+e−zf(z)=11+e−z f(z)=\frac{1}{1+e^{-z}}f(x)={x,α(ex1),if x>0otherwise
    函数及其导数的图像如下图所示:
    这里写图片描述

    ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:

    不会有Dead ReLU问题输出的均值接近0,zero-centered
    • 1
    • 2

    它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。

    MaxOut函数

    这个函数可以参考论文《maxout networks》,Maxout是深度学习网络中的一层网络,就像池化层、卷积层一样等,我们可以把maxout 看成是网络的激活函数层,我们假设网络某一层的输入特征向量为:X=(x1,x2,……xd),也就是我们输入是d个神经元。Maxout隐藏层每个神经元的计算公式如下:
    这里写图片描述

    上面的公式就是maxout隐藏层神经元i的计算公式。其中,k就是maxout层所需要的参数了,由我们人为设定大小。就像dropout一样,也有自己的参数p(每个神经元dropout概率),maxout的参数是k。公式中Z的计算公式为:

    这里写图片描述

    权重w是一个大小为(d,m,k)三维矩阵,b是一个大小为(m,k)的二维矩阵,这两个就是我们需要学习的参数。如果我们设定参数k=1,那么这个时候,网络就类似于以前我们所学普通的MLP网络。
    我们可以这么理解,本来传统的MLP算法在第i层到第i+1层,参数只有一组,然而现在我们不这么干了,我们在这一层同时训练n组的w、b参数,然后选择激活值Z最大的作为下一层神经元的激活值,这个max(z)函数即充当了激活函数。

    应用中如何选择合适的激活函数?

    这个问题目前没有确定的方法,凭一些经验吧。
    1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
    2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
    3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.

    展开全文
  • 激活函数的理解和实现-最新整理

    千次阅读 2019-04-14 16:10:58
    引言 学习神经网络的时候我们...激活函数的用途(为什么需要激活函数)? 有哪些激活函数,都有什么性质和特点? 应用中如何选择合适的激活函数? 如果你对以上几个问题不是很清楚,下面的内容对你是有价值的...

    回顾上一篇 神经网络的数学基础:张量运算

    引言

    学习神经网络的时候我们总是听到激活函数这个词,而且很多资料都会提到常用的激活函数,比如Sigmoid函数、Tanh函数、ReLU函数。我们就来详细了解下激活函数方方面面的知识。本文的内容包括几个部分:

    • 什么是激活函数?
    • 为什么需要激活函数?激活函数的作用是什么?
    • 常用激活函数有哪些,都有什么优特点?
    • 如何选择适合项目的激活函数?
    • 激活函数的Python实现
    • 简单三层神经网络- 前馈输出

    如果你对以上几个问题不是很清楚,下面的内容对你是有价值的。

    什么是激活函数?

    在上一篇末尾我们讲到了神经网络的内积,但那还不是那一层的最终输出,最终输出什么?输出多少? 需要有一个函数来确定,这个函数将输入信号的总和(内积)转换为输出信号,这种函数一般称为激活函数(activation function)。如“激活”一词所示,激活函数的作用在于决定如何来激活输入信号的总和。下图中h()函数作用到a上,从而得到神经元到输出y,h()就是激活函数或者叫做激励函数。
    图5-1

    为什么需要激活函数?激活函数的作用是什么?

    在谈到激活函数时,也经常会看到“非线性函数”和“线性函数”等术语。函数本来是输入某个值后会返回一个值的转换器。向这个转换器输入某个值后,输出值是输入值的常数倍的函数称为线性函数(用数学式表示为h(x) = cx。c 为常数)。因此,线性函数是一条笔直的直线。而非线性函数,顾名思义,指的是不像线性函数那样呈现出一条直线的函数。
    神经网络的激活函数必须使用非线性函数。换句话说,激活函数不能使用线性函数。为什么不能使用线性函数呢?因为使用线性函数的话,加深神经网络的层数就没有意义了。线性函数的问题在于,不管如何加深层数,总是存在与之等效的“无隐藏层的神经网络”。
    如果不考虑激活函数,考虑一个三层神经网络的输出公式:

    a1=xw1+b1    a1  a2=a1w2+b2    a2  a3=a2w3+b3a^{1} = xw^{1} + b^{1} ~~~~a^{1}传递到第二层 ~~\\ a^{2} = a^{1}w^{2} + b^{2} ~~~~a^{2}传递到第三层 ~~\\ a^{3} = a^{2}w^{3} + b^{3}
    注意,1,2,3代表层数
    可以看到这种神经网络层之间信号传递全是我们中学学过的平面解析几何里线性(y = kx + b)形式的传递方式,是没有意义的,无论叠加多少层。
    正因为上面的原因,神经网络引入非线性函数的激活函数,才可以充分发挥层叠加所带来的优势,这样几乎可以逼近任意函数。

    常用激活函数有哪些,都有什么优特点?

    sigmoid函数是神经网络中最常使用的激活函数,在深度学习领域,自从提出ReLU函数后,陆续提出了一些新的激活函数或ReLU的衍生函数。主要激活函数如下所示:

    • sigmoid & tanh
    • ReLU以及其衍生函数
    • MaxOut
    Sigmoid & tanh

    Sigmoid 是常用的非线性激活函数,它的数学形式如下:

             f(x)=11+exp(x)~~~~~~~~~f(x)=\frac {1}{1+exp^{(-x)}}

    exp(−x)表示e(x)e^{(−x)} 的意思。e是纳皮尔常数2.7182. sigmoid函数看上去有些复杂,但它也仅仅是个函数而已。而函数就是给定某个输入后,会返回某个输出的转换器。比如,向sigmoid函数输入1.0或2.0后,就会有某个值被输出,类似h(1.0) = 0.731 . . .、h(2.0) = 0.880 . . .。神经网络中用sigmoid 函数作为激活函数,进行信号的转换,转换后的信号被传送给下一个神经元。

    tanh函数是sigmoid函数的一种变体,以0点为中心。取值范围为 [-1,1] ,而不是sigmoid函数的 [0,1] 。公式:
    tanh(x)=exexex+extanh(x)=\frac {e^x - e^{-x}}{e^x + e^{-x}}
    tanh 是对 sigmoid 的平移和收缩: tanh(x)=2σ(2x)1tanh(x)=2⋅σ(2x)−1

    sigmoid优缺点:
    优点: 它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
    缺点: sigmoid函数曾经被使用的很多,它也有其固有缺点。

    • 饱和的神经元会"杀死"梯度,指离中心点较远的x处的导数接近于0,停止反向传播的学习过程.
    • sigmoid的输出不是以0为中心,而是0.5,这样在求权重w的梯度时,梯度总是正或负的.
    • 指数计算耗时

    tanh优缺点:
    优点:

    • 梯度消失问题程度 tanh(x)的梯度消失问题比sigmoid要轻
    • tanh解决了Sigmoid函数的不是zero-centered输出问题
      缺点: 梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

    也正是因为有缺点,才有其它激活函数的产生和发展。

    ReLU及其衍生函数

    Relu公式:
    f(x)={x,x>=00,x<0f(x) = \left\{\begin{matrix}x, & x>=0 \\ 0, &x<0 \end{matrix}\right.
    ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:

    • 解决了gradient vanishing问题 (在正区间)
    • 计算速度非常快,只需要判断输入是否大于0
    • 收敛速度远快于sigmoid和tanh

    ReLU也有几个需要特别注意的问题:

    • ReLU的输出不是zero-centered
    • 坏死: ReLU强制的稀疏处理会减少模型的有效容量(即特征屏蔽太多,导致模型无法学习到有效特征)。由于ReLU在x <0时梯度为0,这样就导致负的梯度在这个ReLU被置零,而且这个神经元有可能再也不会被任何数据激活,称为神经元“坏死”。
    • 无负值: ReLU和sigmoid的一个相同点是结果是正值,没有负值.

    尽管如此,ReLU目前仍是最常用的activation function.
    下面看ReLU的变种。

    ReLU变种

    为了在输入小于0时能够输出负值,人们提出了Leaky ReLU,PReLU和RReLU等激活函数。这些函数的负数端斜率和整数端不同。
    当x<0时,f(x)=axf(x)=ax,其中a非常小,可以避免在x<0时,不能够学习的情况,公式为:f(x)=max(ax,x)f(x) = max(ax,x),称为Parametric Rectifier(PReLU),将 α作为可学习的参数。
    当 α 从高斯分布中随机产生时称为Random Rectifier(RReLU)PReLU中,aa是在根据误差反向传播算法进行训练时确定的,从一个均匀分布的随机抽取的数值。测试时,可以取均匀分布的中值。
    aa通常是训练前确定的, 比如α=0.01,是Leaky ReLU

    这几个激活函数性能测试差别不大,RReLU最优。Relu函数以及衍生函数的图像:
    图5-3
    优点:

    • 不会过拟合(saturate)
    • 计算简单有效
    • 比sigmoid/tanh收敛快
    指数线性单元ELU

    ELU公式:
    f(x)={a(ex1),x&lt;=0x,x&gt;0f(x) = \left\{\begin{matrix}a(e^x-1), &amp; x&lt;=0 \\ x, &amp;x&gt;0 \end{matrix}\right.
    exponential linear unit, 该激活函数由Djork等人提出,被证实有较高的噪声鲁棒性,同时能够使得使得神经元的平均激活均值趋近为 0,同时对噪声更具有鲁棒性。由于需要计算指数,计算量较大。

    SELU

    SELU是给ELU乘上系数 λ, 即 SELU(x)=λELU(x)SELU(x)= λ⋅ELU(x) , SELU公式:

    f(x)=λ{a(ex1),x&lt;=0x,x&gt;0f(x) = λ \left\{\begin{matrix}a(e^x-1), &amp; x&lt;=0 \\ x, &amp;x&gt;0 \end{matrix}\right.
    论文: 自归一化神经网络(Self-Normalizing Neural Networks)中提出只需要把激活函数换成SELU就能使得输入在经过一定层数之后变成固定的分布. 参考对这篇论文的讨论.

    MaxOut函数

    maxout激活函数由Google的花书作者Ian Goodfellow等人提出的,可参考Maxout Networks
    Maxout可以看做是在深度学习网络中加入一层激活函数层,包含一个参数k.这一层相比ReLU,sigmoid等,其特殊之处在于增加了k个神经元,然后输出激活值最大的值.
    我们常见的隐含层节点输出:
    hi(x)=sigmoid(xTW...i+bi) h_i (x)= sigmoid(x^TW_{...i} + bi)
    在Maxout网络中,其隐含层节点的输出表达式为:
    单元hkh_k的值可表示为:
    hi(x)=maxj(1,k)zijh_i(x)=\max_{j\in(1,k)}z_{ij}
    其中:
    zij=i=0Nwijxi+bijz_{ij}=\sum_{i=0}^Nw_{ij}x_i + b_{ij}
    公式中zijz_{ij}是对输入xix_i对应的权重wijw_{ij}的乘积之和加上偏置的结果。这里是k个单元输出值中取最大值最为单元的输出,所以maxout可以学到单元之间的关系。下图可以清楚到看到变化,注意图中画圈到部分,这是一个正常到神经单元(2个输入1个输出),变成箭头所指的结构,中间加了一层k个神经元,同时多出来了一个W和b,计算处理取最大值得到hi(x)h_i(x)
    在这里插入图片描述
    此外,maxout激活函数还可以理解为一种分段线性函数来近似任意凸函数。如图所示,在卷积层使用maxout作为激活函数时,从多个特征值的相同位置中选取最大值最为最后的特征图。池化操作是从相同的特征图的局部区域中选取最大值,可以看作是特征图的缩小处理,而maxout激活函数是从不同特征图中选取最大值作为最后的特征图,所以可以看作是减少了特征图个数。
    图5-2
    优点

    • Maxout的拟合能力非常强,可以拟合任意的凸函数。
    • Maxout具有ReLU的所有优点,线性、不饱和性。
    • 没有ReLU的一些缺点。如:神经元的死亡。

    缺点:从上面的激活函数公式中可以看出,每个神经元中有两组(w,b)参数,那么参数量就增加了一倍,这就导致了整体参数的数量激增。

    如何选择适合项目的激活函数?

    到目前位置,似乎还没有这方面的理论推导告诉你,在你的项目中用哪个激活函数最佳,所以你要有深刻的数学洞察力,如果没有这种能力,就凭经验,在实践中不断调整优化。不过有人建议如下顺序,可以参考:

    1. 首先尝试ReLU,速度快,但要注意训练的状态.
    2. 如果ReLU效果欠佳,尝试Leaky ReLU或Maxout等变种。
    3. 尝试tanh正切函数(以零点为中心,零点处梯度为1)
    4. sigmoid/tanh在RNN(LSTM、注意力机制等)结构中有所应用,作为门控或者概率值.
    5. 在浅层神经网络中,如不超过4层的,可选择使用多种激励函数,没有太大的影响。
    激活函数的Python实现

    由于贴出代码使文章过长,要看代码从这里下载
    通过一个Activation类实现,各种激活函数,并有绘制激活函数的方法,你可以修改使用。
    输出的图形:
    图5-9

    简单三层神经网络-前馈输出

    本节是为初学者准备的,目的是通过简单神经网络为例子,讲述前馈网络输出的计算,本节主要讲述激活函数在其中的应用,中高级经验者略过不看。

    上一篇我们到例子计算了神经网络层到内积,现在继续完善它,今天要完成神经网络层在加入激活函数后的输出,下图是从输入到第1层输入信号:
    图5-6
    上一篇我们计算了第1层A1(内积)的值,现在考虑激活函数h(),来计算Z1的值

    import numpy as np
    X = np.array([1.0, 0.5])
    W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
    B1 = np.array([0.1, 0.2, 0.3])
    print(W1.shape) # (2, 3)
    print(X.shape) # (2,)
    print(B1.shape) # (3,)
    A1 = np.dot(X, W1) + B1
    Z1 = sigmoid(A1)
    

    我们再看第1层传到第2层,信号的传送参见如下图:
    图5-7 从第1层到第2层第信号传输

    W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
    B2 = np.array([0.1, 0.2])
    print(Z1.shape) # (3,)
    print(W2.shape) # (3, 2)
    print(B2.shape) # (2,)
    A2 = np.dot(Z1, W2) + B2
    Z2 = sigmoid(A2)
    

    再来看,第2层到输出层,参见如下图:
    图5-8 从第2 层到输出层的信号传递

    def identity_function(x):
    	return x
    W3 = np.array([[0.1, 0.3], [0.2, 0.4]])
    B3 = np.array([0.1, 0.2])
    A3 = np.dot(Z2, W3) + B3
    Y = identity_function(A3) # 或者Y = A3
    

    代码实现,可以从这里下载,这里节省篇幅,不贴了,见谅。
    代码实现类一个Network类,结合上面的Activation类,可以演示同一个神经网络在不同激活函数作用下的输出,从而对激活函数对作用有深刻认识。
    继续阅读 深刻理解机器学习的: 目标函数,损失函数和代价函数

    展开全文
  • Python 进阶_函数式编程

    千次阅读 2016-10-16 01:09:46
    目录 [toc] 函数式编程 首先要确定一点就是:函数 != 函数式 ...需要注意是,Python 不是也不可能会成为一种纯函数是编程语言,但 Python 仍支持许多有价值的函数式编程语言构建方法。 Py

    目录

    函数式编程

    首先要确定一点就是:函数 != 函数式,函数式编程是一种编程的范式。
    特点:

    • 把计算视为函数而非指令
    • 纯函数式编程,不需要变量,没有副作用,测试简单
    • 支持高阶函数,代码简洁

    Python 函数式编程的特点

    需要注意的是,Python 不是也不可能会成为一种纯函数是编程语言,但 Python 仍支持许多有价值的函数式编程语言的构建方法。

    • Python 不是纯函数是编程,因为 Python 支持变量
    • Python 支持高阶函数,而且函数也可以作为变量传入
    • Python 支持闭包,可以返回一个函数

    高阶函数

    首先要明确一点,函数是由变量来引用的,这也是一个 Python 的特性:将对象引用和对象分离。
    EG:

    In [1]: abs(-1)
    Out[1]: 1
    
    In [2]: f = abs # 将函数名赋值给一个变量,让变量获得函数的引用
    
    In [3]: f(-1)
    Out[3]: 1
    
    In [5]: abs = len
    
    In [6]: abs([1, 2, 3])
    Out[6]: 3

    高阶函数: 能够接收函数作为一个参数的函数,就是高阶函数。
    下面定义一个高阶函数:

    In [1]: def add(x, y, f):
       ...:     return f(x) + f(y)
       ...:
    
    In [2]: add(-1, -10, abs)
    Out[2]: 11

    函数 add 接收内建函数 abs 作为一个参数,所以 add 是一个高阶函数。

    匿名函数 lambda

    格式

    lamba [arg1[, arg2, ...]]: expression # --> return: object of function

    匿名函数,顾名思义就是没有名字的函数,可以忽略函数定义的函数。所以匿名函数的好处之一就是创建简易、方便,不需要以标准的定义方式(def)来创建。而且匿名函数可以如一般函数那样返回一个 callable 的函数对象,所以匿名函数一般会赋值给一个变量,或者直接作为一个函数实参来使用。从匿名函数的语法格式来看,其缺点也很明显,就是其函数体只能是一条 expression 而不能是一条关键字语句,如:print

    NOTE: 因为匿名函数可以快速的返回一个函数对象,并且可以直接作为一个函数的实参使用,所以匿名函数经常被用于构建函数式的编程中。
    EXAMPLE:

    In [4]: def add(x, y):
       ...:     return x + y
       ...:
    
    In [5]: lambda x, y: x + y
    Out[5]: <function __main__.<lambda>> # 返回一个可调用的函数对象
    
    In [6]: lam_add= lambda x, y: x + y
    
    In [7]: lam_add(1, 2)
    Out[7]: 3

    上面两种方式的结果是一致的。

    注意: 如果 lambda 返回的对象没有赋值给一个变量,那么这个函数对象的引用 == 0,会被垃圾回收掉。

    函数式编程相关的内置函数

    Python 提供了几个与函数式编程相关的内置函数,之所以说与函数式编程相关是因为这几个内置函数都需要接收一个函数对象作为参数,而这个函数对象通常由 lambda 来提供。

    filter() 序列对象过滤器

    让序列对象中的每一个元素都通过一个指定的过滤器,最终符合过滤条件(Return True)的元素会被返回为一个新的序列。
    要自己实现一个 filter 函数,并不难。EG.

    def filter(bool_func, seq):
        filtered_seq = []
        for index in seq:
            if bool_func(index):
                filtered_seq.append()
        return filtered_seq

    EXAMPLE 1:求偶数

    In [13]: filter(lambda x: x % 2 == 0, range(1,10))
    Out[13]: [2, 4, 6, 8]

    EXAMPLE 2:删除 None 或者空字符串

    In [14]: def is_not_empty(s):
        ...:     return s and len(s.strip()) > 0
        ...:
    
    In [15]: filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])
    Out[15]: ['test', 'str', 'END']``

    注意: 传入 filter 的函数最终的返回值一定是 True or False

    map()

    map 和 filter 很类似,但 map 函数通过把函数参数依次作用在 seq 的每个元素上,得到一个新的 seq 并返回。而且 map 的函数参数不要求一定要返回 True or False 。除此之外, map 还能处理多个序列参数。

    def map(func, seq):
        maped_seq = []
        for index in seq:
            maped_seq.append(func(index))
        return maped_seq

    EXAMPLE 1:处理单个序列对象

    In [17]: map(lambda x :x+2, range(1,10))
    Out[17]: [3, 4, 5, 6, 7, 8, 9, 10, 11]

    EXAMPLE 2:处理多个序列对象

    In [24]: map(lambda x, y :x + y, range(1,10), range(1,10))
    Out[24]: [2, 4, 6, 8, 10, 12, 14, 16, 18]

    注意:如果传递多个序列对象给 map 时,其处理的算法如下
    1. 并行的将多个序列中 index 相同的元素获取,并捆绑到同一个元组中
    2. 将这一个元组传递给函数参数中进行处理。
    所以需要注意的是,两个序列的元素个数是否一致,函数参数是否能正确的处理这个元组对象

    In [26]: map(None, range(1,6), range(1,6))
    Out[26]: [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)]
    
    In [27]: zip(range(1,6), range(1,6))
    Out[27]: [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)]`

    从这个例子可以看出 map 可以完成一个简单的 zip 功能,这是由其内部的实现算法决定的。

    reduce() 折叠

    reduce 需要传入一个 二元函数(具有两个形参的函数) 、一个序列对象和一个可选的 初始化器
    其最常用的例子就是 累加

    In [28]: reduce(add, range(1, 100))
    Out[28]: 4950
    
    In [35]: reduce(add, range(1, 100), 5000)
     # 初始化器 == 5000,即从 5000 开始累加
    Out[35]: 9950

    等效于:reduce(func, [1, 2, 3]) ⇒ func(func(1, 2), 3)

    自定义的排序函数

    Python 内置了一个排序函数 sorted

    In [1]: sorted([36, 5, 12, 9, 21])
    Out[1]: [5, 9, 12, 21, 36]

    时 sorted 也是一个高阶函数,它可以接收一个比较函数来实现自定义排序。
    比较函数的定义是:传入两个待比较的元素 x, y
    1. 如果 x 应该排在 y 的前面,返回 -1
    2. 如果 x 应该排在 y 的后面,返回 1
    3. 如果 x 和 y 相等,返回 0

    所以我们可以自定义一个比较函数,并且传递给 sorted 函数:

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

    最后

    本篇给出了一些内置高阶函数的例子,其实在编程中使用得更多的是自定义的高价函数,其中 闭包 就是一种非常常用的函数式编程。

    展开全文
  • 本文的另一个特点是作者结合了局域网实时音频传输的课题给出了这些API函数的使用实例,使得全文不仅仅是单纯的API函数使用介绍,从而具有 相当的实用价值。 未经作者许可,请勿转载! 1 摘要 2 背景...
  • 闭包的定义与含义 闭:是指闭包的内部环境对外部不可见。 闭包具有控制外部域的能力,也就是可以访问外部环境的执行域,,...闭包函数的最大价值在于:我们可以在函数(f2)的外部(即子函数也就是f2函数),直接读
  • 函数式编程的特点 函数式编程核心价值在于多核并行编程。 1) 参数私有,没有线程安全问题,这样就为分布式高并发提供了支持 2) 把函数做为参数 3) 把函数的返回值作为参数 定义: 在js中方法和函数比较模糊。scala...
  • python 函数式编程

    2016-12-03 12:24:42
    函数式编程 首先要确定一点就是:函数 ...Python 函数式编程的特点 需要注意的是,Python 不是也不可能会成为一种纯函数是编程语言,但 Python 仍支持许多有价值函数式编程语言的构建方法。 Python 不是纯
  • 这篇文章主要介绍了Python Lambda函数使用总结详解,文中通过示例代码介绍非常详细,对大家学习或者工作具有一定参考学习价值,需要朋友可以参考下 lambda表达式是一种匿名函数,对应python中自定义函数def...
  • 函数式编程的特点 函数式编程核心价值在于多核编程。 1) 参数私有 val,没有线程安全问题,这样就为分布式高并发提供了支持 2) 把函数做为参数 3) 把函数的返回值作为参数 定义:在js中方法和函数比较模糊。...
  • 真像函数绘制软件v1.0

    2010-08-24 12:23:00
    当前大多数函数绘制软件不能够调整函数的位置和显示的精度,有的甚至只能绘制某个区间的图像(比如-10到10之间),实际使用价值不大。 至于计算和显示精度,严重关系到函数是否具有实际使用价值的关键。本软件使用...
  • 针对油气储量的特点,对油气储量价值的优劣等级进行划分。选取影响油气储量价值等级的7个因素.即储量规模、储量丰度、储层埋深、原油黏度、渗透率、凝固点和采收率,采用最小二乘支持向量机模型对油气储量价值等级...
  • 这篇文章主要介绍了在OpenCV里使用特征匹配和单映射变换方法本文通过图文实例代码相结合给大家介绍 非 详细具有一定参考借鉴价值,需要朋友可以参考下 前面已经学习特征查找和对应匹配接着下来在特征匹配之后...
  • 提供给新手学习 PHP新手教程,是一个比较有价值的PHP新手教程! 一、PHP简介 PHP是一种易于学习和使用服务器端脚本语言。只需要很少编程知识你就能使用PHP建立一个真正交互WEB站点。本教程并不想让你...
  • 我仍然相信该示例具有价值,我正计划在我下一个Lambda项目中对其进行更新。 感谢您理解。 产品特点 具有严格类型注释完整代码库-获得尽可能多编译时错误。 使用从命令行部署到只需运行一个npm脚本。 发布...
  • 限时优惠福利 原价 ¥99,本周特价仅需 ¥...Python 作为当下编程语言界“网红”,因为其应用广泛(Web/人工智能/大数据/机器学习/测试/运维/数据分析等等)、开发高效快速、简洁高效等特点,备受招聘企业青睐...
  • 限时优惠福利 原价 ¥99,本周特价仅需 ...Python 作为当下编程语言界“网红”,因为其应用广泛(Web/人工智能/大数据/机器学习/测试/运维/数据分析等等)、开发高效快速、简洁高效等特点,备受招聘企业青睐,...
  • 引言 本篇文章是根据航空公司提供的乘客个人信息,通过建立合理的客户价值评估模型,对客户进行分群,比较分析不同客户群的特点价值,来指定相应的营销策略,从而减少客户流失,挖掘出潜在客户,实现盈利。...
  • Comunion 是一个去中心化(DAO) 组织协作网络,提供面向数字时代全新商业基础设施和价值转化机制,致力于让劳动价值 像 资本一样自由流通、交易和积累。 本系列内容包含:基本概念及原理、密码学、共识算法、钱包...
  • 分析了扩频序列偏自相关函数的特点,提出了一种基于小波相关检测的扩频序列捕获方法,给出并推导一种实施算法,在扩频通讯中,这种基于小波变换的相关序列的捕获方法有一定的理论价值
  • 以销售收入利润率最大化为目标函数,构建了钢材结构优化的非线性规划模型在转化为线性规划求解时,在变量数量巨大的情况下,根据线性规划解的特点,定义了品种价值特征值,将模型求解转化为按价值特征值的排序进行计划量...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 327
精华内容 130
关键字:

价值函数的特点