程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

淺談C、Java與Python之間的小差異

編輯:Python

淺談C、Java與Python之間的小差異

  • 1.變量是什麼
    • (1)C認為變量應該是容器
    • (2)Python認為變量應該是標簽
    • (3)Java認為我們不應該關心這個問題
  • 2.循環與迭代
    • (1)傳統的循環
    • (2)繼承與發展
    • (3)新的問題
  • 3.尾聲
    • (1)萬物皆對象
    • (2)C的自增
    • (3)Python的好名聲

1.變量是什麼

(1)C認為變量應該是容器

傳統的觀點通常將變量比喻成容器,不同類型的容器儲存不同的物質,就如同不同數據類型的變量存儲不同類型的值一樣。

人們用杯子裝水,用籃子裝菜,這一切都是這麼正常。

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;
}

(2)Python認為變量應該是標簽

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,地址為%p\n", a, &a);
printf("int型變量b的值為%d,地址為%p\n", b, &b);
a += 10;
b += 10;
printf("變化後變量a的值為%d,地址為%p\n", a, &a);
printf("變化後變量b的值為%d,地址為%p\n", 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)}")

(3)Java認為我們不應該關心這個問題

Java打造了一台功能強大的虛擬機,即所謂的JVM,來幫我們解決包括存儲空間分配在內的內存管理問題,涉及到內存的操作都由JVM來完成,程序員不用也不能直接操作內存。

Java擔心我們不能合理分配利用空間,所以它用自己的方法解決了這個問題。

2.循環與迭代

(1)傳統的循環

C是三者中最年長的語言,它的循環也很具有代表性,循環結構是用來處理一系列相似的事物的,這種重復勞動是十分無趣的,所以C通常是數著數來統計重復的次數,然後看看什麼時候能下班。

它使用一種自增運算來數數,用一個整型變量來存儲次數,為了方便逐個的自增,它發明了i++和++i這種結構來簡化命令,這樣的運算也被後來的許多語言效仿。

#include <stdio.h>
int main()
{

for (int i = 0; i < 10; i++)//經典的i++自增
{

printf("%d\n", i);
}
return 0;
}

(2)繼承與發展

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。

(3)新的問題

在其他語言使用傳統循環解決問題時,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("%d\n", i);
}
return 0;
}

實驗結果正如同Python想的那樣,內存空間的無謂損失被降低了。
為了推廣這個新的循環方式,它禁用了傳統循環,並廢除了i++或是++i自增的用法,鼓勵大家使用迭代器range搭配新的循環。

3.尾聲

(1)萬物皆對象

三者中最先提到類與對象這個概念的是我們的Java,它認為萬物皆是類,包括它自己,從此面向對象編程橫空出世,但它還要兼容傳統的思想,對此它的JVM對傳統的基本數據類型和新的類對象做了不同處理。

對於傳統的基本數據類型,JVM將其存在棧中,而將實例化的對象存在堆中。在函數調用時,對於簡單的基本數據類型,JVM進行值傳遞,而對於復雜的對象則采用引用傳遞。

相應的變量在相互賦值的時候,有的對象會不幸失去引用,如果沒有變量引用它,它將變得無法操作,它的存在將沒有意義。Java很貼心地安排了JVM去回收它們,這樣的回收系統同樣也可以用來回收那些不會再被用到的數據。

雖然看起來Java對它們有些不盡人情,用完不需要別人了就回收,但這一切都是為了計算機更好的執行任務。

(2)C的自增

為了更好的適應新的任務,C也學著Java加入了類與對象的功能,C實現了自身的進化,進化成了C++,它在利用類與對象的便利的同時,並不承認萬物皆對象的觀點,這也讓它保存了C那時面向過程編程的風格。

C++封裝了許多常用類來方便我們工作,同時允許我們直接操作內存,沒有像JVM虛擬機那樣的阻隔,保持著C語言原有的高速,同時更加接近底層。

(3)Python的好名聲

Python是三者中誕生最晚的,它最開始是沒有什麼知名度的,在C與Java面前只能老老實實當小弟。但年輕人還是不一樣,它敢想敢做,首先是實現了各變量之間的平等,讓它們能夠存儲任意數據,然後解決了內存空間的相關問題。

除此之外,它開源自己,廣泛吸取大家的意見,Python逐漸變得知名了。

在這些過程中,Python不斷改善自身,變得十分人性化,簡單的語法、便捷的方法,都吸引著其他程序員去了解,程序員們也能很容易的入門。

現在,Python除了自帶的標准庫外,支持導入很多的外部庫,大大地拓展了Python的應用范圍。這一切都仰仗它一直以來的好名聲,使得不斷有人前赴後繼貢獻自己的便捷方法,為其編寫外部庫。

現在Python雖然沒有C/C++那樣的速度,但是它的便捷性已經不輸其他老一輩的語言了,程序員們在寫小程序的時候會更加青睐它。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved