Lesson 5 Python中的輸入與判斷
健全的程序大凡都需要輸入的功能,所以要學(xué)習(xí)一下簡(jiǎn)單的輸入:
輸入要使用的是raw_input或者input函數(shù),區(qū)別是raw_input直接把你的輸入作為字符串返回,而input則在raw_input的基礎(chǔ)上把字符串轉(zhuǎn)換為數(shù)字返回(如果你輸入$@#$$怎么辦?自己試試看)。我們就利用這兩個(gè)輸入函數(shù)來作一些有趣的事情。
代碼:
your_name = raw_input("please input your name:") hint = "welcome! %s" % your_name print hint |
不簡(jiǎn)單吧,還有%呢。%s表示在這個(gè)位置插入一個(gè)字符串,%表示把后面提供的參數(shù)“推”入前面的字符串中,所以推的結(jié)果是把%s推出去了,把your_name給填入那個(gè)地方了。printf知道吧,C中的printf就是一樣的嘛。
代碼:
inputed_num = 0 while 1: ? ? inputed_num = input("input a number between 1 and 10\n") ? ? if inputed_num >= 10: ? ?? ???pass ? ? elif inputed_num < 1: ? ?? ???pass ? ? else: ? ?? ???break print "hehe, don't follow, won't out" |
pass就是pass了,過了嘛,什么都不干了。break就是跳出這個(gè)while 1(無窮循環(huán),1總是真的,while總是執(zhí)行)。\n是換行,不會(huì)全部忘光了吧。
Lesson 6 Python余興節(jié)目
from Tkinter import * root = Tk() w = Label(root, text="Hello, world!") w.pack() root.mainloop() |
呵呵,一次太超前了一點(diǎn),不過也不是解釋不清楚。我干脆也不解釋了吧。給大家增進(jìn)一點(diǎn)興趣。
---------
還是解釋一下
fromt Tkinter import *
是引入一個(gè)模塊,這個(gè)模塊用來創(chuàng)建GUI(Graphic User Interface)窗口
Tk()創(chuàng)建了一個(gè)主窗口
Label()創(chuàng)建一個(gè)標(biāo)簽
Label的第一個(gè)參數(shù)是root表明Label是在這個(gè)主窗口中的。
w.pack()是指用缺省的方式把Label放置在主窗口中
root.mainloop()開始了一個(gè)循環(huán),是等待你的輸入的循環(huán)。
Lesson 7 Python基本語法要素齊動(dòng)員
現(xiàn)在的目的是盡量想出一個(gè)用的東西僅限于內(nèi)置的變量類型和語句的一個(gè)綜合的例子,我想還是那個(gè)聯(lián)系人表的例子吧
################ #呵呵,還忘記了講注釋 #第一個(gè)算是完整的程序 ################ contact = {} contact_list = [] while 1: ? ? contact['name'] = raw_input("please input name: ") ? ? contact['phone'] = raw_input("please input phone number: ") ? ? contact_list.append(contact.copy()) ? ? go_on = raw_input("continue?\n") ? ? if go_on == "yes": ? ?? ???pass ? ? elif go_on == "no": ? ?? ???break ? ? else: ? ?? ???print "you didn't say no\n" i = 1 for contact in contact_list: ? ? print "%d: name=%s" % (i, contact['name']) ? ? print "%d: phone=%s" % (i, contact['phone']) ? ? i = i + 1 |
首先是回憶一下字符串
字符串既能夠用""也能夠用''。然后是很有特色的%操作,起到格式化字符串的作用,前面僅僅在字符串中有一個(gè)%s,現(xiàn)在有%d和%s兩個(gè),分別代表插入十進(jìn)制數(shù)值和字符串于%x標(biāo)記的位置處。
然后是列表
列表是順序的序列,用append在后面附加,也能構(gòu)用索引值索引。所以我們完全可以用一個(gè)變量保存len(contact_list)得到的長(zhǎng)度,然后一個(gè)個(gè)的遍歷,不過這里展示了另外一種非常方便的方法。而且值得注意的是append()中的參數(shù),我使用了contact.copy(),你可以嘗試著把copy()給去掉,觀察結(jié)果你就知道了所謂的append是怎么干的了,特別是你對(duì)指針之類的東西很有感覺的話(但是在Python中是沒有指針這個(gè)概念的)
再來看看字典
字典是鍵(key)和值(value)的對(duì)應(yīng)組合成的無序的序列。所以你存的時(shí)候要指明鍵(name或者phone),而且取的時(shí)候也是一樣的。
接下來是判斷
if是很好用的,==表示判斷兩個(gè)是否相等,=表示把右邊的賦給左邊的。而且可以直接判斷字符串是否相等,這個(gè)太方便了,如果你曾經(jīng)用過strcpy()的話,就知道了。elif是表示else if的意思,如果if不滿足就判斷elif的條件是否滿足,最后是到else中去。
循環(huán)是個(gè)主體
while和for都是循環(huán)。不過這里while就沒什么說的了,又是很經(jīng)典的while 1,死循環(huán),然后必須在里面用break來跳出。for和C中的for是不一樣的,for in才是一個(gè)完整的語句,指的是從一個(gè)能夠逐一取值的序列中(比如list),一個(gè)一個(gè)的取出值賦給for后面指定的變量中,直到取空,循環(huán)結(jié)束。其實(shí)回想一般用C中的for的經(jīng)歷,也大體如此。而且你還可以用for i in range(1,100)來指定一個(gè)范圍從多少到多少。可以說for in充分體現(xiàn)了python的體貼周到,用起來很直觀,不會(huì)繞彎。
接下來就是運(yùn)行了,大家慢慢調(diào)試吧。下次可能是講異常處理,因?yàn)槲矣X得在深入到使用各種高級(jí)的要素之前,先要學(xué)會(huì)怎么去處理異常。最常見的異常應(yīng)該是input(),然后你給出的輸入是一個(gè)無法轉(zhuǎn)換為數(shù)字的字符串了,那么我們就要來處理它。
Lesson 8 Python中的錯(cuò)誤檢測(cè)
寫程序什么最重要?完成功能最重要。但是程序中難免要有用戶的輸入,對(duì)于這些寫的時(shí)候未可預(yù)知的因素中間可能出現(xiàn)的錯(cuò)誤,一般稱作異常。對(duì)于異常情況的處理,不同語言有不同的做法,比如檢查函數(shù)的返回值之類的,但是那種辦法會(huì)把代碼弄成一團(tuán)漿糊。Python在這個(gè)方面是比較先進(jìn)的,我們從一個(gè)例子來看看:
呵呵,看不同吧。其實(shí)input是輸入,print是輸出。也就是把輸入的東西立即輸出。但是這個(gè)和
有什么不同呢?
不同的地方是,input()會(huì)在raw_input()接收了“
字符串”的輸入之后進(jìn)行一些處理,比如你是輸入1+2,然后輸出的就是3了,而raw_input就是原原本本的1+2的輸出了。用代碼表示就是
eval是求表達(dá)式的值,任何一個(gè)簡(jiǎn)單的python表達(dá)式,就像1+2這樣的作為字符串送入,就能把值從eval處理之后取出來。
現(xiàn)在你實(shí)驗(yàn)一下"sdfsdf”之后,你會(huì)發(fā)現(xiàn)提示你
提示:
Traceback (most recent call last): ??File "", line 1, in -toplevel- ? ? input() ??File "", line 0, in -toplevel- NameError: name 'sdfsdf' is not defined |
如果輸入其他稀奇古怪的字符串還可能有其他的出錯(cuò)提示,我們現(xiàn)在要做的就是捕捉這種由用戶輸入引起的錯(cuò)誤。這么來作:
try: ? ? print input() except: ? ? print 'there is an error in your input' |
這下你無論怎么輸入都不會(huì)有什么其他的提示了,就是自己設(shè)定的print語句作為提示。現(xiàn)在把try except的組合去掉,回到print input()你再嘗試一下:
1/0
這個(gè)顯然是一個(gè)錯(cuò)誤,被零除的錯(cuò)誤。那么專門來捕捉一下這個(gè)錯(cuò)誤:
try: ? ? print input() except ZeroDivisionError: ? ? print 'can not be divided by zero' |
這下你能夠捕捉到被零除的錯(cuò)誤了。然后你再嘗試其他的輸入,可能錯(cuò)誤就沒有被捕捉了。所以再補(bǔ)上:
try: ? ? print input() except ZeroDivisionError: ? ? print 'can not be divided by zero' except: ? ? print 'there is an error in your input' |
注意,捕捉所有錯(cuò)誤的except必須放在所有的except的最后一位。明白了?OK
還有更多的能夠捕捉的錯(cuò)誤,自己查手冊(cè)吧(暫時(shí)看不了手冊(cè)沒關(guān)系,慢慢來嘛)。以后還能夠自己raise(引發(fā))異常呢。不過那都是比較高級(jí)的應(yīng)用了,對(duì)于出錯(cuò)處理從一開始就有這個(gè)印象,并牢記在心中對(duì)于以后寫大一些的軟件很有好處。
Lesson 9 走向模塊化的第一步
大規(guī)模的程序設(shè)計(jì)需要你把一個(gè)大的程序拆分成n個(gè)模塊。然后把模塊進(jìn)行組合,交互成為一個(gè)完整的程序。你不可能像現(xiàn)在這樣,從頂寫到尾。。。
那么我們從
函數(shù)開始。
def square(x): ? ? return x**2
print square(5) |
簡(jiǎn)單吧,這個(gè)是我看過的函數(shù)定義中最簡(jiǎn)潔的。def表示這個(gè)開始定義一個(gè)函數(shù),x是參數(shù),參數(shù)是不需要類型的,因?yàn)閜ython是不需要明確指出類型的。return是返回值,返回的值插入到調(diào)用函數(shù)的地方。再?gòu)?fù)雜一些
def multiply(a, b): ? ? return a*b
print multiply(1,2) |
這是兩個(gè)參數(shù)的函數(shù)。那么返回兩個(gè)值呢?
def swap(a, b): ? ? return (b,a) print swap(1,2) |
呵呵,其實(shí)這里返回的并不是兩個(gè)值,而是一個(gè)值。怎么說呢。(b, a)就是一個(gè)東西,是一個(gè)元組(turple),你可以用這樣的方式成生一個(gè)元組,并使用它。元組是基本的變量類型:
my_turple = (1, 2, 3) my_list = [] for i in my_turple: ? ? my_list.append(i) print my_list |
其實(shí)元組和列表非常像,但是列表的長(zhǎng)度是可以變化的,而且成員是可以改變的。但是元組是什么都不能變的,是只讀的。
對(duì)于高級(jí)一點(diǎn)的話題:傳遞進(jìn)來的參數(shù)是否可以被修改,這個(gè)問題取決于你傳遞了什么近來。如果是數(shù)字或者字符串,是不能夠改變的,但是如果是這樣的:
def test_func(list_be_passed): ? ? list_be_passed[0] = 'towin' my_list = ['taowen'] print my_list test_func(my_list) print my_list |
就能夠改變傳遞近來的參數(shù)了,所以處理的時(shí)候要小心,必要的時(shí)候copy一下再傳遞。
函數(shù)簡(jiǎn)單吧,但是很好用的。想起C中的函數(shù)那么那么多麻煩,真是感慨萬千啊。下面是應(yīng)該講GUI編程呢,還是面向?qū)ο竽兀克伎家幌?br />
Lesson 10 Python的文件操作
文件操作....是一個(gè)語言和外界聯(lián)系的主要方法....現(xiàn)在以txt為例簡(jiǎn)單的講一下...
首先是建立關(guān)聯(lián)...假設(shè)在存在以下文件 c:\a.txt
This is line #1 This is line #2 This is line #3 END |
>>> xxx = file('c:\\a.txt', 'r') |
關(guān)鍵字的第一部分,是文件路徑及名稱。注意這里面,路徑需要用
\\第二部分,是對(duì)文件的模式或者叫權(quán)限,一般有以下3種 "r" (read), "w" (write)和 "a"(append).
之后,就可以利用
xxx_content = infile.read()
xxx_content = infile.readlines()
來讀取文件內(nèi)容了
>>> xxx = file('c:\\a.txt', 'r') >>> xxx_content = xxx.read() >>> print xxx_content This is line #1 This is line #2 This is line #3 END >>> xxx.close() >>>
>>> infile = file('c:\\a.txt', 'r') >>> xxx = file('c:\\a.txt', 'r') >>> for xxx_line in xxx.readlines(): ? ? ? ? print 'Line:', xxx_line ??????? Line: This is line #1
Line: This is line #2
Line: This is line #3
Line: END >>> xxx.close() >>> |
然后是文件的寫入
>>> xxx=file('c:\\test.txt','w') >>> xxx.write('billrice') >>> xxx.write('testtest') >>> xxx.write('enter\n') >>> xxx.writelines(['billrice','ricerice']) >>> xxx.close() >>> >>> xxx=file('c:\\test.txt','r') >>> content=xxx.read() >>> print content billricetesttestenter billricericerice >>> |
需要注意的是...在
xxx.close()之前,c盤下面只有一個(gè)空空的test.txt,xxx.close()的作用相當(dāng)于最后的存盤。