为什么 Python 的 Range 要设计成左开右闭区间?
时间:2021-10-08
本文章向大家介绍为什么 Python 的 Range 要设计成左开右闭区间?,主要包括为什么 Python 的 Range 要设计成左开右闭区间?使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原博客地址:https://www.jianshu.com/p/5eaa330788e8
Python的range()函数是左开右闭的。而且,除了Python,其他的语言似乎也有类似的设计。Edsger W. Dijkstra 在1982年写过一篇短文章分析了一下其中的原因——当然,那时候没有Python,不过内在的逻辑是相同的,与语言无关。
分析
为了表示 2,3,...,12 这样一个序列,有四种方法
- 2≤ i < 13 (左闭右开区间)
- 1< i ≤ 12 (左开右闭区间)
- 2≤ i ≤ 12 (闭区间)
- 1< i < 13 (开区间)
其中哪一种方法时最好的表示方法呢?前两种的两端表示的序列差刚好是序列长度,而且两个相邻子序列的其中一个子序列的上界就是另一个子序列的下界。所以,我们可以排除3、4的方法。那么,1和2哪种方法更好呢?
最小的自然数是0。
注意到自然数是有最小值的——最小的自然数是0。当我们的下界取 < (像第二或第四种方法那样),那么我们无法用非自然数表示。例如,表示自然数0~5,用第二种方法表示为:-1 < i ≤ 5 。这种表示方法相对于第一种,真的反常规思维。因此,我们更倾向于表示0 < i < 6 。这样,才能真正的一切从0 开始。
对于取上界,如何表示空集?第一个是符合我们直觉的。
0≤i< 0 和 0<i≤0
第三是反直觉的——上界小于下界。
0≤i≤-1
所以,综合起来,第一个式子最直观。
让我们来思考另一个问题,默认的下界是0还是1 ?
- 当从 1 开始时,下标范围是 1 ≤ i < N+1;
- 而如果从零开始,下标范围是 0 ≤ i < N;
让我们的下标从零开始吧,这样,一个元素的下标就等于当前元素之前的元素的数量了。
总结
抛去分析过程,选择第一种方法(左开右闭的原因如下):
- 上下界之差等于元素的数量。
- 易于表示两个相邻子序列,一个子序列的上界就是另一个子序列的下界。
- 序列从零(最小自然数)开始计数时,下界的下标不是 -1(非自然数)。
- 表达空集时,不会使得上界小于下界。
有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
原文地址:https://www.cnblogs.com/luyj00436/p/15383058.html
- 韩政府公布虚拟货币投机行为打击对策
- SqlServer2005数据库文件损坏的拯救过程
- 2017年,人类在自己设计的所有游戏中都败给了AI,无一幸免
- 测试组,请用VSS命令行获取最新版本
- 想起温习一下JS中的this apply call arguments
- 学习利用JSON 摆脱表单与业务对象双向转换的繁琐工作
- 代码也疯狂:diagram生成流程图
- 设置你的Gravatar头像的方法
- 阅读Ext 学习Javascript(二)Core/Ext.extend 从继承说起
- IronPython资料
- WordPress免插件仅代码实现“返回顶部、返回底部、评论”效果(样式一)
- encodeURIcomponent编码和ASP.NET之间编码转换
- WordPress免插件仅修改代码去掉评论/留言里的链接
- 阅读Ext 学习Javascript(一)Core/Ext.js
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- mybatis-plus自定义sql注入器
- k8s代码走读---kube-controller-manager
- 我们一起学一学渗透测试——黑客应该掌握的HTML基础知识(一)
- 一套漏洞组合拳接管你的账号
- 我们一起学一学渗透测试——黑客应该掌握的HTML基础知识(二)
- 我用Paddle Lite在树莓派3b+上从零开始搭建“实时表情识别”项目
- mybatis-plus:自动填充功能
- 词义类比与全局词共现信息不可兼得?基于飞桨实现的GloVe说可以
- MyBatis-plus乐观锁插件
- Jmeter(十九) - 从入门到精通 - JMeter监听器 -上篇(详解教程)
- python---rsa加密根据指数和模生成加密参数模板
- 搞了这么多年终于知道接口和抽象类的应用场景了
- css实现页面加载动画
- 用Dota2“最强”算法PPO完成CarPole和四轴飞行器悬浮任务
- 【pyspark】广播变量のdestroy...