Java VS Python 生產效率 -概述
下面是3個主要的特性能夠讓Python程序員效率高于java程序員
Java | Python |
靜態類型 在java里面所有的變量名稱(和他們的類型)必須被明確的定義,如果嘗試去將某個對象賦予錯誤的類型,只會引起類型異常。這就為什么說java是靜態語言。 java 集合對象(如:Vector和ArrayList)里面可以保存了通用類型對象,但是無法保存基本類型,如int等。要保存int到Vector,你必須 先要轉換int到Integer(注:這里指的1.5版以前的java)。同樣的,當你要從集合中取出一個對象時,已經不記得對象的類型,必須顯示轉換為 期望的類型。 | 動態類型 在Python里面,你不需要定義任何東西(注:這里主要指的還是變量)。賦值語句將對象賦給某個變量名,并且對象可以是任意類型。如果變量已經被賦予某個類型對象,之后還可以被賦予另外一個不同類型的對象。這就是為什么Python被稱為動態類型。 Python的集合對象(如:lists和dictionaries)里面可以保存任意類型的對象,包括數字和lists。當你從集合中取出一個對象是,他仍然記得這個對象的類型,所以無需進行類型轉換。 靜態類型vs動態類型的更多信息,看這里 |
冗長 ”大量的語句;使用過程中很多語句并不是必須的” | 簡潔(簡練) 只需要幾個簡單的語句就可以表達很多。意味著清晰而簡潔,無需多余的語句就能完成目標。 |
不緊湊 | 緊湊 在新的黑客字典里,Eric S. Raymond給予了“緊湊”這樣的定義: Compact adj. 在設計中,描述有價值的特性并能夠被人們立馬理解。 |
例子
“hello world!”
Java | Python |
public class HelloWorld { public static void main (String[] args) { System.out.println("Hello, world!"); } } | print "Hello, world!" print("Hello, world!") # Python version 3 |
例子
下面的例子里,我們初始化integer為0,再把他轉為string,最后檢查他是否為空。注意,數據的聲明在java里是必須的,但Python里不是。還會注意到即時只是在簡單的比較兩個字符串的時候,java代碼還是會顯得冗長。
Java | Python |
int myCounter = 0; String myString = String.valueOf(myCounter); if (myString.equals("0")) ... | myCounter = 0 myString = str(myCounter) if myString == "0": ... |
// print the integers from 1 to 9 for (int i = 1; i < 10; i++) { System.out.println(i); } | #print the integers from 1 to 9 for i in range(1,10): print i |
例子
你的應用有15個class。(準確的說是15個頂層的public class)。
Java | Python |
每個頂層的public class都必須定義一個單獨的文件。如果你的應用有15個class,那就有15個文件。 | 多個class可以被定義到單個文件中。如果你應用有15個class,只要你愿意甚至可以將整個應用都存放到一個文件中,但是更明智的情況是將這些class分散到4-6個文件中。 |
例子
在你的應用中,A方法調B方法,B調C,C調D,D調E,E調F。當你發現F必須拋出SpecialException異常,它必須被A捕獲時。
Java | Python |
你必須在F中throw SpecialException,然后在A中進行catch。 同時 你必須在B、C、D、E和F,每個方法上都申明”throws SpecialException”。 | 你必須在F中rasie SpecialException,并在A中進行catch。由于異常會自動往上升,所以你不需要做任何其他事情。 |
這個原因還是因為java事實上是封閉的面向對象程序語言,使用了checked exception --- 在異常出現的每個方法中,他們必須被拋出或捕獲,否則連編譯都無法通過。
例子
你的應用里面有個Employee class,當一個Employee的實例被創建,構造函數可能傳入1個、2個或者3個參數。
如果是在java中,這意味著你必須寫3個不同參數的構造函數。如果你用Python,你只用寫一個帶可選參數和默認值的構造函數。
Java | Python |
public class Employee { private String myEmployeeName; private int myTaxDeductions = 1; private String myMaritalStatus = "single"; //--------- constructor #1 ------------- public Employee(String EmployeName) { this(employeeName, 1); } //--------- constructor #2 ------------- public Employee(String EmployeName, int taxDeductions) { this(employeeName, taxDeductions, "single"); } //--------- constructor #3 ------------- public Employee(String EmployeName, int taxDeductions, String maritalStatus) { this.employeeName = employeeName; this.taxDeductions = taxDeductions; this.maritalStatus = maritalStatus; } ... | class Employee(): def __init__(self, employeeName , taxDeductions=1 , maritalStatus="single" ): self.employeeName = employeeName self.taxDeductions = taxDeductions self.maritalStatus = maritalStatus ... 在Python中,一個類只包含一個構造函數。 構造方法都是用的特殊的名字:__init__ |
例子
關于緊湊(注:略去”名人名言“若干)
Java | Python |
import java.io.*; ... BufferedReader myFile = new BufferedReader( new FileReader(argFilename)); | # open an input file myFile = open(argFilename) |
例子
string處理能力的比較
功能 | Java | Python |
去掉頭尾空格 | s.trim() | s.strip() |
去掉頭部空格 | 未提供 | s.lstrip() |
去掉尾部空格 | 未提供 | s.rstrip() |
例子
將int加到Vector
Java | Python |
public Vector<Integer> aList = new Vector<Integer>; public int aNumber = 5; public int anotherNumber; aList.addElement(aNumber); anotherNumber = aList.getElement(0); | aList = [] aNumber = 5 aList.append(aNumber) anotherNumber = aList[0] |
例子
Java | Python |
if ( a > b ) { a = b; b = c; } | if a > b : a = b b = c |
http://xflykkk.iteye.com/blog/1337444