1. 程式人生 > >Python之父:為什麼Python陣列下標從0開始

Python之父:為什麼Python陣列下標從0開始

曾經有人在Twitter上問我為什麼Python使用以0為首位的陣列索引法(0-based),並且還給我了一個相關優秀文章的連結。這讓我想起許多往事:Python的前身之一,ABC語言使用的是以1為首位的陣列索引方式(1-based),而對Python有著巨大影響的C語言則使用的是0-based。我早期開發的程式語言(Algol、Fortran、Pascal)有的使用1-based,有的則比較靈活。我認為切片語法是我做出這個決定的原因之一。

我們先來看看切片語法的使用吧。它最常見的使用應該是“切出陣列的前n位”和“切出陣列第i位後的 n位”(前者是後者在i==起始位下的特例)。如果我們不需要使用難看的+1或-1補償方式,那麼程式碼就會美觀許多。

通過使用0-based索引法,Python的半開區間以及預設匹配區間都很美觀,如:a[:n] 和a[i:i+n];前者是a[0:n]的省略寫法。

在1-based索引法下,如果你想用a[:n]來表示切出前n個元素的話,你只能選擇在切片語法中使用切片起始位和切片長度2個引數,或者閉區間的用法。使用1-based索引法,半開區間切片語法就顯得不夠美觀。同樣地,使用閉區間切片語法的話,你只能用a[i:i+n-1]來表示從第i位取n個元素。所以如果使用1-based索引法的話,使用切片長度更合適。你可以寫成a[i:n]。事實上,ABC語言就是這樣的——它用了一種特殊的用法,寫為[email protected]

|n。(參考http://homepages.cwi.nl/~steven/abc/qr.html#EXPRESSIONS)

但是index:length的用法適合其它情況嗎?老實說,我不太記得了,但我想我當時的確很喜歡它美觀的半開區間語法。特別是兩個切片操作位置相鄰並且第一個切片操作的終點索引就是第二個切片的起點索引的時候,它的寫法實在是太漂亮了。比如,你想以i , j兩點來切分一個數組的話,它們將會是a[:i]、a[i:j]、和 a[j:]。

這就是Python 使用0-based索引法的原因。

相關推薦

Python為什麼Python陣列0開始

曾經有人在Twitter上問我為什麼Python使用以0為首位的陣列索引法(0-based),並且還給我了一個相關優秀文章的連結。這讓我想起許多往事:Python的前身之一,ABC語言使用的是以1為首位的陣列索引方式(1-based),而對Python有著巨大影響的C語言

陣列的由來和為什麼陣列0開始?

本文索引: 1.陣列的由來: a.字面引申: b.通俗解釋: 陣列的特點: 2.陣列下標為什麼從0開始: a.初步理解: b.加深理解: 1.陣列的由來: // 變數

為什麼C陣列0開始,而不是1開始

  對於學習過程式語言的人來說,相信絕大多數人都會有這樣的疑問:我們平時計數,通常是從一開始計數的,為什麼在程式語言中,陣列的下標是從0開始計算的呢?   這是因為,C語言中,下標的含意是:當前元素到第一個元素的偏移量。第一個元素的下標自然就是0,第二個元素的

Kmp求next的值(0開始的)

直接上程式碼: #include<iostream> #include<cstring> #include<cstdio> using namespace std

pythonpython基礎3

bar 匿名函數 發送 函數式 edit 系統 概念 作用域 opened ---恢復內容開始--- 本節內容 1. 函數基本語法及特性 2. 參數與局部變量 3. 返回值 嵌套函數 4.遞歸 5.匿名函數 6.函數式編程介紹 7.高階函數 8.內置函數 溫故知新 1.

Python拋棄Python!現在學Python還有用嗎?python

7 月 12 日,Python 之父 Guido van Rossum 在 Python 郵件組裡發郵稱,他將退出 Python 核心決策層,而轉居幕後。從 Guido van Rossum 的郵件內容可以看出,他已經厭倦了運營該組織。他在郵件開頭寫道,「我不想

Python 拋棄 Python

導讀:近日,Python 之父 Guido van Rossum 在 Python 郵件組裡發郵

實現將一維陣列A(1開始)中的元素迴圈右移k位,要求只用一個元素大小的輔助空間

#include<stdio.h>main(){ int n,arrary[50],k,temp; printf("請輸入陣列元素個數:\n"); scanf("%d",&n); for(int i=1;i<=n;i++) scanf

設計一個演算法,將一維陣列A(1開始)中的元素迴圈右移k位,要求只用一個元素大小的附加儲存空間。給出演算法的時間複雜度。

程式碼 #include<stdio.h> #include<stdlib.h> #define n 10 int main() { int a[n] = { 0,1,2,3,4,5,6,7,8,9 }; int k, t=0,i,j,m; printf(

實現將一維數組A(1開始)中的元素循環右移k位,要求只用一個元素大小的輔助空間

維數 輔助 數組a emp 數組元素 移動 scan clu n) #include<stdio.h>main(){ int n,arrary[50],k,temp; printf("請輸入數組元素個數:\n"); scanf("%d",&n); for

【專欄】資料結構和演算法美-為什麼很多程式語言中的陣列都是 0 開始

學習筆記 陣列的特徵 1.線性表 資料排成像一條線一樣的結構,資料之間只是簡單的前後關係。除了陣列是一種線性表結構外,連結串列、佇列和棧也是。與之對應的像二叉樹、堆、圖等就是非線性表。 2.使用連續

分類任務中label取值的注意事項(caffe框架),0開始,連續整數,

最近在做一個分類任務的實驗的時候,對標籤的取值產生了一些疑惑,所以看了一點對應的原始碼,順利解決了疑惑,在這裡和大家分享,如果有什麼理解錯誤還請大家指出。 之前做分類任務的時候總有聽說,標籤(label)的取值需要從0開始,按照個人的習慣,我在

Android-macffmpeg0開始編譯

0. 題外話 基於ffmpeg4.1版本.(好吧,最後我改成3.3.8版本了) 這次編譯真的是慘痛的經歷.先是經歷了linux空間不足,然後是編譯報錯 /bin/sh: ranlib/usr/local/lib/libavdevice.a: No such file or directo

為什麼陣列標號是0開始的 • cenalulu's Tech Blog

本文通過彙總一些網上搜集到的資料,總結出大部分程式語言中陣列下標從0開始的原因 背景 我們知道大部分程式語言中的陣列都是從0開始編號的,即array[0]是陣列的第一個元素。這個和我們平時生活中從1開始編號的習慣相比顯得很反人類。那麼究竟是什麼樣的原因讓大部分程式語言陣列都遵從了這個

為什麼陣列標號是0開始的?

本文通過彙總一些網上搜集到的資料,總結出大部分程式語言中陣列下標從0開始的原因。 一、背景 我們知道大部分程式語言中的陣列都是從0開始編號的,即array[0]是陣列的第一個元素。這個和我們平時生活中從1開始編號的習慣相比顯得很反人類。那麼究竟是什麼樣的原因讓大部分程式語言陣列都遵從了這個神奇的習慣

Python 談放棄 Python我對核心成員們失望至極!

Python 之父講述退位原因,以及 Python 的未來將何去何從。   ​   在 Python 社群,Python 的發明者 Guido Van Rossum 被稱為 “仁慈的終生獨裁者”(BDFL,Benevolent Dictator for Life)。今年 7 月 1

python迴圈陣列

http://outofmemory.cn/code-snippet/3741/accessing-the-index-in-python-for-loops 但是有時候我們會需要在便利陣列的同時訪問下標,這時候可以藉助於enumerate函式來實現,例如: l = [1,2,3]for

Python 撰文回憶為什麼要創造 pgen 解析器?

花下貓語: 近日,Python 之父在 Medium 上開通了部落格,併發布了一篇關於 PEG 解析器的文章(參見我翻的 全文譯文)。據我所知,他有自己的部落格,為什麼還會跑去 Medium 上寫文呢?好奇之下,我就打開了他的老部落格。 最後一篇文章寫於 2018 年 5 月,好巧不巧,寫的竟是 pgen

Python 再發文構建一個 PEG 解析器

花下貓語: Python 之父在 Medium 上開了部落格,現在寫了兩篇文章,本文是第二篇的譯文。前一篇的譯文 在此 ,宣佈了將要用 PEG 解析器來替換當前的 pgen 解析器。 本文主要介紹了構建一個 PEG 解析器的大體思路,並介紹了一些基本的語法規則。根據 Python 之父的描述,這個 PEG

Python 的解析器系列視覺化 PEG 解析

原題 | Visualizing PEG Parsing 作者 | Guido van Rossum(Python之父) 譯者 |