python中的索引从几开始计数_计算机为什么要从 0 开始计数?

afd39894cb7109a84c4f37ad5211d34e.png

作者:程序喵大人

来源:程序喵大人

大家好,我是猫哥!

众所周知,计算机是从0开始计数,而不是我们平时常用的从1开始计数,但你有想过为什么吗?

其实不是计算机从0开始计数而是多数编程语言中的数组都使用0作为起始下标,又是为什么呢?

这个问题超纲了,程序喵不会,但是本着对科学的敬畏之心,经过大量的搜索查证,我终于找到了答案。

故事还要从一位真正的大佬艾兹格·迪科斯彻(Dijkstra)讲起,

艾兹格·W·迪科斯彻Dijkstra

结构程序设计之父

提出“goto有害论”;

提出信号量和PV原语;

解决了“哲学家聚餐”问题;

Dijkstra最短路径算法和银行家算法的创造者;

THE操作系统的设计者和开发者;

第一个Algol 60编译器的设计者和实现者;

与D. E. Knuth并称为我们这个时代最伟大的计算机科学家的人。

这里贴出我翻译后的大佬语录:为了表示自然数1,2,3,4...14...的子序列,一般有四种序列的表示方法:

a) 2 ≤ i < 13

b) 1 < i ≤ 12

c) 2 ≤ i ≤ 12

d) 1 < i < 13

以上的几种表达方式里,有哪一种比其他的好吗?

是的,a和b有较为明显的优点:他们上下界数值之间的差值就是这个序列的长度。在任何一种表示中,两个子序列相邻,最好是其中一个的上界等于另外一个的下界,但这还不能抉择出a和b方式哪种更好,继续分析;

假设序列里要包含最小的自然数,如果使用b和d这种方式,那下界就必须是个非自然数,这就不太好看了,所以这里更倾向于使用a和c的方式,即使用≤方式表示下界。这里如果使用≤表示上界,那一个空的子序列表示方式也将会很丑陋,所以对于上界,大佬的结论是更喜欢使用a和d中的

当需要表示一个长度为N的序列时,如果想通过下标来区分其中的元素,那又来了一个棘手的问题:初始元素的下标值应该用多少呢,如果从1开始,那范围变成1 ≤ i < N+1,如果从0开始,那范围会是0 ≤ i < N,显然后一种方式更优雅更直观,所以大佬最后的结论是自己更倾向于一个序列的表示最好从0开始。

大佬语录总结

在进行范围表达的时候,使用左闭右开的方式更优雅,他思考过,在处理长度为N的序列时,到底第一个元素的下标使用0更合适还是使用1更合适?他的出发点很简单,那就是哪种方式更优雅。首先确定使用左闭右开的方式,当下标从1开始时,下标范围为1<=i

难道只有优雅这一个原因吗?其实下标从0开始主要的意义是表示偏移,下面举例:

数组为什么起始下标是0?其实数组是一种线性结构,它有一段连续的内存空间,存储一组具有相同类型的数据。

如图,拿一个长度为10的int类型数组举例,系统就会为该数据分配一段连续的内存空间,空间大小为40个字节,其中内存块首地址base_address = 100。

6673328e5f96a588396dae56ba64af06.png

数组是可以随机访问的,当访问第i个元素时,需要定位第i个元素的地址,定位公式如下:

第i个元素地址=base_address + i * data_type_size

其中data_type_size表示数组中元素类型的大小,int类型大小是4字节,所以公式里data_type_size等于4。在这里,下标可以理解为偏移,数组的首地址就是base_address,其中a[0]就是偏移为0的位置,a[i]就是偏移了i个data_type_size大小的位置,所以计算a[i]地址的公式为:

a[i]地址=base_address + i * data_type_size

这里如果数组下标从1开始,那么a[i]地址的公式为:

a[i]地址=base_address + (i - 1) * data_type_size

两个公式显而易见,下标从0开始的更加简单,后者从1开始,每次访问数组元素都需要额外做一次减法操作,效率更低。

我们知道在Python中数组也是将0作为起始下标,对此Python之父Guido van Rossum也给出过正面回答,下面贴出他的翻译后的语录:

大佬语录

关于这个问题之前就有人在Twitter上询问过我,我给出过回答。这个问题我思考过很久:ABC语言是Python的祖先之一,使用的索引就是从1开始的,而另一门对Python有重要影响的C语言,它的索引就是从0开始。之前的几门编程语言(Algol,Fortran, Pascal)有使用1作为起始索引的,有使用某个变量作为索引。而推动我使用0作为起始索引的原因之一就是切片语法。

让我们先来看看切片的用例,可能关于切片最常见的用法就是“取前n个元素”和“取从i开始的后n个元素”,如果在使用这两种用法时不需要带有+1或者-1的补偿操作,那代码会很优雅。

使用基于0的索引方式,那上面两种切片用法就会非常漂亮:a[:n]和a[i:i+n],前者是a[0:n]的缩写。

使用基于1的索引方式,如果你想用a[:n]表示取前n个元素的意思,要么使用闭合区间切片语法,要么使用起始索引加切片长度作为参数的方法。半开区间切片方法如果和基于1的索引方式结合起来那代码将会变得不优雅。而如果使用闭合区间切片语法的话,为了从第i位索引开始取n个元素,那就需要把表达式写成a[i, i+n-1]。这样看来也许使用切片起始位+长度的方式在基于1的索引方法中更合适?这样你可以写成a[i:n],并且ABC语言就是这么做的,你可以写成a@i|n这种特别的语法。

但是,index:length这种方式在其它情况下也适用吗?我有点记不清了,但我认为我确实是被半开区间这种优雅的语法迷住啦。特别是当两个切片操作相邻时,第一个切片的终点索引是第二个切片的起始索引时,这种语法简直太漂亮啦。例如你想要将一个字符串使用i和j分成三部分,这三部分会是a[:i],a[i:j]和a[j:],真是太漂亮啦。

这就是为什么Python使用0作为起始索引的原因。

看到这里你知道为什么很多编程语言都是从0开始计数了吗?

另外,关于列表和索引,我们之前也介绍过,推荐阅读:

参考资料

https://www.cs.utexas.edu/~EWD/transcriptions/EWD08xx/EWD831.html

https://blog.csdn.net/csdnsevenn/article/details/107421466

https://docle.github.io/2018/08/26/Why-Numbering-Should-Start-At-Zero/

https://www.reddit.com/r/Python/comments/1p2za1/guido_van_rossum_why_python_uses_0based_indexing

Python猫技术交流群开放啦!群里既有国内一二线大厂在职员工,也有国内外高校在读学生,既有十多年码龄的编程老鸟,也有中小学刚刚入门的新人,学习氛围良好!想入群的同学,请在公号内回复『交流群』,获取猫哥的微信 (谢绝广告党,非诚勿扰!)~

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

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

相关文章

python os.environ windows_python 获取系统环境变量 os.environ and os.putenv

从一段code说起 “if "BATCH_CONFIG_INI" in os.environ:” 判断环境变量的值有没有定义如果定义的话就去环境变量的值&#xff0c;否则就取当前目录下的config.ini文件。if "BATCH_CONFIG_INI" in os.environ:print "Using custom ini file!"se…

coreos 安装mysql_如何执行CoreOS Linux的裸机安装

本文将介绍如何在裸机服务器上加载CoreOs Linux。关于在计算机上安装CoreOS Linux的更多方法。在本文中&#xff0c;我们将首先启动一些Live Linux发行版。从USB或CDROM提取Fedora&#xff0c;然后使用CoreOS的安装脚本在给定的硬盘驱动器上执行实际的CoreOS Linux。您将需要什…

python selenium截图_python+selenium截图操作样例

# -*- coding:utf-8 -*-# explain : 截图操作import os, timeclass Picture:"""截图操作分为正常的操作截图truepicture和异常的操作截图errorpicture"""def __init__(self, driver, path):""":type driver: selenium.webdriver.…

java环形队列测试,JAVA数据结构之循环队列的实现

1、循环队列CircleQueue类的实现代码如下所示&#xff1a;public class CircleQueue {private Object[] array;private int capacity;//队列容量private int count;//队列中元素的个数private int front;private int rear;public CircleQueue(int capacity){this.capacity cap…

websocket 发送图片_基于WebSocket的web端IM即时通讯应用的开发

基于WebSocket的web端IM即时通讯应用的开发功能列表&#xff1a;1、Web端的IM即时通讯应用2、支持上线、下线、实时在线提醒3、单聊、群聊的建立4、普通文字、表情、图片的传输(子定义富文本)5、单人的顶级提醒&#xff0c;多对话的窗口的提醒6、调用图灵机器人的自动回复演示目…

php处理结果集,php中mysqli 处理查询结果集的几个方法

最近对php查询mysql处理结果集的几个方法不太明白的地方查阅了资料&#xff0c;在此整理记下Php使用mysqli_result类处理结果集有以下几种方法fetch_all()抓取所有的结果行并且以关联数据&#xff0c;数值索引数组&#xff0c;或者两者皆有的方式返回结果集。fetch_array()以一…

python gamma函数_python gamma矫正

这个函数&#xff0c;主要用来做对比度调整&#xff0c;利用 gamma 曲线 或者 log 函数曲线&#xff0c;gamma 函数的表达式&#xff1a; yxγ, 其中&#xff0c; x 是输入的像素值&#xff0c;取值范围为 [0−1], y 是输出的像素值&#xff0c;通过调整γ 值&#xff0c;改变…

ios 支付验证 php,PHP验证IOS原生支付是否成功(代码全篇)

前言IOS原生支付后,需要调用服务端接口进行验证,检测是否真正的支付成功!class ApplePay{/** 环境配置(建议提成配置)* var bool*/private $sandbox false ;/** result as json* param int $code* param string $msg* param array $data* return string*/private function jso…

python自动化输入不了中文_appium+python自动化61-中文输入乱码问题解决

前言在夜神模拟器上输入中文&#xff0c;发现是乱码&#xff0c;将unicodeKeyboard和resetKeyboard参数设置为True了&#xff0c;发现还是没法解决。 打开手机设置语言和输入法&#xff0c;发现找不到Appium Android Input Manager for Unicode输入法导致的 相关环境:appium1.8…

PHP定时抽奖怎么实现的,PHP 实现抽奖逻辑

public static function get_rand($proArr) {$result "";//概率数组的总概率精度$proSum array_sum($proArr);//概率数组循环foreach ($proArr as $key > $proCur) {$randNum mt_rand(1, $proSum);if ($randNum < $proCur) {$result $key;break;} else {$p…

绿盟漏洞扫描_主机安全漏洞解决方案

前几天发了一篇等保2.0的文章(等保2.0简单介绍 )&#xff0c;文章里面提到&#xff0c;相比于等保1.0标准&#xff0c;等保2.0很大幅度上对安全通用要求的一些控制项做了大幅精简&#xff0c;但是等保二级的要求仍多达135项、等保三级多达211项。https://mp.weixin.qq.com/s/kE…

php电子商务模板,关于php:电商系统设计之运费模板下

电商大伙每天都在用&#xff0c;相似某猫&#xff0c;某狗等。电商零碎设计看似简单又很简略&#xff0c;看似简略又很简单本章适宜初中级工程师细看&#xff0c;大佬请随便【腾讯云】云产品限时秒杀&#xff0c;爆款1核2G云服务器&#xff0c;首年99元前言在订单零碎中&#x…

采用光线跟踪绘制场景 c++_光线追踪的相干性聚集:硬件光线追踪的优势

尽管在理论上实现现代GPU的方法是无限的&#xff0c;但真正有效的方法是切实地了解问题并着手将方案变为现实。制造现代高性能半导体器件以及试图加速当前可编程光栅化技术所面临的问题揭示了GPU硬件行业发展的未来趋势。例如在现代GPU中SIMD处理和固定功能纹理单元是必不可少的…

ajax请求php省略后缀,如何在PHP中更安全地处理Ajax请求?

在谷歌搜索了很多次后,回答结束了!步骤1:为所有Web服务生成令牌系统:生成令牌:session_start();$token md5(rand(1000,9999)); //you can use any encryption$_SESSION[token] $token; //store it as session variable?>步骤2:发送Ajax调用时使用它:var form_data {data…

python编写字符串查找函数_Python 简明教程 --- 8,Python 字符串函数

好代码本身就是最好的文档。当你需要添加一个注释时&#xff0c;你应该考虑如何修改代码才能不需要注释。—— Steve McConnell目录字符串有很多操作函数&#xff0c;所以&#xff0c;这里我们专门用一节来介绍这些函数。建议&#xff1a;由于字符串函数较多&#xff0c;对于新…

php汽车之家数据api,基于聚合数据的全国违章直连查询接口示例-PHP版

前言从聚合数据官网的接口文档中我们可以看出全国违章直连查询的调用一般来说需要两个步骤获取支持城市参数接口&#xff0c;即获取到不同城市的需要的参数的长度规则请求违章查询接口&#xff0c;即获取到车辆的违章记录我们以无锡城市为例代码部分<?php // 请求的接口URL…

xxljob 配置具体定时任务_分布式任务调度: XXL-Job

1 任务调度中心搭建、部署、任务管理与监控[1]任务调度中心页面2 SpringBoot 集成 xxl-job&#xff1a;创建调度任务maven项目pom.xml引入依赖:<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>…

php 判断同时存在英文跟数字,php判断输入是否是纯数字,英文,汉字的方法

本文实例讲述了php判断输入是否是纯数字&#xff0c;英文&#xff0c;汉字的方法。分享给大家供大家参考。具体分析如下&#xff1a;这里利用php的mb_strlen和strlen函数就可以轻松得知字符串的构成是全英文、英汉混合、还是纯汉字。简要说明如下&#xff1a;1、如果strlen返回…

前端白屏问题_深入理解前端性能监控

在同样的网络环境下&#xff0c;有两个同样能满足你的需求的网站&#xff0c;一个唰的一下就加载出来了&#xff0c;另一个白屏转圈转了半天内容才出来&#xff0c;如果让你选择&#xff0c;你会用哪一个&#xff1f;页面的性能问题是前端开发中一个重要环节&#xff0c;但一直…

java in action,java 7 in action

《JAVA语言程序设计》期末考试试题及答案7_远程、网络教育_成人教育_教育专区。《JAVA语言程序设计》期末考试试题及答案7 一、选择题 1. 请说出下列代码的执行结果......v alidateTree Methods inherited from class javaponent action, add, addCom ponentListener, addFocus…