1.異常-01
在程序開發中,如果對某些代碼的執行不確定(程序的語法完全正確) 可以增加try來捕獲異常 try: 嘗試執行的代碼 expect: 出現錯誤的處理
實驗:
try: num=int(raw_input('請寫入一個整數:')) except: print '請輸入一個正確的整數' #無論是否輸入錯誤額,程序都會正常執行 print '*' * 50
輸入正確結果:
輸入錯誤結果:
2.異常-02
當python解釋器拋出異常時,最后一行錯誤信息的第一個單詞,就是錯誤類型。
實驗:
#1.提示用戶輸入一個整數 #2.使用6除以用戶輸入的整數并且輸出 try: num = int(raw_input('請輸入一個整數:')) result = 6 / num print result except ZeroDivisionError: print '除0錯誤 0不能做除數' except ValueError: print '請輸入正確的整數' #1.輸入的不是數字 #2.0不能做除數
輸入錯誤的結果:
輸入正確的結果:
3.異常-03
捕獲未知錯誤: 在開發的時候,要判斷所有可能出現的錯誤,是有一定難度的 如果希望程序無論出現任何錯誤,都不會因python解釋器拋出異常而終止 可以再增加一個except
實驗:
try: num = int(raw_input('請輸入一個整數:')) result = 6 / num print result #捕獲未知異常 #result:一個變量名,可以隨便起名 except Exception as result: print '未知錯誤額 %s' % result
輸入錯誤的結果:
輸入正確的結果:
4.異常-04
格式: try: #嘗試執行的代碼 pass except 錯誤類型1: pass except 錯誤類型2: pass expect Exception as result else: #沒有異常才會執行的代碼 pass finally: #無論是否有異常,都會執行的代碼 pass
實驗:
try: num = int(raw_input('請輸入一個整數:')) result = 6 / num print result #捕獲未知異常 #result:一個變量名,可以隨便起名 except Exception as result: print '未知錯誤額 %s' % result #只有在沒有異常的時候,才會執行的代碼 else: print '嘗試成功!' #無論是否有異常,都會執行的代碼 finally: print '================'
輸入錯誤的結果:
輸入正確的結果:
5.異常-05
異常的傳遞 異常的傳遞--當函數/方法執行出現異常,會將異常傳遞給函數/方法調用的一方 如果傳遞到主程序,依舊沒有異常處理,程序才會終止,可以在主程序中增加 異常捕獲,而在主函數中調用其他函數,只要出現異常,都會傳遞到主函數的異常 捕獲中,這就不需要在代碼中,增加大量的異常捕獲,能夠保證代碼的整潔
實驗:
def demo1(): return int(raw_input('請輸入整數:')) def demo2(): return demo1() #利用異常的傳遞性,在主程序中捕獲異常 try: print demo2() except Exception as result: print '未知錯誤 %s' % result
輸入錯誤的結果:
輸入正確的結果
6.異常-06
實驗:
需求: 判斷用戶輸入密碼 1.<8 錯誤額 2.>=8 返回輸入的密碼
def input_passwd(): #1.提示用戶輸入密碼 pwd = raw_input('請輸入密碼') #2.判斷密碼的長度 >-=8,就返回用戶輸入的密碼 if len(pwd) >= 8 : return pwd #3.<8,主動拋出異常 print '主動拋出異常' #1.創建異常對象(可以添加錯誤信息) ex = Exception('密碼長度不夠') raise ex #注意:只拋出異常而不捕獲異常,代碼會出錯 try: print input_passwd() except Exception as result: print result
輸入正確的結果:
輸入錯誤的結果:
建立test1,test2
test1:
title = '模塊1' #函數 def say_hello(): print '我是 %s' % title #類 class Cat(object): pass
test2:
title = '模塊2' #函數 def say_hello(): print '我是 %s' % title #類 class Dog(object): pass
1.模塊-01
__name__屬性 __name__屬性可以做到,測試模塊內的代碼只在測試情況下被運行,而在被導入時不會執行 __name__是python的一個內置屬性,記錄著一個字符串 如果是被其他文件導入時,__name__就是模塊名 如果是當前執行的程序,__name__就是_mian_
實驗:
# 全局變量,函數,類 直接執行的代碼不是向外界提供的工具 def say_hello(): print 'helll hello' # print 'have a nice day!' # 如果直接在模塊中輸入,得到的時__main__ if __name__ == '__main__': print __name__ #文件被導入的時候,能夠直接被執行的代碼不需要被執行 print 'gf 開發的程序' say_hello()
實驗結果:
2.模塊-02
#在導入模塊時,每個導入應獨占一行 import test1 import test2 test1.say_hello() test2.say_hello() dog = test2.Dog() print dog cat = test1.Cat() print cat
實驗結果:
3.模塊-03
#使用as指定模塊的別名(大駝峰命名法) import test1 as CatModule import test2 as DogModule DogModule.say_hello() CatModule.say_hello() dog = DogModule.Dog() print dog cat = CatModule.Cat() print cat
4.模塊-04
from test1 import Cat from test2 import say_hello from test1 import say_hello as test1_say_hello say_hello() test1_say_hello() miaomiao = Cat()
5.模塊-05
python的解釋器在導入模塊的時候,會: 1.搜索當前目錄指定的模塊文件,如果有就直接導入 2.如果沒有,在搜索系統目錄 注意:在開發時,給文件起名,不要和系統模塊文件重名
實驗:
import random rand = random.randint(0,10) print rand
6.模塊-06
斷言:可以理解為提前預言,讓人更好的知道錯誤原因
實驗:
def func(num,div): assert (div != 0),'div不能為0' return num / div print func(10,2)
7.模塊-07
在很多python文件中會看到以下格式的代碼 #導入模塊 #定義全部變量 #定義類 #定義函數 #在代碼下方 def main(): pass if __name__=='__mian__' mian()
實驗:
建立一個test: def say_hello(): print 'helll hello' print __name__
#在導入的.py文件中,輸出是 文件名 import test
建立兩個名叫README和README_COPY的文件
建立方法 單擊鼠標右鍵 => New => File
1.文件-01
操作文件的函數/方法 在python中要操作文件需要記住的1個函數和3個方法 #python中一切皆對象 open :打開文件,并且返回文件操作對象 read :將文件內容讀取到內存 write :將指定內容寫入文件 close :關閉文件 open函數負責打開文件,并且返回文件對象 read/write/close三個方法都通過文件對象來調用 read方法--讀取文件 open函數的第一個參數是要打開的文件名(文件名區分大小寫) 如果文件存在,返回文件操作對象 如果文件不存在,會拋出異常 read方法可以一次性讀入并返回文件的所有內容 close方法負責關閉文件
實驗:
#如果忘記關閉文件,會造成系統損耗,而且會影響到后續對文件的運行 #1.打開文件 file = open('README') #2.操作文件 讀/寫 #read方法:讀取文件內容(一次性返回文件的所有內容) text = file.read() print text #3.關閉文件 #close方法:負責關閉文件 file.close() #在開發中,通常會先編寫打開和關閉的代碼
文件README中:
實驗結果:
2.文件-02
文件指針: 文件指針標記從哪個位置開始讀取數據 第一次打開文件時,通常文件指針會指向文件的開始位置 當執行了read方法后,文件指針會移動到讀取內容的末尾
#如果忘記關閉文件,會造成系統損耗,而且會影響到后續對文件的運行 #1.打開文件 file = open('README') #2.操作文件 讀/寫 #read方法:讀取文件內容(一次性返回文件的所有內容) text = file.read() print text #3.關閉文件 #close方法:負責關閉文件 file.close() #在開發中,通常會先編寫打開和關閉的代碼
文件中README:
實驗結果:
3.文件-03
#1.打開文件 file = open('README') #2.操作文件 讀/寫 #read方法:讀取文件內容(一次性返回文件的所有內容) text = file.read() print text #打印輸入內容的長度 print type(text) print len(text) print '*' * 50 text = file.read() print text print len(text) #3.關閉文件 #close方法:負責關閉文件 file.close() #在開發中,通常會先編寫打開和關閉的代碼
文件中README中:
實驗結果:
4.文件-04
打開文件的方式: name = open('文件名','訪問方式')
實驗:
#以寫的方式打開文件,如果文件存在會被覆蓋,如果文件不存在,創建新文件 #1.打開文件 file = open('README','w') #2.寫入文件 file.write('~~~~~') #3.關閉文件 file.close()
原文件README中:
實驗結果:
5.文件-05
# 以追加方式法開文件 # 如果該文件存在,文件指針會放在文件的末尾 # 如果文件不存在,創建文件并寫入 # 1.打開文件 file = open('README','a') # 2.寫入文件 file.write('linux') # 3.關閉文件 file.close()
原文件README中:
實驗結果:
6.文件-06
按行讀取文件: read方法默認會把文件的所有內容一次性讀到內存 如果文件太大,對內存的占用會非常嚴重 readline方法: readline方法可以一次性讀取一行內容 方法執行后,會把文件指針移動到下一行,準備再次讀取
實驗:
# 讀取大文件的正確姿勢 file = open('README') # 為什么要寫成死循環:因為我們不知道要讀取的文件有多少行 while True: text = file.readline() # 如果文件指定到文件的最后一行,那么就讀不到內容 if not text: break # 每讀取一行,末尾都已經有一個\n print text file.close()
文件README中:
運行結果:
7.文件-07
實驗:
#1.打開文件 #源文件以只讀的方式打開 file_read = open('README') #目標文件以寫的方式打開 file_write = open('README_COPY','w') #從源文件中讀取內容 text = file_read.read() #將讀取到的內容寫到目標文件中 file_write.write(text) #關閉文件 file_read.close() file_write.close()
文件README
文件和README_COPY
實驗結果:
README_COPY文件中:
8.文件-08
讀取大文件
實驗:
# 1.打開文件 file_read = open('README') file_write = open('README_COPY', 'w') #讀寫 while True: text = file_read.readline() if not text: break file_write.write(text) #關閉 file_read.close() file_write.close()
文件README中
文件README_COPY中
實驗結果:
文件README_COPY
關鍵字with在不需要訪問文件后將其關閉,在這個程序中, 我們調用了open(),但沒有調用close();你也可以調用open()和close來打開 和關閉文件,但這樣做時,如果程序存在bug,導致close()語句沒有執行, 文件將不會關閉,未妥善地關閉文件可能會導致數據丟失或受損, 如果在程序中過早地調用close(), 你會發現需要使用文件時它已經關閉(無法訪問), 這會導致更多地錯誤,你并非在任何情況下都能輕松地確定關閉文件地恰當時機 通過使用with結構,可讓python去確定, 你只管打開文件,并在需要時使用它, python會在合適的時候自動將其關閉
建立名叫linux和pi_digits的文件
1.文件-11
with open('pi_digits') as file_object: contents = file_object.read() print contents
文件pi_digits中
運行結果:
2.文件-12
filename = 'pi_digits' with open(filename) as file_object: for line in file_object: print line
文件pi_digits中:
運行結果:
3.文件-13
filename = 'pi_digits' with open(filename) as file_object: lines = file_object.readline() for line in lines: print line
文件pi_digits中:
運行結果:
4.文件-14
filename = 'linux' with open(filename,'w') as file_object: file_object.write('I love python.\n') file_object.write('I love linux.')
文件linux中:
運行結果:
5.文件-15
filename = 'linux' with open(filename,'a') as file_object: file_object.write('I love python.\n') file_object.write('I love linux.')
文件linux中:
運行結果:
很多程序都要求用戶輸入某種信息 程序都把用戶提供的信息儲存在列表和字典等數據結構中, 用戶關閉程序時,你幾乎總要保存他們的信息: 一種簡單的方式是使用模塊json來儲存數據 (在python中使用json的時候,主要也就是json模塊,json是以一種良好的格式來進行數據交互) 模塊json讓你能夠將簡單的Python數據結構轉存到文件中, 并在程序再次運行時加載該文件中的數據, 你還可以使用json在Python程序之間分享數據, 更重要的是,json數據結構格式并非Python專用的, 這讓你能夠將以json格式儲存的數據與使用其他編程語言的人分享 注意:json(javascriptObject notation)格式最初是為了javascript開發的,但隨后成了一種常見格式, 被包括python在內的眾多語言采用
實驗一:
import json number = [1,2,3,4] with open('number.json','w') as f_obj: # 我們使用函數json.dump()將數字列表儲存到文件中 json.dump(number,f_obj)
運行結果:
會生成一個文件:number.json
實驗二:
import json filename = 'number.json' with open(filename) as f_obj: #我們使用函數json.load加載儲存在number.json的信息 #并將其儲存到變量number中 number = json.load(f_obj) print number
運行結果:
實驗三:
import json username = raw_input('what is your name?') filename = 'username.json' with open(filename,'w') as f_obj: json.dump(username,f_obj) print 'We will remember you when you come back,%s' % username
運行結果:
會創建一個文件:username.json
實驗四:
前提:存在username.json 且存在數據
import json filename = "username.json" with open(filename) as f_obj: username = json.load(f_obj) print 'Welcome back, %s' % username
實驗五:
前提:存在username.json
需求: 如果以前儲存了用戶,就顯示 否則,就提示用戶輸入用戶名并儲存它
import json filename = "username.json" try: with open(filename) as f_obj: username = json.load(f_obj) except ValueError: username = raw_input("What is you name? ") with open(filename,"w") as f_obj: json.dump(username,f_obj) print "We'll remember you when you come back %s" % username #依賴于try代碼塊成功執行的代碼都應放到else代碼塊中: else: print "Welcome back %s " % username
運行結果:
若username.json存在數據
若username.json不存在數據