<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
傳統的觀點通常將變數比喻成容器,不同型別的容器儲存不同的物質,就如同不同資料型別的變數儲存不同型別的值一樣。
人們用杯子裝水,用籃子裝菜,這一切都是這麼正常。
C也是這樣認為的,它認為變數就和這些容器一樣,int型別的杯子就不能裝double型別的菜,float型別的籃子就不能裝char型別的水。
它也是這樣做的,在C程式中,將不匹配的值賦值給變數是不合法的,這些值有的會被隱式轉換,有的乾脆就辦不了,程式直接撂挑子不幹了。
所以C中的變數分別鮮明,各盡其責,所有變數的空間在誕生時就被分配好,未來將要儲存的資料也被註定。
#include <stdio.h> int main() { int a = 10; float b = 3.14; char c = 'm'; printf("a:%d, b:%f, c:%c", a, b, c); return 0; }
Python並不認同以往的觀點,它覺得傳統的觀點太刻板了,一個變數的未來不應該在它誕生之際就被限定死了,如同印度的種姓製度一樣。
Python主張各變數之間的平等,變數可以儲存任何型別的資料,Python也確實是這麼做的。
a = 10 print(a) a = 3.14 print(a) a = "Hello World!" print(a)
但一旦認為是變數儲存資料後,儲存空間的分配又成了困擾Python的難題,一向平等的它不知道該按照什麼標準去分配空間,變數們將要儲存的資料型別還未可知,如果現在平均分配空間必然會導致今後的一些問題。
Python冥思苦想,終於有一天它想出了一個神奇的構想,它不必將資料需要的空間分配給變數,它只用給變數留足儲存自己的空間,而資料則單獨找它認領空間,然後將資料空間的地址交給變數保管。這樣一個完全不一樣的分配製度和所有制度就出現了。
// C中的空間地址是與變數繫結的 #include <stdio.h> int main() { int a = 10; int b = 10; printf("int型變數a的值為%d,地址為%pn", a, &a); printf("int型變數b的值為%d,地址為%pn", b, &b); a += 10; b += 10; printf("變化後變數a的值為%d,地址為%pn", a, &a); printf("變化後變數b的值為%d,地址為%pn", b, &b); return 0; }
# Python中的空間地址是與值繫結的 a = 10 b = 10 print(f"變數a的值為{a},地址為{id(a)}") print(f"變數b的值為{b},地址為{id(b)}") a += 10 b += 10 print(f"變化後變數a的值為{a},地址為{id(a)}") print(f"變化後變數b的值為{b},地址為{id(b)}")
Java打造了一臺功能強大的虛擬機器器,即所謂的JVM,來幫我們解決包括儲存空間分配在內的記憶體管理問題,涉及到記憶體的操作都由JVM來完成,程式設計師不用也不能直接操作記憶體。
Java擔心我們不能合理分配利用空間,所以它用自己的方法解決了這個問題。
C是三者中最年長的語言,它的迴圈也很具有代表性,迴圈結構是用來處理一系列相似的事物的,這種重複勞動是十分無趣的,所以C通常是數著數來統計重複的次數,然後看看什麼時候能下班。
它使用一種自增運算來數數,用一個整型變數來儲存次數,為了方便逐個的自增,它發明了i++和++i這種結構來簡化命令,這樣的運算也被後來的許多語言效仿。
#include <stdio.h> int main() { for (int i = 0; i < 10; i++)//經典的i++自增 { printf("%dn", i); } return 0; }
Java也是一位比較老的語言,但它的資歷沒有C老,自身習慣上也受到C很大的影響,迴圈就是其中之一,C語言中的迴圈在它這裡也能使用。
但它後來就發現了問題,傳統的迴圈要在知道該重複多少次的時候才能按時結束,對於成堆的任務,Java有時候很難事先知道它們有多少。
Java後來發現,是它考慮的太多了,它根本沒必要知道要做多少,甚至沒必要統計自己現在做了多少了,對於固定量的任務,它只要讓迴圈把它們都做完就行了,沒有做完就繼續做,做完了就可以提前下班。
於是Java規定了一個新的迴圈規則,即迭代迴圈。
public class Main { public static void main(String[] args) { int[] numbers = { 5, 3, 8, 4, 6, 1, 7, 2 }; //迭代迴圈 for (int item : numbers) { System.out.println(item); } } }
這樣的迴圈似乎並不比傳統迴圈更難使用,但那時候的大多數語言還是以傳統迴圈為主,包括我們的Java。
在其他語言使用傳統迴圈解決問題時,Python似乎有點愁眉苦臉,它又遇到了新的問題。
在之前對變數處理中,Python選擇為值分配記憶體空間,而不是傳統的只為變數分配空間。在進行重複工作時,工作的計數器會不斷產生新的值,Python要為這些產生的新值都分配空間,在少量的重複工作時,Python感覺還能吃得消,但量級一大,Python就沒有這麼多空間可以分配了。
按照這種分配方式,計數器的每一次++自增都會產生一個新值,都需要為它分配記憶體空間,如果迴圈重複100次,它就要消耗100個資料單位的空間,如果重複1000次呢?10000次呢?Python不敢往下想了,問題迫在眉睫。
Python翻閱古籍,終於找到了以前Java發明的一種不同的迴圈方式,這就是它要找的解決問題的答案。它發明了一個迭代器range來取代之前的自增計數器,迭代器裡的數只有在取用的時候才佔據記憶體,使用完將會在迴圈結束後釋放,這樣一來就能解決記憶體空間的問題了。
# Python迭代迴圈列印0到9 for i in range(10): print(i)
// C語言傳統迴圈列印0到9 #include <stdio.h> int main() { for (int i = 0; i < 10; i++) { printf("%dn", i); } return 0; }
實驗結果正如同Python想的那樣,記憶體空間的無謂損失被降低了。
為了推廣這個新的迴圈方式,它禁用了傳統迴圈,並廢除了i++或是++i自增的用法,鼓勵大家使用迭代器range搭配新的迴圈。
三者中最先提到類與物件這個概念的是我們的Java,它認為萬物皆是類,包括它自己,從此物件導向程式設計橫空出世,但它還要相容傳統的思想,對此它的JVM對傳統的基本資料型別和新的類物件做了不同處理。
對於傳統的基本資料型別,JVM將其存在棧中,而將範例化的物件存在堆中。在函數呼叫時,對於簡單的基本資料型別,JVM進行值傳遞,而對於複雜的物件則採用參照傳遞。
相應的變數在相互賦值的時候,有的物件會不幸失去參照,如果沒有變數參照它,它將變得無法操作,它的存在將沒有意義。Java很貼心地安排了JVM去回收它們,這樣的回收系統同樣也可以用來回收那些不會再被用到的資料。
雖然看起來Java對它們有些不盡人情,用完不需要別人了就回收,但這一切都是為了計算機更好的執行任務。
為了更好的適應新的任務,C也學著Java加入了類與物件的功能,C實現了自身的進化,進化成了C++,它在利用類與物件的便利的同時,並不承認萬物皆物件的觀點,這也讓它儲存了C那時程式導向程式設計的風格。
C++封裝了許多常用類來方便我們工作,同時允許我們直接操作記憶體,沒有像JVM虛擬機器器那樣的阻隔,保持著C語言原有的高速,同時更加接近底層。
Python是三者中誕生最晚的,它最開始是沒有什麼知名度的,在C與Java面前只能老老實實當小弟。但年輕人還是不一樣,它敢想敢做,首先是實現了各變數之間的平等,讓它們能夠儲存任意資料,然後解決了記憶體空間的相關問題。
除此之外,它開源自己,廣泛吸取大家的意見,Python逐漸變得知名了。
在這些過程中,Python不斷改善自身,變得十分人性化,簡單的語法、便捷的方法,都吸引著其他程式設計師去了解,程式設計師們也能很容易的入門。
現在,Python除了自帶的標準庫外,支援匯入很多的外部庫,大大地拓展了Python的應用範圍。這一切都仰仗它一直以來的好名聲,使得不斷有人前赴後繼貢獻自己的便捷方法,為其編寫外部庫。
現在Python雖然沒有C/C++那樣的速度,但是它的便捷性已經不輸其他老一輩的語言了,程式設計師們在寫小程式的時候會更加青睞它。
到此這篇關於淺析Python與Java和C之間有哪些細微區別的文章就介紹到這了,更多相關Python Java C語言區別內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45