-
带返回参数的_编程|如何简单理解函数的传参、返回、调用
2021-01-11 23:22:401 函数内部变量的局部性在一个函数中定义的变量(包括实参),其作用域仅限于定义它的函数中,在其它的函数不能使用,这种变量称为“局部变量”。局部变量的作用域:函数内部声明和定义的语句块(实参为整个函数),屏蔽...1 函数内部变量的局部性
在一个函数中定义的变量(包括实参),其作用域仅限于定义它的函数中,在其它的函数不能使用,这种变量称为“局部变量”。
局部变量的作用域:函数内部声明和定义的语句块(实参为整个函数),屏蔽语句块外的同名变量;
局部变量的存续期:在函数内部声明开始到语句块结束位置。
定义在函数之外的变量,其作用域范围为定义该变量的程序位置直到程序的结束,在其它的函数中,既可以使用该变量的值,对变量值的改变也在该变量的全部作用域范围内有效,这种变量称为“全局变量”。
2 清晰了解函数的调用、返回机制和流程
函数可以嵌套调用(不能嵌套定义),函数内部以return返回:
函数也可以递归调用(类似于嵌套调用):
对于递归调用,可以理解为函数体副本机制为n份,其实只有一份,只是局部变量和参数及返回位置在栈中有函数桢的副本。
3 函数调用是函数抽取的逆操作
我们在写代码时,当发现有一块可以利用的完成某一功能的代码时,便可将其封装成一个函数,且通过设置参数和适当的return方式让其在调用时更有一般性或通用性。我们想简单理解函数的传参、返回、调用,反过来,便可以想像将一个函数的函数体如何插回调用的位置(函数调用的实质也可以想像为函数体在调入点的插入)。
正如带参数的封装不会只是加一个函数体那么简单,插回肯定也不只是函数体复制回那么简单。
形参:左值,实参:右值,如:
int v =vp=vf=11;传值:f(int n =v)传指针:f(int* p = &vp)传引用:f(int& f = vf)在函数体中,函数体中的左值使用上述引用中的左值,函数体中的右值使用对应的右值。
想像一下,如果是值传递,或用const修饰的指针或引用传递,当时函数封装肯定考虑的是调用函数与封装函数相互之间的独立性,怎样将函数体插回呢?函数体中的变量参数如果用做左值时,则左值用形参,右值表达式中用右值即可,通过副本机制,可以达到不同的存储空间相互不受影响。
如果是指针传递呢?函数体中的参数则只需将解引用替换成变量参数即可。
如果是引用传递呢?函数体中的参数可以不做改变,因为引用本身就是一个有常量性质的由编译器实现了自动解引用的特殊指针,性质上像指针(形参),使用上像普通的存储数据值的变量(实参及函数体内的使用)。
对于主调函数,如果将被调函数用在表达式或参数中,利用被调函数的左值代替即可。
理解了上述想法,你就可以更好地理解以下概念了。
3.1 参数的输入性与输出性
一般而言,可以用过传址(包括指针、引用传递)实现输出性,输入性与输出性也可以理解为单向性与双向性,传值只实现了单向的数据输入(读操作),而传址却可以实现对调用函数中局部变量的修改(写操作)。通常,输入参数写在参数列表中的左边,输出参数写在参数列表中的右边。
3.2 副本与副作用
参数与返回值都使用了副本机制,只是传址或地址返回(包括指针和引用)的副本是一个地址,而传值或值返回却是一个临时对象(数据的完整复制)。
这里的副作用还是上述参数的输出性,因为传址,相当于调用函数与被调函数之间有了双向性,有可能完成写(左值更改)操作,也就产生了副作用(好处是函数之间通过这种副作用能形成联系,坏处是函数封装性的一种破坏)。
以上内容也可以总结为调用函数与被调函数之间的关系:
传值:相互之间独立(因为单向性或输入性或只读操作);
传址:相互之间依赖(因为双向性或输出性或可写操作),
3.3 左值与右值
按出现在表达式的位置及是否可以寻址可以将变量和表达式区分左值和右值。
传址的实参必须是变量,而传址的实参可以是左值也可以是右值。
如果是引用返回,函数调用还可以用做左值。
-End-
-
如何简单理解概率分布函数和概率密度函数?
2018-09-11 16:56:19本篇文章是在《应该如何理解概率分布函数和概率密度函数?》的基础上整理来的。非常感谢原作者。 目录 1先从离散型随机变量和连续性随机变量说起 2离散型随机变量的概率函数,概率分布和分布函数 2.1概率函数和...本篇文章是在《应该如何理解概率分布函数和概率密度函数?》的基础上整理来的。非常感谢原作者。
目录
1 先从离散型随机变量和连续性随机变量说起
对于如何分辨离散型随机变量和连续性随机变量,在贾俊平老师的《统计学》教材中,给出了这样的区分:
如果随机变量的值都可以逐个列举出来,则为离散型随机变量。如果随机变量X的取值无法逐个列举则为连续型变量。
进一步解释,离散型随机变量是指其数值只能用自然数或整数单位计算的则为离散变量。例如,企业个数,职工人数,设备台数等,只能按计量单位数计数,这种变量的数值一般用计数方法取得。反之,在一定区间内可以任意取值的变量叫连续变量,其数值是连续不断的,相邻两个数值可作无限分割,即可取无限个数值。例如,生产零件的规格尺寸,人体测量的身高,体重,胸围等为连续变量,其数值只能用测量或计量的方法取得。
形象点来解释::
画一幅画,左边是梯子,右边是斜坡。
像梯子一样能说出有多少层的,可描述的,是离散型随机变量;
像斜坡一样不能说出有多少层阶梯,不可描述的,是连续性随机变量。
需要注意的是,实际操作中梯子的阶高可能很小,看起来很像斜坡,需要放大看。2 离散型随机变量的概率函数,概率分布和分布函数
在理解概率分布函数和概率密度函数之前,我们先来看看概率函数和概率分布是咋回事。
为什么我们花这么大的力气去研究这个概念。因为它实在太重要了,为什么呢?在这里,直接引用陈希孺老师在他所著的《概率论与数理统计》这本书中说的:
研究一个随机变量,不只是要看它能取哪些值,更重要的是它取各种值的概率如何!
这句是本文的核心内容,本文的所有概念,包括概率密度,概率分布,概率函数,都是在描述概率!
2.1 概率函数和概率分布
2.1.1 概率函数
概率函数,就是用函数的形式来表达概率。
pi=P(X=ai)(i=1,2,3,4,5,6)
在这个函数里,自变量(X)是随机变量的取值,因变量(pi)是取值的概率。它就代表了每个取值的概率,所以顺理成章的它就叫做了X的概率函数。从公式上来看,概率函数一次只能表示一个取值的概率。比如P(X=1)=1/6,这代表用概率函数的形式来表示,当随机变量取值为1的概率为1/6,一次只能代表一个随机变量的取值。
2.1.1 概率分布
接下来讲概率分布,顾名思义就是概率的分布,这个概率分布还是讲概率的。我认为在理解这个概念时,关键不在于“概率”两个字,而在于“分布”这两个字。为了理解“分布”这个词,我们来看一张图。
离散型随机变量的值和概率的分布列表
在很多教材中,这样的列表都被叫做离散型随机变量的“概率分布”。其实严格来说,它应该叫“离散型随机变量的值分布和值的概率分布列表”,这个名字虽然比“概率分布”长了点,但是肯定好理解了很多。因为这个列表,上面是值,下面是这个取值相应取到的概率,而且这个列表把所有可能出现的情况全部都列出来了!
举个例子吧,一颗6面的骰子,有1,2,3,4,5,6这6个取值,每个取值取到的概率都为1/6。那么你说这个列表是不是这个骰子取值的”概率分布“?
长得挺像的,上面是取值,下面是概率,这应该就是骰子取值的“概率分布”了吧!大错特错!少了一个最重要的条件!对于一颗骰子的取值来说,它列出的不是全部的取值,把6漏掉了!
2.2 分布函数
说完概率分布,就该说说分布函数了。这个分布函数是个简化版的东西!全名应该叫概率分布函数。
看看下图中的分布律,这里的分布律明明就是我们刚刚讲的“概率函数”,完全就是一个东西。但是我知道很多教材就是叫分布律的。
概率分布函数就是把概率函数累加
我们来看看图上的公式,其中的F(x)就代表概率分布函数啦。这个符号的右边是一个长的很像概率函数的公式,但是其中的等号变成了小于等于号的公式。你再往右看看,这是一个一个的概率函数的累加!
发现概率分布函数的秘密了吗?它其实根本不是个新事物,它就是概率函数取值的累加结果!所以它又叫累积概率函数!
概率函数和概率分布函数就像是一个硬币的两面,它们都只是描述概率的不同手段!
3 连续型随机变量的概率函数和分布函数
连续型随机变量的“概率函数”换了一个名字,叫做“概率密度函数”。
为啥要这么叫呢?我们还是借用大师的话来告诉你,在陈希孺老师所著的《概率论与数理统计》这本书中,
如果这么解析你还是不太懂的话,看看下面的这个公式:
概率密度函数用数学公式表示就是一个定积分的函数,定积分在数学中是用来求面积的,而在这里,你就把概率表示为面积即可!
左边是F(x)连续型随机变量分布函数画出的图形,右边是f(x)连续型随机变量的概率密度函数画出的图像,它们之间的关系就是,概率密度函数是分布函数的导函数。
两张图一对比,你就会发现,如果用右图中的面积来表示概率,利用图形就能很清楚的看出,哪些取值的概率更大!所以,我们在表示连续型随机变量的概率时,用f(x)概率密度函数来表示,是非常好的!
但是,可能读者会有这样的问题:
Q:概率密度函数在某一点的值有什么意义?
A:比较容易理解的意义,某点的 概率密度函数 即为 概率在该点的变化率(或导数)。很容易误以为 该点概率密度值 为 概率值.
比如: 距离(概率)和速度(概率密度)的关系.
- 某一点的速度, 不能以为是某一点的距离
- 没意义,因为距离是从XX到XX的概念
- 所以, 概率也需要有个区间.
- 这个区间可以是x的邻域(可以无限趋近于0)。对x邻域内的f(x)进行积分,可以求得这个邻域的面积,就代表了这个邻域所代表这个事件发生的概率。
4 参考文献
【1】https://www.jianshu.com/p/b570b1ba92bb
【2】https://www.zhihu.com/question/23237834
-
简单理解函数式编程
2020-07-17 20:01:25函数式编程是一种编程范式,单纯的来说就是如何编写程序的方法论, 主要思想是把运算过程写存一系列嵌套函数调用 使用函数式编程的目标是使用函数来抽象作用在数据之上的控制流与操作从而在系统中 消除副作用并减少...定义
函数式编程是一种编程范式,单纯的来说就是如何编写程序的方法论,
主要思想是把运算过程写存一系列嵌套函数调用使用函数式编程的目标是使用函数来抽象作用在数据之上的控制流与操作从而在系统中
消除副作用并减少对状态的改变。一些基本概念
声明式编程
函数式编程属于声明范式编程这种范式会描述一系列的操作。但是并不会暴露他们是如何实现的或是数据量如何穿过他们的。
我们来看一个命令是编程的程序例子。假设你需要一个数组中收缩压数的平方
命令式编程有一下步骤:var arra = [1, 2, 3, 4, 5, 6, 7, 8, 9]; for (let i = 0; i < arra.length; i++) { arra[i] = Math.pow(arra[i], 2) } console.log(arra); //[1, 4, 9, 16, 25, 36, 49, 64, 81]
如果使用函数式来解决问题,只需要相对应的在每一个数组元素上的行为给与关注,将循环交给系统的其他部分去控制。完全可以让Array.map()去做这些工作
console.log([1, 2, 3, 4, 5, 6, 7, 8, 9].map(num => Math.pow(num, 2))); //[1, 4, 9, 16, 25, 36, 49, 64, 81]
循环是一种主要的命令控制结构很难重用,函数式编程是指尽可能地提高代码的无状态性还有不变性。开发者要学会使用那些没有副作用的和没有状态变化的函数也称为纯函数
副作用和纯函数
函数式基于一个前提 使用纯函数构建不可变的程序纯函数有一下性质
仅取决于提供的输入,而不依赖于任何在函数求值期间或调用间隔时可能变化的隐藏状态和外部状态.不会造成超出其作用域的变化,例如修改全局对象或引用传递的参数。
var counter=0 function increment(){ reutrn ++counte }
这个函数就不纯的应为他读取并修改了一个外部变量 即函数作用域外的counter 一般来说读取或写入外部资源都会产生副作用
上面一个函通过读取修改了一个外部的变量 而产生副作用其结果是不可见的。
引用性透明
引用透明是定义一个纯函数较为正确的方式。纯度在这个意义上表明-一个函数的参
数和返回值之间映射的纯的关系。因此,如果一个函数对于相同的输人始终产生相同的
结果,那么就说它是引用透明的。
为了使其引用透明,需要删除其依赖的外部变量这一状态,使其成为函数签名中显
式定义的参数。var increment = counter => counter + 1 }
现在这个函数是相对稳定的 对于相同的输出结果否则改函数的返回值总会受到一些外部因素的影响
状态不可变性
函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。现在已经了解一下函数式编程的基本原则我们现在可以简洁的描述他
函数式编程是指为创建不可变的程序通过消除外部可见的副作用,对函数的声明式的求值过程
更新中…
-
如何理解Logistic函数
2019-11-28 23:22:22Logistic函数的简单理解 问题:为什么会有这个函数,他的物理意义,应用场景,发现(发明)背景,解决的问题都是什么? 回答: 统计学角度 Logisitc模型是广义线性模型中的一类。常用于分类。在业界有相关广泛的应用...Logistic函数的简单理解
问题:为什么会有这个函数,他的物理意义,应用场景,发现(发明)背景,解决的问题都是什么?
回答:
统计学角度
Logisitc模型是广义线性模型中的一类。常用于分类。在业界有相关广泛的应用。常见的如信用评分模型,用于判定某个人的违约概率。
-
动机——logit变换
在现实生活中,有时候需要探究某一事件A发生的概率与某些因素之间的关系。考虑到很多情况下,在或附近,对的变化并不敏感,即这附近,需要发生很大的变化才能引起的微弱改变。如,“农药的剂量为X的情况下,杀死害虫的概率P”之间,就具有这种关系。因此,我们要构造这么一个关于P的函数,使得它在P=0或P=1附近,P的微小变化对应的较大改变,同时,要尽可能简单。于是,自然有了如下构造的特性
于是
就是logi变换。 -
模型——Logistic回归
为了建立因变量P与自变量X之间的合理变动关系,一个很自然的假设就是线性关系。即
但是正如前面所说的,某些情况下,在P=0或P=1附近,P对X的变化并不敏感,即这附近,X需要发生很大的变化才能引起P的微弱改变,而上式简单的线性关系是不能反映这一特征的。这个时候,我们构造的就派上用场了,于是有了
由
于是上式等价于
这就是回归模型。
生活应用
我们先说一个实现生活中的例子。在现实生活中,我们发现有些规律性的变化,比如:农药杀虫,用药量越大,杀虫的概率越大。但是,随着农药用量越来越大,杀虫概率增长越来越慢,最后增长速率慢慢接近为0。最后,就算您使用的全球海水总量的农药来杀虫,总有虫子是死不了的。上述现象可以得出一个结论,就是当一个事情发生的概率 和 影响这个事情发生的因素之间存在一种关系,如图:
横坐标为农药计量,纵坐标为杀虫概率
上图反应的就是因素的值无限放大 或 缩小的过程中,概率越接近于0,1时,因素对概率的影响越小。根据上述结论(如上面举得农药杀虫的例子),在 或 附近,使得 对 的变化并不敏感(即 变化很大, 变化很微小)。
因此,我们的目标函数是一个在 或 附近,的微小变化,对应(即 )的较大变化;同时 要足够简单。
从变化入手,想到了求导。
于是,我们比较容易想到这样的一个函数:
这个等式 在 或 附近,数值是接近 ,即变化很大
那么,对上式积分:
又因为:
所以:
所以有结论:
于是logistic函数为参考来源:
link.
ID:jwtiger
ID:知乎用户
腾讯科技(深圳)有限公司 数据分析师 -
-
【C++】如何理解函数模板【1】--函数模板是什么以及简单程序示例
2019-06-23 22:31:09基本理解示意 -
python复杂函数表达_如何理解Python函数的深层次表述——化复杂为简单
2020-12-21 03:05:251、从简单开始import os❶ def hello():❷ """显示简单的语句"""❸ print("我就是你,小花!")hello()执行结果:C:\Users\kangs\anaconda3\python.exe E:/PythonAlgorithms/pythonfun2020/def1.py我就是你,小花!... -
交叉熵损失函数优缺点_如何简单通俗的理解交叉熵损失函数?
2020-12-19 05:16:48前面小编给大家简单介绍过损失函数,今天给大家继续分享交叉熵损失函数,直接来看干货吧。一、交叉熵损失函数概念交叉熵损失函数CrossEntropy Loss,是分类问题中经常使用的一种损失函数。公式为:接下来了解一下... -
一文看懂如何简单实现节流函数和防抖函数
2020-12-11 14:13:43今天自己翻阅了一些资料之后,来简单的谈谈我对节流函数和防抖函数的理解,希望能帮助大家理解; 节流函数 顾名思义,就是节省流量节省内存性能的一种函数,可以理解为是一种性能优化方案; 举个例子:一个水龙头... -
如何理解signal函数声明
2014-04-08 00:07:43Signal函数用起来其实很简单,但是回头看看他的声明,相信会有很多人表示费解。自己也在这个问题中纠结了好几年了,今天终于弄明白,很是兴奋,一起分享一下。 先看函数原型:void (*signal(int signo, void (*... -
什么是python简单解释_如何最简单、通俗地理解Python的函数?
2020-12-13 21:42:15目录:一、笔记二、我的自学路线三、笔记目录一、笔记① 函数是组织好的,可重复使用的。② 函数代码块以def关键词开头、后接函数标识符名称和圆括号()。③ 任何自变量、传入参数必须放在圆括号中间。④ 函数内容以... -
python有像sumif的函数吗_如何最简单、通俗地理解Python的函数?
2020-12-08 21:51:54目录:一、笔记二、我的自学路线三、笔记目录一、笔记① 函数是组织好的,可重复使用的。② 函数代码块以def关键词开头、后接函数标识符名称和圆括号()。③ 任何自变量、传入参数必须放在圆括号中间。④ 函数内容以... -
把简单的print 函数进行了等价形式扩展,请问如何理解?
2019-10-11 17:14:23 第29行的扩展形式不好懂,如何理解? -
如何控制事物_如何理解李雅普诺夫函数的物理意义
2021-01-11 10:41:17(一)控制系统与宏观物体运动的对应关系控制系统中的状态运动完全可以和现实中的宏观物体运动对应起来,比如一个最简单的一阶惯性环节就可以看成是沿一条直线运动的物体,位置即状态量。高阶系统的状态,就可以等效... -
如何理解回调函数 CallBack
2016-05-05 11:00:26如果是初次接触Windows程序的人,一般理解回调函数觉得非常困难,笔者下面非常简单的程序剥开回调函数的真面目。 笔者使用的编译器是VS2008,所以有这行代码 #include "stdafx.h", // TestConsole.cpp : ... -
二元函数可微与可导的关系_如何理解多元函数可微与可偏导的关系?
2021-01-14 06:50:52原标题:如何理解多元函数可微与可偏导的关系?谈到多元函数可微与可偏导时,相信不少人头皮有点发麻。一元函数中,可微与可导是等价的,但是在多元函数中,可微与可偏导之间的关系就没那么简单了,这是为什么呢?... -
概率密度函数及其在信号方面的简单理解(上)概率密度函数
2020-04-14 22:41:28概率密度及其在信号方面的简单理解1. 上篇1.1 离散随机变量与连续型随机变量1.2 离散随机变量与概率分布1.2.1 概率函数1.2.2 概率分布1.2.3 概率分布函数1.3 连续型随机变量与概率密度2. 下篇2.1 概率密度函数与通信... -
如何理解C语言中的函数部分
2020-12-18 11:39:37C语言中函数分为自定义函数和库函数,C语言刚出现时,只有一些简单的if语句,或者for循环等,并没有类似printf,scanf函数,所以就导致了大家的代码不能共通,而且这些函数被频繁大量的使用,如果不定义共同的函数,... -
如何运行函数_程序员应如何理解高并发中的协程
2021-01-10 22:34:11作为程序员,想必你多多少少听过协程这个词,这项技术近年来越来越多的出现在程序员的视野当中,尤其高性能高并发领域。...普通的函数我们先来看一个普通的函数,这个函数非常简单:def func(): print("a") print(... -
sigmoid和softmax激活函数的简单理解
2019-05-16 16:15:39使用softmax和sigmoid激活函数来做多类分类和多标签分类 在实际应用中,一般将softmax用于多类分类的...下面介绍如何使用softmax和sigmoid完成对应的分类任务。 softmax激活函数应用于多类分类 假设神经网络模... -
c、c++函数指针简单理解
2013-05-23 00:42:57如何定义一个函数指针呢?1、函数指针的定义 一个变量其要体现类型信息,比如一个指向int类型的指针,其定位为 int *pInt=NULL; 其中*表示该定义为一个指针,int确定了指针的类型,以此原则,函数指... -
二元函数可导与可微的关系_如何理解多元函数可微与可偏导的关系?
2020-12-20 02:31:21一元函数中,可微与可导是等价的,但是在多元函数中,可微与可偏导之间的关系就没那么简单了,这是为什么呢?本文小编将以二元函数为例进行详细的说明。1.二元函数的可偏导在二元函数中,一元函数的可导的概念变为可... -
python函数如何使用_如何调用python函数?
2020-12-07 18:01:03原标题:如何调用python函数? 函数function是python编程核心内容之一,也是比较重要的一块。在本文中主要介绍下函数的概念和基础函数相关知识点。函数是什么?有什么作用、定义函数的方法及...简单的理解下函数的... -
如何理解柯里化|函数式编程
2021-01-02 14:26:47这里我们来谈论下函数式编程中另一个重要的概念,柯里化 首先,我们先通过下面的方式将上节代码中不纯的函数变成纯函数。就是将mini拿到函数内部去...我们要解决硬编码也比较简单,只是需要把18提取到参数位置就可以了 -
如何简单的理解递归
2018-10-06 16:46:01递归这玩意不知道有多折磨人,我折腾了快1天了也没有搞懂,直到看到这篇文章:...事实上,我们并不是每个函数都需要跟进去看执行结果的,比如我们在自己的函数中调用printf函数时,并没有钻进去看它... -
如何简单理解js中this的指向
2018-06-27 16:27:00我们要明白this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(网上大部分文章都是这样写的,但是个人觉得有点不全面吧,理解this指向... -
如何理解lwip中的回调函数
2018-11-24 16:01:20那么怎么理解这个回调函数呢? 简单的讲,回调函数指的是我们在接收到某个事件之后,所需要紧接着进行的行为。比如说,我们在进行udp receive的时候,接收完成后我们希望立刻将所接收到的数据回传过去,这个时候...