零基礎入門:從一個小程序開始續(xù)
上次我們用完成了一個小任務:把一張200 * 200的圖片變成了100 * 100。
程序如下:
from PIL Image
img = Image.open('/Users///photo/photo.jpeg')
w, h = img.size
img.((w//2,h/2))
img.save('/Users///photo/.jpeg','jpeg')
不知道你注意沒有,這個小程序存在著很多問題易語言圖片處理模塊,首先,如果我們選擇的圖片不存在會怎么樣呢?
按照正常的邏輯,當我們沒有找到這張圖片的時候,我們應該停下這個程序的后續(xù)操作。那么如何實現(xiàn)呢?這里就需要使用判斷語法if.
if 顧名思義就是“是否”,那么就是對后面的內容判斷,是真是假。在程序中,我 們對判斷的對象,是要求具有二象性的,也就是說它總是真或者就是假。通常我們用“1”來代表真,“0”代表假。這種變量還有另外一種稱呼就是布爾變量。bool值只有兩個“1”“0”。那么當我們去尋找這張圖片之后,就要對其是否存在這個狀態(tài)進行判斷.可惜的是,當我們使用Image.open這個函數(shù)時,當我們直接對img 這個變量進行判斷時,發(fā)現(xiàn)
也就是說Image這個工具為我們完成了太多的操作,以至于它只能去打開一個必須存在的圖片,這在現(xiàn)實中是存在著邏輯的漏洞的,因為我們無法保證每次都有圖片存在。
所以我們要把這一步進行拆分,第一步我們需要去查找圖片是否存在,當存在的時候才會去利用Image.open進行操作。
值得欣慰的是,Image還提供了從文件IO獲取圖片。
這樣我們修改程序:
當圖片存在的時候,我們才會進行Image等操作,當打開文件失敗易語言圖片處理模塊,就會拋出異常,而走到異常分支,最后當我們完成操作的時候,需要走分支將數(shù)據(jù)流斷開,以免造成資源浪費和引入不確定的錯誤。
看到這里,不知道你注意到沒有,這里有幾個特殊的地方:
- 我們注意到這些代碼之間存在著不同的縮進。try,else等頂格寫,而分支下面的操作語句則縮進了四個空格。在中縮進代表著代碼間的附屬關系,通常下一級要比上一級鎖進四個空格。4是怎么來的呢?這是一個tab的長度,但是并不要因為是一個tab長度而隨便使用tab來縮緊,因為在很多編輯器里面默認的tab很可能不是四個空格,需要你人工的設定。當然直接敲四個空格可能更準確但也更費時,所以寫代碼之前要確認好tab的長度。
- f= None 這是定義了一個變量,用于存儲接收到的文件數(shù)據(jù)。None在代表著空值,但和我們常見的“NULL”和“0”還不一樣,在中,認為所有的事物都是一個對象,也就是說也是面向對象編程的。面向對象這個詞匯,看起來很難理解,但是聯(lián)系實際,你可能會更容易理解,在現(xiàn)實中,我們接觸到的事物都是對象,所謂對象,就是一個由屬性和行為組成的完整個體,它應該具有完整的數(shù)據(jù)和對數(shù)據(jù)操作的函數(shù)。
- try-- 控制塊,這在上面講述了各個分支的含義,try-else-控制塊,大多用于存在拋出異常操作的場景,這樣有助于避免因異常而導致程序出錯。記住:是必不可少的,這是開啟本分支操作的和區(qū)分關鍵字和操作字的分隔符。
在實際中我們可能需要大量進行讀寫,但是如果每次都是用try-else-控制塊,就顯得很不方便了。所以提供了with - as語法。
使用with-as改寫上面的函數(shù):
是不是變的更加的簡潔了呢?
這樣我們就可以把這個程序變得更加的健壯。