
Lambda函数、Map函数、Filter函数、Zip函数、Reduce函数。
Lambda函数是Python中功能最强大的函数之一,它有时也被称之为匿名函数。Map是程序员用来简化程序的Python内置函数,此函数可以在不使用任何循环的情况下对所有指定的元素进行迭代。Filter是Python中的另一个内置函数,当需要区分其他类型的数据时,这个函数非常有用。Filter函数经常用于根据特定过滤条件来提取数据。
Python(英国发音:/paθn/美国发音:/paθn/)是一种广泛使用的解释型、高级和通用的编程语言。Python支持多种编程范型,包括函数式、指令式、结构化、面向对象和反射式编程。它拥有动态类型系统和垃圾回收功能,能够自动管理内存使用,并且其本身拥有一个巨大而广泛的标准库。
先看几段Java8以前经常会遇到的代码:
创建线程并启动
比较数组
给按钮添加单击事件
对于这三段代码,我们已经司空见惯了。
Java复杂冗余的代码实现一直被程序员所诟病,好在随着JVM平台语言Scala的兴起以及函数式编程风格的风靡,让Oracle在Java的第8个系列版本中进行了革命性的变化,推出了一系列函数式编程风格的语法特性,比如Lambda表达式以及Stream。
如果采用Lambda表达式,上面三段代码的实现将会变得极为简洁。
创建线程并启动(采用Lambda版本)
比较数组(采用Lambda版本)
给按钮添加单击事件(采用Lambda版本)
格式:(参数) -> 表达式
其中:
一个参数
多个参数
0个参数
表达式块
在Java8中新增加了一个注解: [@FunctionalInterface],函数式接口。
什么是函数式接口呢?它包含了以下特征:
Lambda表达式的本质就是函数式接口的匿名实现。只是把原有的接口实现方式用一种更像函数式编程的语法表示出来。
Java8的javautilfunction包已经内置了大量的函数式接口,如下所示:
从中可以看出:
以下是一个综合的例子:
如果觉得这些内置函数式接口还不够用的话,还可以自定义自己的函数式接口,以满足更多的需求。
如果Lambda表达式已经有实现的方法了,则可以用方法引用进行简化。 方法引用的语法如下:
这样前面提到的Lambda表达式:
则可以替换为:
另一个例子:
可以替换为:
注意:方法名后面是不能带参数的! 可以写成Systemout::println,但不能写成Systemout::println(“hello”)
如果能获取到本实例的this参数,则可以直接用this::实例方法进行访问,对于父类指定方法,用super::实例方法进行访问。
下面是一个例子:
构造器引用和方法引用类似,只不过函数接口返回实例对象或者数组。 构造器引用的语法如下:
举个例子:
其中的labelsstream()map(Button::new)相当于 labelsstream()map(label->new Button(label))
再看个数组类型的构造器引用的例子:
把Stream直接转成了数组类型,这里用Button[]::new来标示数组类型。
先看一段代码:
一个lambda表达式一般由以下三部分组成:
参数和表达式好理解。那自由变量是什么呢? 它就是在lambda表达式中引用的外部变量,比如上例中的text和count变量。
如果熟悉函数式编程的同学会发现,Lambda表达式其实就是”闭包”(closure)。只是Java8并未叫这个名字。 对于自由变量,如果Lambda表达式需要引用,是不允许发生修改的。
比如下面的代码:
先说说为什么要在Java8接口中新增默认方法吧。
比如Collection接口的设计人员针对集合的遍历新增加了一个forEach()方法,用它可以更简洁的遍历集合。 比如:
但如果在接口中新增方法,按照传统的方法,Collection接口的自定义实现类都要实现forEach()方法,这对广大已有实现来说是无法接受的。
于是Java8的设计人员就想出了这个办法:在接口中新增加一个方法类型,叫默认方法,可以提供默认的方法实现,这样实现类如果不实现方法的话,可以默认使用默认方法中的实现。
一个使用例子:
默认方法的加入,可以替代之前经典的接口和抽象类的设计方式,统一把抽象方法和默认实现都放在一个接口中定义。这估计也是从Scala的Trait偷师来的技能吧。
除了默认方法,Java8还支持在接口中定义静态方法以及实现。
比如Java8之前,对于Path接口,一般都会定义一个Paths的工具类,通过静态方法实现接口的辅助方法。
接口中有了静态方法就好办了, 统一在一个接口中搞定!虽然这看上去破坏了接口原有的设计思想。
这样Paths类就没什么意义了~
使用Lambda表达式后可以大幅减少冗余的模板式代码,使把更多注意力放在业务逻辑上,而不是复制一堆重复代码, 除非你在一个用代码行数来衡量工作量的公司,你觉得呢?
这是lambda表达式, 一种语法(糖) ,可以简化代码,从java8开始支持lambda表达式
有的编程语言,很多早就有lambda表达式了, java从8才开始支持lambda表达式,算比较晚的了
我们以实现Runabble接口,来创建一个线程为例
一: 使用传统的匿名内部类来实现,
Thread t1 = new Thread(new Runnable() {@Override
public void run() {
Systemoutprintln("匿名内部类的方式实现Runnable接口");
}
});
t1start();
很多人觉得上面的写法比较啰嗦, 写那么多代码, 核心就是一句Systemoutprintln("")
二: lambda表达式实现
Thread t2 = new Thread(() -> {Systemoutprintln("lambda表达式的实现Runabble接口");});t2start();
lambda表示配合Java8流, 进行函数式编程, 可以简洁的完成很多比较啰嗦的逻辑
比如对一个List<Double>进行求和,求均值,求最大值,求最小值,元素个数 以前需要写较多的代码
Java8流和lambda表达式的 *** 作方法如下
// lambda表达式配合java8流List<Double> list = ArraysasList(59, 45, 62, 18, 37, 29, 252);
DoubleSummaryStatistics ds = liststream()collect(CollectorssummarizingDouble(x -> x));
Systemoutprintln("最小值:" + dsgetMin());
Systemoutprintln("最大值:" + dsgetMax());
Systemoutprintln("平均值:" + dsgetAverage());
// Systemoutprintln("数量:" + dsgetCount());
// Systemoutprintln("总和:" + dsgetSum());
相关的知识, 还是比较多, 建议先学习lambda表达式,然后学习java8流(stream)
威布尔是623%的原因是$x=\lambda$时,其中威布尔分布的值为最大值的$1/e$。
1、根据查询相关公开信息显示,在威布尔分布中,当$k=1$时,分布函数可以表达为$1-e^{-(x/\lambda)}$。这意味着当$x=\lambda$时,威布尔分布的概率密度函数的值为分布最大值的$1/e$,也就是623%。因此,当$k=1$时,威布尔分布的$632%$点被称为威布尔分布的特征寿命,这个数值在可靠性工程和产品设计中有着重要的参考价值。
产生泊松分布随机数的方法有很多种,其中比较常用的是以下两种方法:
方法一:逆变换法(Inverse Transform Method)
逆变换法的基本思路是利用累积分布函数(Cumulative Distribution Function, CDF)和均匀分布随机数产生非均匀分布的随机数。对于泊松分布,其概率质量函数(Probability Mass Function, PMF)可以表示为:
$$P(X=k)=\frac{\lambda^k}{k!}e^{-\lambda}$$
其中 $\lambda$ 是泊松分布的参数,$k=0,1,2,$。
泊松分布的累积分布函数为:
$$F(X\leq k)=\sum_{i=0}^{k}\frac{\lambda^i}{i!}e^{-\lambda}$$
为了得到一个泊松分布随机数 $X$,我们可以先生成一个均匀分布随机数 $U$,然后通过下面的逆变换公式计算出 $X$:
$$X=\max{k:U \leq F(X\leq k)}$$
其中 $\max$ 表示取最大值,$k$ 是泊松分布的取值范围,从 $0$ 开始逐渐增加。
方法二:拒绝采样法(Rejection Sampling)
拒绝采样法的基本思路是构造一个可以包含目标分布的“包络线”分布,并利用该分布来生成目标分布的随机数。对于泊松分布,我们可以将其包含在参数为 $\lambda$ 的指数分布中,即:
\frac{\lambda^k}{k!}e^{-\lambda},& x=k\\
0, & \text{otherwise}
\end{cases}$$
$$g(x)=e^{-\lambda}\frac{\lambda^x}{x!}, \quad x=0,1,2,\dots$$
则有:
$$\frac{f(x)}{cg(x)}=\begin{cases}
1/c, & x=0,1,2,\dots\\
0, & \text{otherwise}
\end{cases}$$
其中 $c$ 是一个常数,需要满足 $c\geq 1$。由于 $c$ 是常数,可以事先计算出来,所以我们可以先生成一个指数分布随机数 $Y$,然后再生成一个均匀分布随机数 $U$,最后判断 $Y$ 是否被接受,即:
- 如果 $Y=k$ 且 $U\leq \frac{f(k)}{cg(k)}$,则接受 $k$ 作为泊松分布的随机数;
- 否则,重新生成 $Y$ 和 $U$。
通过不断地重新生成 $Y$ 和 $U$,直到得到一个符合条件的随机数为止。
(1)ab共线,则有a=kb
即有e1+入e2=-2k入e1-ke2
故有1=-2k入,入=-K
即有入^2=1/2
即入=土根号2/2
(2)
e1e2=|e1||e2|cos60=1/2
ab=(e1+入 e2)(-2入e1-e2)=-2入e1^2-e1e2-2入^2e1e2-入e2^2
=-2入-1/2-2入^21/2-入
=-入^2-3入-1/2
=-(入+3/2)^2+7/4
因为入>=0,故入=0时有最大值是:-1/2
以上就是关于python中获取有效主题的函数全部的内容,包括:python中获取有效主题的函数、为什么要使用lambda表达式原来如此,涨知识了、java return () -> {system.out.println("");}等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)