Java VS Python 生產(chǎn)效率 -概述
下面是3個(gè)主要的特性能夠讓Python程序員效率高于java程序員
Java | Python |
靜態(tài)類型 在java里面所有的變量名稱(和他們的類型)必須被明確的定義,如果嘗試去將某個(gè)對(duì)象賦予錯(cuò)誤的類型,只會(huì)引起類型異常。這就為什么說(shuō)java是靜態(tài)語(yǔ)言。 java 集合對(duì)象(如:Vector和ArrayList)里面可以保存了通用類型對(duì)象,但是無(wú)法保存基本類型,如int等。要保存int到Vector,你必須 先要轉(zhuǎn)換int到Integer(注:這里指的1.5版以前的java)。同樣的,當(dāng)你要從集合中取出一個(gè)對(duì)象時(shí),已經(jīng)不記得對(duì)象的類型,必須顯示轉(zhuǎn)換為 期望的類型。 | 動(dòng)態(tài)類型 在Python里面,你不需要定義任何東西(注:這里主要指的還是變量)。賦值語(yǔ)句將對(duì)象賦給某個(gè)變量名,并且對(duì)象可以是任意類型。如果變量已經(jīng)被賦予某個(gè)類型對(duì)象,之后還可以被賦予另外一個(gè)不同類型的對(duì)象。這就是為什么Python被稱為動(dòng)態(tài)類型。 Python的集合對(duì)象(如:lists和dictionaries)里面可以保存任意類型的對(duì)象,包括數(shù)字和lists。當(dāng)你從集合中取出一個(gè)對(duì)象是,他仍然記得這個(gè)對(duì)象的類型,所以無(wú)需進(jìn)行類型轉(zhuǎn)換。 靜態(tài)類型vs動(dòng)態(tài)類型的更多信息,看這里 |
冗長(zhǎng) ”大量的語(yǔ)句;使用過(guò)程中很多語(yǔ)句并不是必須的” | 簡(jiǎn)潔(簡(jiǎn)練) 只需要幾個(gè)簡(jiǎn)單的語(yǔ)句就可以表達(dá)很多。意味著清晰而簡(jiǎn)潔,無(wú)需多余的語(yǔ)句就能完成目標(biāo)。 |
不緊湊 | 緊湊 在新的黑客字典里,Eric S. Raymond給予了“緊湊”這樣的定義: Compact adj. 在設(shè)計(jì)中,描述有價(jià)值的特性并能夠被人們立馬理解。 |
例子
“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,再把他轉(zhuǎn)為string,最后檢查他是否為空。注意,數(shù)據(jù)的聲明在java里是必須的,但Python里不是。還會(huì)注意到即時(shí)只是在簡(jiǎn)單的比較兩個(gè)字符串的時(shí)候,java代碼還是會(huì)顯得冗長(zhǎng)。
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 |
例子
你的應(yīng)用有15個(gè)class。(準(zhǔn)確的說(shuō)是15個(gè)頂層的public class)。
Java | Python |
每個(gè)頂層的public class都必須定義一個(gè)單獨(dú)的文件。如果你的應(yīng)用有15個(gè)class,那就有15個(gè)文件。 | 多個(gè)class可以被定義到單個(gè)文件中。如果你應(yīng)用有15個(gè)class,只要你愿意甚至可以將整個(gè)應(yīng)用都存放到一個(gè)文件中,但是更明智的情況是將這些class分散到4-6個(gè)文件中。 |
例子
在你的應(yīng)用中,A方法調(diào)B方法,B調(diào)C,C調(diào)D,D調(diào)E,E調(diào)F。當(dāng)你發(fā)現(xiàn)F必須拋出SpecialException異常,它必須被A捕獲時(shí)。
Java | Python |
你必須在F中throw SpecialException,然后在A中進(jìn)行catch。 同時(shí) 你必須在B、C、D、E和F,每個(gè)方法上都申明”throws SpecialException”。 | 你必須在F中rasie SpecialException,并在A中進(jìn)行catch。由于異常會(huì)自動(dòng)往上升,所以你不需要做任何其他事情。 |
這個(gè)原因還是因?yàn)閖ava事實(shí)上是封閉的面向?qū)ο蟪绦蛘Z(yǔ)言,使用了checked exception --- 在異常出現(xiàn)的每個(gè)方法中,他們必須被拋出或捕獲,否則連編譯都無(wú)法通過(guò)。
例子
你的應(yīng)用里面有個(gè)Employee class,當(dāng)一個(gè)Employee的實(shí)例被創(chuàng)建,構(gòu)造函數(shù)可能傳入1個(gè)、2個(gè)或者3個(gè)參數(shù)。
如果是在java中,這意味著你必須寫(xiě)3個(gè)不同參數(shù)的構(gòu)造函數(shù)。如果你用Python,你只用寫(xiě)一個(gè)帶可選參數(shù)和默認(rèn)值的構(gòu)造函數(shù)。
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中,一個(gè)類只包含一個(gè)構(gòu)造函數(shù)。 構(gòu)造方法都是用的特殊的名字:__init__ |
例子
關(guān)于緊湊(注:略去”名人名言“若干)
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 |