python多分支结构实例_JS优化多分支结构(经典)

多分支结构的优化有很多好处:既方便代码维护,又可以提升代码执行效率。例如,设计有多个条件,只有当多个条件都成立时,才允许执行特定任务。

示例1

遵循简单的设计思路,使用多重分支逐个检测这些条件。

if (a) {

if (b) {

if (c) {

if (d) {console.log("所有条件都成立!"); }

else {console.log("条件 d 不成立!"); }

} else {console.log("条件 c 不成立!"); }

} else {console.log("条件 b 不成立!"); }

} else {console.log("条件 a 不成立!"); }

示例2

上述设计没有错误,结构嵌套合法。不过可以使用逻辑运算符进行优化。

if (a && b && c && d) {console.log("所有条件都成立!"); }

比较而言,使用 if 语句逐个检测每个条件的合法性,并对某个条件是否成立进行个性化处理,以方便跟踪。但是使用 if (a && b && c && d) 条件表达式,就没法进行过程跟踪。例如,如果 a 条件不成立,则程序会自动退出整个流程,而不管 b、c 和 d 的条件是否成立。这会使代码跟踪变得很困难。

示例3

优化设计思路,采用排除法,对每个条件逐一进行排除,如果全部成立则再执行特定任务。在排除过程中,使用一个标志变量把每一次条件检测联系在一起,最后根据这个标志变量决定是否完成特定任务。

var t = true; //初始化标志变量为true

if (! a) {

console.log("条件 a 不成立!");

t = false; //如果条件a不成立则标志变量为false

}

if (! b) {

console.log("条件 b 不成立!");

t = false; //如果条件a不成立则标志变量为false

}

if (! c) {

console.log("条件 c 不成立!");

t = false //如果条件a不成立则标志变量为false

}

if (! d) {

console.log("条件 d 不成立!");

t = false; //如果条件a不成立则标志变量为false

}

if (t) { //如果标志变量为true,则执行特定任务

console.log("所有条件都成立!");

}

排除法有效避免了条件嵌套的复杂性,不过这种设计也存在一定的局限性,例如,一旦发生错误,后面的操作将被放弃。为此还可以再设计一个标志变量来跟踪错误。

数据映射

在多分支检测中,表达式的重复运算会影响性能。如果检测的条件满足下面两条,可以考虑使用数据映射来快速匹配,这样有助于代码的可读性,大大提高了代码的响应速度。

条件体的数量庞大

测试的条件值呈现离散状态

实现方法:通过数组或普通对象实现。

示例1

在下面代码中,使用 switch 多分支检测离散值。

function map(value) {

switch (value) {

case 0 : return "result0";

case 1 : return "result1";

case 2 : return "result2";

case 3 : return "result3";

case 4 : return "result4";

case 5 : return "result5";

case 6 : return "result6";

case 7 : return "result7";

case 8 : return "result8";

case 9 : return "result9";

default : return "result10"

}

}

示例2

针对示例 1 可以使用数组查询替代 switch 语句。下面代码把所有离散值存储到一个数组中,然后通过数组下标快速检测元素的值。

function map(value) {

var results = ["result0","result1","result2","result3","result4","result5",

"result6","result7","result8","result9","result10"]

return results[value];

}

使用数据映射法可以消除所有条件判断,但由于没有条件判断,当候选值数量增加时,基本不会增加额外的性能开销。

如果每个键映射的不是简单的值,而是一系列的动作,则使用 switch  更适合。当然,也可以把这些动作包装在函数中,再把函数作为一个值与键进行映射。

示例3

如果条件查询中键名不是有序数字,则无法与数组下标映射,这时可以使用对象数据映射法。

function map(value) {

var results = {

"a" : "result0","b" : "result1","c" : "result2","d" : "result3","e" : "result4","f" : "result5",

"g" : "result6","h" : "result7","i" : "result8","j" : "resukt9","k" : "result10"

}

return results[value];

}

调整分支顺序

在多分支结构中,各种条件存在先后、轻重的顺序。如果把最可能的条件放在前面,把最不可能的条件放在后面,那么程序被执行时总会按照代码先后顺序检测所有条件,直到发现匹配的条件时才停止。如果把最可能的条件放在前面,就等于降低了程序的检测次数,自然也就提升了分支结构的执行效率,避免空转。这在大批量数据检测中效果非常明显。

示例1

对于一个论坛系统来说,普通会员的数量要远远大于版主和管理员的数量。大部分登录的用户都是普通会员,如果把普通会员的检测放在分支结构的前面,就会减少每次检测的次数。

switch (level) { //优化分支顺序

case 1 :

console.log("普通会员");

break;

case 2 :

console.log("版主");

break;

case 3 :

console.log("管理员");

break;

default :

console.log("请登录");

}

在性能影响不大的情况下,遵循条件检测的自然顺序会更易于理解。

示例2

设计检测周一到周五值日任务安排的分支结构。可能周五的任务比较重要,或者周一的任务比较轻,但是对于这类有着明显顺序的结构,遵循自然顺序比较好。打乱顺序,把周五的任务安排在前面,对于整个分支结构的执行性能没有太大帮助,打乱的顺序不方便阅读。因此,按自然顺序来安排结构会更富有可读性。

switch (day) {

case 1 :

console.log("周一任务安排");

break;

case 2 :

console.log("周二任务安排");

break;

case 3 :

console.log("周三任务安排");

break;

case 4 :

console.log("周四任务安排");

break;

case 5 :

console.log("周五任务安排");

break;

default :

console.log("异常处理");

}

分支之间的顺序应注意优化,当然,对于同一个表达式内部也应该考虑逻辑顺序问题。由于逻辑与或逻辑或运算时,有可能会省略右侧表达式的计算,如果希望右侧表达式不管条件是否成立都被计算,就应该考虑逻辑顺序问题。

示例3

有两个条件 a 和 b,其中条件 a 多为真,而 b 是一个必须执行的表达式,那么下面逻辑顺序的设计就欠妥当。

if (a && b) {

//执行任务

}

如果条件 a 为 false,则 JavaScript 会忽略表达式 b 的计算。如果 b 表达式影响到后面的运算,则不执行表达式 b,自然会对后面的逻辑产生影响。因此,可以采用下面的设计思路,在 if 结构前先执行表达式 b,这样即使条件 a 的返回值为 false,也能够保证 b 表达式被计算。

var c = b;

if (a && b) {

//执行任务

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matplotlib plt.plot

实例1 import matplotlib.pyplot as plta [1, 2, 3, 4] # y 是 a的值,x是各个元素的索引 b [5, 6, 7, 8]plt.figure(demon plot) plt.plot(a, b, r--, label aa) plt.xlabel(this is x) plt.ylabel(this is y) plt.title(this is a demo) plt.legend(locupper l…

使用UAA OAuth2授权服务器–客户端和资源

在上一篇文章中,我介绍了如何使用Cloud Foundry UAA项目启动OAuth2授权服务器,以及如何使用OAuth2授权代码流程中涉及的一些参与者来填充它。 我已经在Digital Ocean网站上找到了这篇文章,在描述OAuth2授权代码流方面做得非常好,…

二分查找思想

二分查找 二分查找思想应用于对有序的数组进行查找操作。 时间复杂度 二分查找也称为折半查找,每次都能将查找区间减半,这种折半特性算法时间复杂度为O(logn)。 mid计算 有两种计算中值mid的方式: m(lh)/2ml(h-l)/2lh可能出现加法溢出&#x…

ad20如何导入库_脱水防锈油如何使用才正确?

导Lead语根据调查了解,很多厂家在使用脱水防锈油的办法不正确而导致防锈效果失效或不明显。那么脱水防锈油应该如何使用才正确呢?中阳润滑油为大家简单讲述如下。脱水防锈油脱水防锈油是由矿物油及脱水、防锈抗氧化等多种添加剂配制而成,既可…

matplotlib  plt.lengend

参考文档 https://www.cnblogs.com/lfri/p/12248629.html 官方文档 https://matplotlib.org/api/_as_gen/matplotlib.pyplot.legend.html matplotlib plt.lengend 作用:用于给图像加图例。 1、语法参数如下: matplotlib.pyplot.legend(*args, **kwargs) 2、…

Python进阶(上下文管理器与with语句)

/*上下文管理器必须有__enter__和__exit__方法*/ class MyResource:def __enter__(self):print(链接资源)return self/*__exit__返回True表示异常只会在__exit__中被捕获,不会继续传递到with语句的之外的except中,如果返回false,则会把异常也…

matplotlib  plt.scatter

https://www.cnblogs.com/lfri/p/12248629.html matplotlib plt.scatter 作用:画散点图 plt.scatter() 参数如下: x,y X和Y是长度相同的数组 s size,点的大小,标量或与数据长度相同的数组 c color,点的颜色,标量或与数据长…

Git 备忘录

整理了一下工作中常用的 Git 操作,持续更新中...merge单个文件例如 B分支想要合并A分支的某个文件首先,我们切换到B分支 git checkout branch B之后,我们checkout A 分支的a文件,git checkout --patch A a路径 最后&#xff0c…

spark任务shell运行_大数据系列:Spark的工作原理及架构

介绍本Apache Spark教程将说明Apache Spark的运行时架构以及主要的Spark术语,例如Apache SparkContext,Spark shell,Apache Spark应用程序,Spark中的任务(Task),作业(job)和阶段(stage)。此外,我们还将学习…

使用RESTful Client API进行GET / POST

互联网上有很多如何使用RESTful Client API的东西。 这些是基础。 但是,尽管该主题看起来微不足道,但仍然存在一些障碍,尤其是对于初学者而言。 在这篇文章中,我将尝试总结我的专业知识,以及我如何在实际项目中做到这…

matplotlib plt.lengend图例放在图像的外侧

参考:https://www.jb51.net/article/186659.htm matplotlib plt.lengend图例放在图像的外侧 1、图例在图中实例 import numpy as np import matplotlib.pyplot as plt# 定义x,y X np.linspace(0, 2*np.pi, 32, endpointTrue) C np.cos(X)# figure的名称 plt.figur…

和搜狗输入法快捷键冲突_这款输入法被调教多年不输搜狗,爱了奥里给!

自从搜狗输入法被曝“推广门”之后,许多小伙伴开始寻找新的替代品。这期间,我也尝试了很多输入法,比如手心输入法、小狼毫输入法等。我以易用性、候选字质量和辅助输入功能三个方面作为考量标准,最终选定Win10默认的输入法&#x…

预期的异常规则和模拟静态方法– JUnit

今天,我被要求使用RESTful服务,所以我开始遵循Robert Cecil Martin的TDD规则实施该服务,并遇到了一种测试预期异常以及错误消息的新方法(对我来说至少是这样),因此考虑共享我的实现方式作为这篇文章的一部分…

Linux安装部署FTP服务器

Linux安装部署FTP服务器 本文章会将安装FTP服务器的步骤以及一些遇到的问题来记录下 因为项目中要与第三方对接数据,需要用到FTP服务器以提供他们每天上传数据,因为之前在本地的VMware虚拟机上部署过一次,这次则在天翼云上部署。 首先&#x…

广度优先搜索

转载 https://www.cnblogs.com/skywang12345/p/3711483.html 1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS。 它的思想是:从图中某顶点v出发&#xff…

转https_免费!这个PPT转PDF的方法不学可惜!

职场人士对PPT演示文档都不陌生,尤其是商务、营销团队利用PPT向客户推荐产品、推广计划更是家常便饭。但是作为一个合格的商务营销人员,汇报、方案只保存PPT一种格式是远远不够的,因为经常在不同产地演示,而不同的设备可能对不同版…

深度优先搜索

转载:https://www.cnblogs.com/skywang12345/p/3711483.html 深度优先搜索 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点…

jvm类加载机制和类加载器_在JVM之下–类加载器

jvm类加载机制和类加载器在许多开发人员中,类加载器是Java语言的底层,并且经常被忽略。 在ZeroTurnaround上 ,我们的开发人员必须生活,呼吸,饮食,喝酒,并且几乎与类加载器保持亲密关系&#xff…

光源时间_您的国美备战时间已不足一个月!绝密国美考点、考场、光源分析送上!...

中国美术学院2020年本科招生考试报名公告,终于在前几天公布了!今年国美一共设置了三个考点,报名也已经正式开启啦!考点设置杭州考点:不设报考人数上限,接受全国所有省份考生报考(含广东省、河南省)深圳考点…

ltp-ddt eth_iperf_tcp iperf dualtest遇到的问题

ltp-ddt eth_iperf_tcp server端:iperf -s -i 5 -w 1M client端将ddt的核心代码抠出来: iperf -c 1921.68.40.41 -m -M 1500 -f M -d -t 60 -w 8K 手动运行三次后,server端挂了,client端报错:connect failed: Connecti…