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