首先我們要說明的是本文不扯什么大道理,只是先介紹Python的背景,然后從實(shí)用的角度出發(fā)舉一兩個(gè)真實(shí)栗子。
首先要想了解要一門語(yǔ)言的好壞,或者為什么招程序員喜歡(臥槽,原來程序員喜歡不是女朋友?)我們的先從語(yǔ)言的產(chǎn)生背景開始,比如:他出現(xiàn)在什么年代,為了解決什么問題而出現(xiàn)的等。當(dāng)然我也只是跟其他語(yǔ)言做一個(gè)比較,不討論誰(shuí)好誰(shuí)壞,再說語(yǔ)言也沒有什么好壞之分,就算有好壞之分,也得從實(shí)際應(yīng)用場(chǎng)景出發(fā),所有我們不討論這個(gè)問題。
好,好,大兄弟你們都消消氣,上面我扯的太多了,下面直接上重點(diǎn)...
1. Question
首先還是按照慣例,上來幾個(gè)問題,這樣能讓初學(xué)者一目了然,有個(gè)大概的認(rèn)識(shí)
1.1 Python是什么
是一種面向?qū)ο?、解釋型?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,由Guido van Rossum于1989年圣誕節(jié)為打發(fā)無聊時(shí)間,而開發(fā)的一個(gè)新的腳本解釋程序,可以感覺下什么叫牛人,是ABC語(yǔ)言的一種繼承,至于為什么選中Python作為語(yǔ)言名字,是因?yàn)樗且唤蠱onty Python的喜劇團(tuán)體的愛好者,第一個(gè)公開發(fā)行版發(fā)行于1991年。
他的設(shè)計(jì)哲學(xué)是
- 優(yōu)雅
- 明確
- 簡(jiǎn)單
完全的面向?qū)ο蟆:瘮?shù),模塊,數(shù)字,字符串都是對(duì)象,不想Java中還有基本類型,在Python中一切皆對(duì)象,那作為程序員的我們害怕找到對(duì)象嗎,直接New一個(gè)呀,呵呵
1.2 人們?yōu)槭裁从肞ython
這個(gè)問題往往是入門者第一個(gè)問題,對(duì)此我在一本書找到了這樣的解答:
軟件質(zhì)量
開發(fā)這效率
程序的可移植性
眾多標(biāo)準(zhǔn)庫(kù)支持
組件集成
享受樂趣
其他的不用多講,需要詳細(xì)了解的可以搜索下,我只是提供大家?guī)讉€(gè)方面讓大家了解,因?yàn)橥鶎?duì)于初學(xué)者,是迷茫的,因?yàn)椴恢С謴氖裁捶较蛉チ私庖粋€(gè)事物,而我就是提供方向的,具體的大家可以自己去了解。我只說下最后一個(gè),詳細(xì)的可以參考下這篇文章每個(gè)程序員都應(yīng)該學(xué)習(xí)使用 Python或Ruby文章里面也說的很明白,我總結(jié)幾點(diǎn)就是
- 代碼量小
- 維護(hù)成本低
- 編程效率高
同一樣問題,用不同的語(yǔ)言解決,代碼量差距太多了,一般情況下python是java的1/5,所以說人數(shù)苦短,我用python,多留點(diǎn)時(shí)間泡妹子吧,不然就老了
1.3 Python是腳本語(yǔ)言嗎
·
他是一種多用戶語(yǔ)言,至于為什么大家的第一感覺是腳本語(yǔ)言,我是因?yàn)槿藗兛此乃苯訉懸粋€(gè)文件,不需要什么編譯,跟腳本似得,直接運(yùn)行的就行了。所以說我也很難給你一個(gè)確定答案,我就舉一些常見的應(yīng)用場(chǎng)景:
- 腳本:可以寫一些輔助自己開的腳本,就比如,Android開發(fā),會(huì)涉及到一常用的命令,但是如果是在windows用bat寫,這樣弄到mac就沒法運(yùn)行的,所以可以用,python寫。另外如果你是服務(wù)器管理員,那么python腳本很適合你,程序長(zhǎng)了用bash寫,你會(huì)砸電腦的
- 網(wǎng)站開發(fā):他有強(qiáng)大的Django,F(xiàn)lask框架
- 科學(xué)計(jì)算:有Numpy和Matlab一樣強(qiáng)的數(shù)值計(jì)算接口
- 圖形界面程序開發(fā):這個(gè)不用多解釋,就是常見的那種界面啦
2. Python版Hello World
通常任何一門語(yǔ)言都有一個(gè)hello world的過程,呵呵,所以說我們這里也一樣,因?yàn)橥ㄟ^他你會(huì)學(xué)習(xí)到該語(yǔ)言的一個(gè)最基本的程序框架和運(yùn)行過程,這對(duì)應(yīng)初學(xué)者才是最重要的。
既然前面也說了,可以把他當(dāng)腳本語(yǔ)言,那我們就來個(gè)最簡(jiǎn)單的,操作步驟如下:
在你的工作目錄下創(chuàng)建一個(gè)hello.py文件,別問我你不知道工作目錄是什么,那你該學(xué)學(xué)計(jì)算機(jī)基礎(chǔ)了
在該文件里寫入
print 'hello world'
- 打開命令行,輸入:
python hello.py
順利的話你會(huì)看到hello world的輸出,是不是感覺好簡(jiǎn)單,對(duì),你沒看錯(cuò),就這么簡(jiǎn)單,現(xiàn)在你可以說你是一個(gè)python程序員了,呵呵~
3. Example
這里就舉一個(gè)我最近實(shí)際應(yīng)用中的例子,是什么呢,施主莫急,聽平僧慢慢到來。場(chǎng)景是這樣的最近一個(gè)日記軟件本身的客戶端不能用了,但是數(shù)據(jù)在sqlite數(shù)據(jù)庫(kù)里呀,我們的需求是將里面的一些數(shù)據(jù)導(dǎo)出為txt文件,怎么這需求簡(jiǎn)單吧
3.1 Python
首先用python來解決這個(gè)問題,據(jù)跟上面的描述,我們很清楚的想到如下步驟:
- 連接sqlite3數(shù)據(jù)庫(kù)
- 執(zhí)行查詢語(yǔ)句
- 打開文件
- 將查詢的接口寫入的剛剛打開的文件中
- 關(guān)閉數(shù)據(jù)
- 關(guān)閉文件
呵呵,我有想到了,讓程序員把大象放到冰箱的故事了,可以參考這篇文章拖放三部曲——從“把大象放進(jìn)冰箱”說起
好了,不廢話了,直接上代碼
#!/usr/bin/python
# -*- coding: cp936 -*-
import sqlite3
import HTMLParser
import codecs
import time
f=codecs.open('note.txt','a',"utf-8") #以追加方式打開一個(gè)文件
conn = sqlite3.connect('note.db') #打開sqlite數(shù)據(jù)庫(kù)
print "Opened database successfully";
#執(zhí)行查詢語(yǔ)句,返回一個(gè)cursor
cursor = conn.execute("select created,weather,address,latitude,longitude,content from tb_notescontents,tb_notes where tb_notescontents.note_guid=tb_notes.guid")
#遍歷每一行
for row in cursor:
#取出改行的每一列
created= row[0]
weather= row[1]
address= row[2]
latitude= row[3]
longitude= row[4]
content= row[5]
html_parser = HTMLParser.HTMLParser()
d = time.localtime(created/1000)
currentTime = time.strftime('%Y-%m-%d %H:%M:%S',d)
#因?yàn)樵淼膬?nèi)容是經(jīng)過html轉(zhuǎn)義了,所以要轉(zhuǎn)回來,形如:今天,
weather = html_parser.unescape(weather)
address = html_parser.unescape(address)
content = html_parser.unescape(content)
f.write(currentTime) #寫入文件
f.write(' ')
f.write(weather)
f.write(' ')
f.write(address)
f.write(' ')
f.write(content)
f.write('\n')
f.write('\n')
f.write('\n')
conn.close() ## 關(guān)閉數(shù)據(jù)庫(kù)
f.close() #關(guān)閉文件
print "Operation done successfully";
至于邏輯,我在上面步驟也寫的很清楚了,另外程序也謝了很詳細(xì)的注釋,所以說就算你不懂python也能很容易的看懂。
可以看到我們大概只用了50行代碼就完成了,這個(gè)小需求,但是如果用Java是什么結(jié)果呢
3.2 Java
首先的我們的找一個(gè)開發(fā)工具,就eclipse吧。創(chuàng)建一個(gè)項(xiàng)目,然后添加一個(gè)TestMan.java
工程結(jié)構(gòu)如下:
在TestMan.java中寫一個(gè)基本的程序框架
public class TestMain {
public static void main(String[] args) {
}
}
臥槽,這么麻煩,搞了半天才把架子搭好,說實(shí)話Java確實(shí)中規(guī)中矩,干什么你都得按照他的那一套來,所以說呢,我們就不能直接貼代碼了,步驟還得細(xì)分了,啥?
- 連接sqlite3數(shù)據(jù)庫(kù)
通過JDBC連接:但是因?yàn)閖dbc(Java Data Base Connectivity,java數(shù)據(jù)庫(kù)連接)是java連接數(shù)據(jù)庫(kù)的一套抽象設(shè)計(jì)API,既然是抽象的所以是不能直接使用,要找到他的實(shí)現(xiàn),既然是連接sqlite所以應(yīng)該去sqlite官網(wǎng)或者從bitbucket這里下載,我下載的版本是sqlite-jdbc-3.8.11.2,下載完后將他放到eclipse的環(huán)境變量里,下載才把準(zhǔn)備工作做完,下面才開始寫代碼 - 執(zhí)行查詢語(yǔ)句
- 打開文件
- 將查詢的接口寫入的剛剛打開的文件中
- 關(guān)閉數(shù)據(jù)
- 關(guān)閉文件
現(xiàn)在我們直接上代碼了
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.commons.lang3.StringEscapeUtils;
public class TestMain {
public static void main(String[] args) {
// load the sqlite-JDBC driver using the current class loader
Connection connection = null;
BufferedWriter bufferedWriter = null;
try {
Class.forName("org.sqlite.JDBC");
// create a database connection
connection = DriverManager.getConnection("jdbc:sqlite:note.db");
Statement statement = connection.createStatement();
statement.setQueryTimeout(30); // set timeout to 30 sec.
ResultSet rs = statement
.executeQuery("select created,weather,address,latitude,longitude,content from tb_notescontents,tb_notes where tb_notescontents.note_guid=tb_notes.guid");
bufferedWriter = new BufferedWriter(
new FileWriter("note.txt", true));
while (rs.next()) {
// read the result set
String created = rs.getString("created");
String weather = rs.getString("weather");
String address = rs.getString("address");
String latitude = rs.getString("latitude");
String longitude = rs.getString("longitude");
String content = rs.getString("content");
// write to file
bufferedWriter.write(created); // 寫入文件
bufferedWriter.write(" ");
bufferedWriter.write(weather);
bufferedWriter.write(" ");
bufferedWriter.write(address);
bufferedWriter.write(" ");
// 轉(zhuǎn)義html,可以看到我們又引用了commons-lang jar包
content = StringEscapeUtils.unescapeHtml4(content);
bufferedWriter.write(content);
bufferedWriter.newLine();
}
} catch (SQLException e) {
// if the error message is "out of memory",
// it probably means no database file is found
System.err.println(e.getMessage());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (connection != null)
connection.close();
} catch (SQLException e) {
// connection close failed.
System.err.println(e);
}
try {
if (bufferedWriter != null) {
bufferedWriter.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
現(xiàn)在大家可以看見了java和python的區(qū)別了吧,在java中什么功能也提供了,但是得引用各種jar,還得到處找去搜索或下載啦,各種肯爹,不過在python中很多常用庫(kù)已經(jīng)內(nèi)置了,所以省去了很多麻煩,所以說以我個(gè)人感覺,python個(gè)適合解決工作中的一些小問題,當(dāng)然大問題也是么有問題的啦,文章到此基本結(jié)束了,當(dāng)然我也沒有偏袒那一面,另外我也是只是從我的工作或?qū)W習(xí)中得到的一些小領(lǐng)悟特此總結(jié)此處,如果大家有什么好的見解歡迎評(píng)論吐槽
感謝:
java連接sqlite參考:http://blog.csdn.net/litaoshoujiao/article/details/8535444
commom-lang:http://commons.apache.org/proper/commons-lang/download_lang.cgi