為什麼索引值從 0 開始算?

為什麼索引值從 0 開始算?

有沒有想過為什麼我們學的數學是從 1 開始算,但好像大部份比較主流的程式語言的陣列包括 Python 的串列,索引值卻是從 0 開始的?因為這是因為陣列的索引值並不是指向元素本身,比較像是記憶體位置的「偏移量」。

假設有一個陣列像這樣:

chars = ['a', 'b', 'c', 'd']

當我們說「變數 chars 指向 ['a', 'b', 'c', 'd'] 陣列」的時候,並不是 chars 這個變數直接指向這一整個陣列,而是 chars 變數指向這個陣列的「起始位置」,更精準的說是記憶體位置。陣列在記憶體裡的位置跟門牌號碼一樣都是連號的,假設這個陣列的起始記憶體位置是 1450,然後每個元素所佔的位置或說格子的大小我就先隨便假設是 8(先不管單位跟以及為什麼是 8)。大概示意圖如下:

為什麼索引值從 0 開始

這樣的話,你認為要怎麼取得第一個元素的 a 字元?不就是指向 1450 的位置就拿到了嗎?(你也可以說是從 14501458 這一塊空間)。

我們現在知道怎麼拿第一個元素了,接著要怎麼拿第二個?其實只要知道第一個元素的位置再搭配簡單的數學加法跟乘法就能算出來了:

起始位置 + (1 x 8) = 1458

同理可證,第三個、第四個直到第 N 個元素就能推導出計算公式:

起始位置 + (N x 8)

到這裡,大家有看出來上面公式裡的 N,剛好就是等於我們平常在講的索引值嗎?所以索引值其實就是記憶體位置的「偏移量」,因此才會從 0 開始算。

所以陣列索引值從 0 開始的概念從滿早期的程式語言開始就有了,大家用著用著也習慣了,Python 以及其它程式語言也都受到影響,所以 Python 的串列索引值也跟是從 0 開始算。

事實上,也不是所有程式語言的索引值都是從 0 開始算的,不同的程式語言對這件事有不同的觀點,像程式語言 LuaFortranCOBOLJuliaR 語言等都是從 1 開始算的,也許在他們的觀點來看,chars[1] 就是第一個或第一欄,看起來更簡單、直覺。

Python 好用的 F 字串!

Python 好用的 F 字串!

Python 裡的 F 字串(F-String)不只是可以直接把變數塞到字串裡、看起來更好看、更好寫而已,它還有一些有趣的用法,像是我們常會遇到需要幫錢錢加上千位數字的逗點,在其它程式語言可能需要透過其它函數或是另外自己寫函數來處理,用 F 字串可以輕鬆做到這件事,例如:

Python 的 String Interning 機制

Python 的 String Interning 機制

許多程式語言會使用 2 個等號 == 比較兩個值是否相等,在 Python 也是一樣,但 Python 還有個特別的比較方法 is,它可以用來比較這兩個值是不是同一個物件:

Python 的 Pattern Matching

Python 的 Pattern Matching

假設你曾經寫過其它的程式語言,遇到這種一大串的 else if 組合的時候,通常會想到的是 switchcase...when 之類的語法。在 Python 並沒有這樣的設計,真的遇到一堆判斷就是用 if...elif...else... 寫就是了。這樣的設計是因為 Python 的作者認為 switch 語法並不是那麼的必要,而且 if...elif...else... 也可以達到相同的效果,所以就沒有加入 switch 語法。沒有 switchcase 的設計並沒什麼大不了的,事實上有些程式語言就算有 switchcase 的寫法,本質上也只是 if..else 而已。

Vite 的 HMR 機制

Vite 的 HMR 機制

這是在 Vue.js Taiwan 社群小聚分享的主題「你是 Live Reload,我是 Hot Reload,我們不一樣!」,用一個簡單的 Vanilla JS 專案示範平常在用的 Live Server 所提供的頁面自動重新整理,跟 Vite 裡面的 HMR(Hot Module Replacement)有什麼不同,希望對大家有些幫助。

但我必須老實說,今天這個主題是我在今年 LaravelxVue Conf 研討會上講錯的內容,當時我以為我看到的是 HMR,但後來細追原始碼才發現原來不是這麼一回事。

想要跟著影片自己動手做看看的話,可以到我的 GitHub 取得檔案

Repo:https://github.com/kaochenlong/vite-hmr-demo

場地錄影畫質只有 1080p 所以可能有些程式碼不一定會那麼清楚 :)

想要了解更多關於 Vite 的原始碼或運作原理的話,可參考Vite 原始碼解讀的介紹。

Vite 原始碼解讀

Vite 原始碼解讀

今年的 iTHome 鐵人賽我挑選的主題之一,是應該沒辦法用來開課賺錢的「Vite 原始碼解讀」。

選擇這個題目的原因是今年八月份我在 {LaravelxVue} Conf 研討會上分享的主題「被 Vue 框架所耽誤的建置工具:Vite」,可惜只有短短的 40 分鐘的時間,沒辦法介紹太細節的內容。所以我決定在這次鐵人賽活動,30 天分期付款地慢慢跟大家一起研究 Vite 的原始碼,看看能不能發現什麼有趣的東西。

資深工程師身上的 N 項特質,N = 12

資深工程師身上的 N 項特質,N = 12

我們身處在軟體工程師的大海、河川、小溪或水溝中,總是常聽到大家問一個古老的問題:「Junior 工程師要怎麼變成 Senior 工程師?」

老實說我沒辦法跟你說你怎麼做就馬上能讓你從 junior 工程師變成 senior 工程師,因為 senior 工程師不像超級賽亞人一樣可以說變就變的,還是有什麼開關或植入晶片就馬上有效果,如果有這種開關或晶片也請幫我安裝一打。

我沒辦法也不太喜歡給那些常在農場文上看到像是「要訓練獨立思考能力」、「要有解決問題的能力」之類的抽象建議,除非有附上實際的訓練及成果檢核方式,不然這樣的建議有說跟沒說可能差不多。不過,我倒是可以跟各位分享我從那些優秀工程師朋友們身上觀察到的 N 項神奇特質,N = 12。我不知道到底是這些特質讓他們變的優秀,還是因為他們優秀才有這些特質,但既然他們能站在那個位置,表示一定有值得學習、致敬的地方。

這篇文章的文字可能有點長,如果大家懶得看文字,也可以點開影片配雞排,不方便看用聽的也行。

另外,如果你對於學習程式或是轉職軟體工程師有興趣,可參考另一篇文章「程式為什麼這麼難學?」。

程式為什麼這麼難學?

程式為什麼這麼難學?

前篇文章我跟大家介紹了 senior 工程師的共通特質以及 junior 工程師的自我修練的建議,希望對大家有些幫助。

但如果你不是軟體工程師,可能不知道在哪裡看到招生廣告點進來的,或是剛好正在考慮想要轉職軟體工程師的話,有一些過去以及我們自己帶學生的經驗可供你參考。

同樣,如果懶的看文字,也可以看影片配雞排: