【Python入門教程】 超詳細(xì)講解,1小時學(xué)會Python(不會來找我!)

1龙巨、為什么使用Python

假設(shè)我們有這么一項任務(wù):簡單測試局域網(wǎng)中的電腦是否連通.這些電腦的ip范圍從192.168.0.101到192.168.0.200.

思路:用shell編程.(Linux通常是bash而Windows是批處理腳本).例如,在Windows上用ping ip 的命令依次測試各個機(jī)器并得到控制臺輸出.由于ping通的時候控制臺文本通常是"Reply from ... " 而不通的時候文本是"time out ... " ,所以,在結(jié)果中進(jìn)行字符串查找,即可知道該機(jī)器是否連通.

實現(xiàn):Java代碼如下:

String cmd="cmd.exe ping ";

String ipprefix="192.168.10.";

int begin=101;

int end=200;

Process p=null;

for(int i=begin;i<end;i++){

? ? p= Runtime.getRuntime().exec(cmd+i);

? ? String line = null;

? ? BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

? ? while((line = reader.readLine()) != null)

? ? {

? ? ? ? //Handling line , may logs it.

? ? }

? ? reader.close();

? ? p.destroy();

}

這段代碼運行得很好,問題是為了運行這段代碼,你還需要做一些額外的工作.這些額外的工作包括

編寫一個類文件

編寫一個main方法

將之編譯成字節(jié)代碼

由于字節(jié)代碼不能直接運行,你需要再寫個小小的bat或者bash腳本來運行.

當(dāng)然,用C/C++同樣能完成這項工作.但C/C++不是跨平臺語言.在這個足夠簡單的例子中也許看不出C/C++和Java實現(xiàn)的區(qū)別,但在一些更為復(fù)雜的場景,比如要將連通與否的信息記錄到網(wǎng)絡(luò)數(shù)據(jù)庫.由于Linux和Windows的網(wǎng)絡(luò)接口實現(xiàn)方式不同,你不得不寫兩個函數(shù)的版本.用Java就沒有這樣的顧慮.

同樣的工作用Python實現(xiàn)如下:

import subprocess

cmd="cmd.exe"

begin=101

end=200

while begin<end:

? ? p=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,

? ? ? ? ? ? ? ? ? stdin=subprocess.PIPE,

? ? ? ? ? ? ? ? ? stderr=subprocess.PIPE)

? ? p.stdin.write("ping 192.168.1."+str(begin)+"\n")

? ? p.stdin.close()

? ? p.wait()

? ? print "execution result: %s"%p.stdout.read()

對比Java,Python的實現(xiàn)更為簡潔,你編寫的時間更快.你不需要寫main函數(shù),并且這個程序保存之后可以直接運行.另外,和Java一樣,Python也是跨平臺的.

有經(jīng)驗的C/Java程序員可能會爭論說用C/Java寫會比Python寫得快.這個觀點見仁見智.我的想法是當(dāng)你同時掌握J(rèn)ava和Python之后,你會發(fā)現(xiàn)用Python寫這類程序的速度會比Java快上許多.例如操作本地文件時你僅需要一行代碼而不需要Java的許多流包裝類.各種語言有其天然的適合的應(yīng)用范圍.用Python處理一些簡短程序類似與操作系統(tǒng)的交互編程工作最省時省力.

Python應(yīng)用場合

足夠簡單的任務(wù),例如一些shell編程.如果你喜歡用Python設(shè)計大型商業(yè)網(wǎng)站或者設(shè)計復(fù)雜的游戲.

2茎用、快速入門

2.1 Hello world

安裝完P(guān)ython之后(我本機(jī)的版本是2.5.4),打開IDLE(Python GUI) , 該程序是Python語言解釋器,你寫的語句能夠立即運行.我們寫下一句著名的程序語句:

print "Hello,world!"

并按回車.你就能看到這句被K&R引入到程序世界的名言.

在解釋器中選擇"File"--"New Window" 或快捷鍵 Ctrl+N , 打開一個新的編輯器.寫下如下語句:

print "Hello,world!"

raw_input("Press enter key to close this window...");

保存為a.py文件.按F5,你就可以看到程序的運行結(jié)果了.這是Python的第二種運行方式.

找到你保存的a.py文件,雙擊.也可以看到程序結(jié)果.Python的程序能夠直接運行,對比Java,這是一個優(yōu)勢.

2.2 國際化支持

我們換一種方式來問候世界.新建一個編輯器并寫如下代碼:

print "歡迎來到奧運中國!"

raw_input("Press enter key to close this window...");

在你保存代碼的時候,Python會提示你是否改變文件的字符集,結(jié)果如下:

-*- coding: cp936 -*-

print "歡迎來到奧運中國!"

raw_input("Press enter key to close this window");

將該字符集改為我們更熟悉的形式:

# -*- coding: GBK -*-

print "歡迎來到奧運中國!" # 使用中文的例子

raw_input("Press enter key to close this window");

程序一樣運行良好.

2.3 方便易用的計算器

用微軟附帶的計算器來計數(shù)實在太麻煩了.打開Python解釋器,直接進(jìn)行計算:

a=100.0

b=201.1

c=2343

print (a+b+c)/c

2.4 字符串,ASCII和UNICODE

可以如下打印出預(yù)定義輸出格式的字符串:

print """

Usage: thingy [OPTIONS]

? ? -h? ? ? ? ? ? ? ? ? ? ? ? Display this usage message

? ? -H hostname? ? ? ? ? ? ? Hostname to connect to

"""

字符串是怎么訪問的?請看這個例子:

word="abcdefg"

a=word[2]

print "a is: "+a

b=word[1:3]

print "b is: "+b # index 1 and 2 elements of word.

c=word[:2]

print "c is: "+c # index 0 and 1 elements of word.

d=word[0:]

print "d is: "+d # All elements of word.

e=word[:2]+word[2:]

print "e is: "+e # All elements of word.

f=word[-1]

print "f is: "+f # The last elements of word.

g=word[-4:-2]

print "g is: "+g # index 3 and 4 elements of word.

h=word[-2:]

print "h is: "+h # The last two elements.

i=word[:-2]

print "i is: "+i # Everything except the last two characters

l=len(word)

print "Length of word is: "+ str(l)

請注意ASCII和UNICODE字符串的區(qū)別:

print "Input your Chinese name:"

s=raw_input("Press enter to be continued...");

print "Your name is ... : " +s;

l=len(s)

print "Length of your Chinese name in asc codes is:"+str(l);

a=unicode(s,"GBK")

l=len(a)

print "I'm sorry we should use unicode char!Characters number of your Chinese \

name in unicode is:"+str(l);

2.5 使用List

類似Java里的List,這是一種方便易用的數(shù)據(jù)類型:

word=['a','b','c','d','e','f','g']

a=word[2]

print "a is: "+a

b=word[1:3]

print "b is: "

print b # index 1 and 2 elements of word.

c=word[:2]

print "c is: "

print c # index 0 and 1 elements of word.

d=word[0:]

print "d is: "

print d # All elements of word.

e=word[:2]+word[2:]

print "e is: "

print e # All elements of word.

f=word[-1]

print "f is: "

print f # The last elements of word.

g=word[-4:-2]

print "g is: "

print g # index 3 and 4 elements of word.

h=word[-2:]

print "h is: "

print h # The last two elements.

i=word[:-2]

print "i is: "

print i # Everything except the last two characters

l=len(word)

print "Length of word is: "+ str(l)

print "Adds new element..."

word.append('h')

print word

2.6 條件和循環(huán)語句

# Multi-way decision

x=int(raw_input("Please enter an integer:"))

if x<0:

? ? x=0

? ? print "Negative changed to zero"

elif x==0:

? ? print "Zero"

else:

? ? print "More"

# Loops List

a = ['cat', 'window', 'defenestrate']

for x in a:

? ? print x, len(x)

2.7 如何定義函數(shù)

# Define and invoke function.

def sum(a,b):

? ? return a+b

func = sum

r = func(5,6)

print r

# Defines function with default argument

def add(a,b=2):

? ? return a+b

r=add(1)

print r

r=add(1,5)

print r

并且,介紹一個方便好用的函數(shù):

# The range() function

a =range(5,10)

print a

a = range(-2,-7)

print a

a = range(-7,-2)

print a

a = range(-2,-11,-3) # The 3rd parameter stands for step

print a

2.8 文件I/O

spath="D:/download/baa.txt"

f=open(spath,"w") # Opens file for writing.Creates this file doesn't exist.

f.write("First line 1.\n")

f.writelines("First line 2.")

f.close()

f=open(spath,"r") # Opens file for reading

for line in f:

? ? print line

f.close()

2.9 異常處理

s=raw_input("Input your age:")

if s =="":

? ? raise Exception("Input must no be empty.")

try:

? ? i=int(s)

except ValueError:

? ? print "Could not convert data to an integer."

except:

? ? print "Unknown exception!"

else: # It is useful for code that must be executed if the try clause does not raise an exception

? ? print "You are %d" % i," years old"

finally: # Clean up action

? ? print "Goodbye!"

2.10 類和繼承

class Base:

? ? def __init__(self):

? ? ? ? self.data = []

? ? def add(self, x):

? ? ? ? self.data.append(x)

? ? def addtwice(self, x):

? ? ? ? self.add(x)

? ? ? ? self.add(x)

# Child extends Base

class Child(Base):

? ? def plus(self,a,b):

? ? ? ? return a+b

oChild =Child()

oChild.add("str1")

print oChild.data

print oChild.plus(2,3)

2.11 包機(jī)制

每一個.py文件稱為一個module,module之間可以互相導(dǎo)入.請參看以下例子:

# a.py

def add_func(a,b):

? ? return a+b

# b.py

from a import add_func # Also can be : import a

print "Import add_func from module a"

print "Result of 1 plus 2 is: "

print add_func(1,2)? ? # If using "import a" , then here should be "a.add_func"

module可以定義在包里面.Python定義包的方式稍微有點古怪,假設(shè)我們有一個parent文件夾,該文件夾有一個child子文件夾.child中有一個module a.py . 如何讓Python知道這個文件層次結(jié)構(gòu)?很簡單,每個目錄都放一個名為_init_.py 的文件.該文件內(nèi)容可以為空.這個層次結(jié)構(gòu)如下所示:

parent

? --__init_.py

? --child

? ? -- __init_.py

? ? --a.py

b.py

那么Python如何找到我們定義的module?在標(biāo)準(zhǔn)包sys中,path屬性記錄了Python的包路徑.你可以將之打印出來:

import sys

print sys.path

通常我們可以將module的包路徑放到環(huán)境變量PYTHONPATH中,該環(huán)境變量會自動添加到sys.path屬性.另一種方便的方法是編程中直接指定我們的module路徑到sys.path 中:

import sys

sys.path.append('D:\\download')

from parent.child.a import add_func

print sys.path

print "Import add_func from module a"

print "Result of 1 plus 2 is: "

print add_func(1,2)

總結(jié)

你會發(fā)現(xiàn)這個教程相當(dāng)?shù)暮唵?許多Python特性在代碼中以隱含方式提出,這些特性包括:Python不需要顯式聲明數(shù)據(jù)類型,關(guān)鍵字說明,字符串函數(shù)的解釋等等.我認(rèn)為一個熟練的程序員應(yīng)該對這些概念相當(dāng)了解,這樣在你擠出寶貴的一小時閱讀這篇短短的教程之后,你能夠通過已有知識的遷移類比盡快熟悉Python,然后盡快能用它開始編程.

當(dāng)然,1小時學(xué)會Python頗有嘩眾取寵之嫌.確切的說,編程語言包括語法和標(biāo)準(zhǔn)庫.語法相當(dāng)于武術(shù)招式,而標(biāo)準(zhǔn)庫應(yīng)用實踐經(jīng)驗則類似于內(nèi)功,需要長期鍛煉.Python學(xué)習(xí)了Java的長處,提供了大量極方便易用的標(biāo)準(zhǔn)庫供程序員"拿來主義".(這也是Python成功的原因),在開篇我們看到了Python如何調(diào)用Windows cmd的例子,以后我會盡量寫上各標(biāo)準(zhǔn)庫的用法和一些應(yīng)用技巧,讓大家真正掌握Python.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棍矛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乳蛾,更是在濱河造成了極大的恐慌暗赶,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肃叶,死亡現(xiàn)場離奇詭異蹂随,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)因惭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門岳锁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹦魔,你說我怎么就攤上這事激率。” “怎么了勿决?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵乒躺,是天一觀的道長。 經(jīng)常有香客問我低缩,道長嘉冒,這世上最難降的妖魔是什么曹货? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮讳推,結(jié)果婚禮上顶籽,老公的妹妹穿的比我還像新娘。我一直安慰自己银觅,他們只是感情好礼饱,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著究驴,像睡著了一般镊绪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纳胧,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天镰吆,我揣著相機(jī)與錄音帘撰,去河邊找鬼跑慕。 笑死,一個胖子當(dāng)著我的面吹牛摧找,可吹牛的內(nèi)容都是我干的核行。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蹬耘,長吁一口氣:“原來是場噩夢啊……” “哼芝雪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起综苔,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤惩系,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后如筛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堡牡,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年杨刨,在試婚紗的時候發(fā)現(xiàn)自己被綠了晤柄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡妖胀,死狀恐怖芥颈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赚抡,我是刑警寧澤爬坑,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站涂臣,受9級特大地震影響妇垢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一闯估、第九天 我趴在偏房一處隱蔽的房頂上張望灼舍。 院中可真熱鬧,春花似錦涨薪、人聲如沸骑素。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽献丑。三九已至,卻和暖如春侠姑,著一層夾襖步出監(jiān)牢的瞬間创橄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工莽红, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留妥畏,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓安吁,卻偏偏與公主長得像醉蚁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鬼店,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容