[Python入門] 04 文件與函數
在之前的入門系列中,我們已經接觸過了很多的數據,有零散的數字或字元變數,也有多個元素構成的集合變數如列表或字典。在這些應用中,它們都是直接在Python程序內部定義的,外部無法訪問到這些數據,甚至如果程序中斷,數據空間就會被釋放,這顯然不是長久之計。
「本系列所有代碼均可在原貼中運行,戳 這裡 前往原貼。」
01. 打開文件
比較合理的方法就是將數據存儲在文件(file)當中,文本文件.txt是最常見也最簡單的文件格式之一,因此先從文本文件開始,首先要將文件內容讀取到Python程序中,這裡用到的是open函數。
open函數有兩個參數,都是字元類型,分別是文件名和打開模式。文件名很容易理解,如果文件與Python程序文件位於同一目錄下,那麼只要寫明文件名+擴展名即可;如果文件另有去處,比如在其他路徑或者某個網路地址上,就需要指明相對或絕對路徑。
打開模式是open的第二個參數,默認設置為r即只讀模式,此模式下Python只能讀取內容而不能修改或追加。其他常用模式有:
open()函數返迴文件類的對象,還需要通過一些方法將其轉換為字元類型,而文件對象本身就具有這一方法.read()。下面打開了一個示例文本文檔,文件對象命名為f,請調用f的.read()對象轉換為字元,並用print()輸出。
02. 垃圾郵件
隨著網路科技的發展,信息存儲傳輸的成本越來越低,效率越來越高,生活固然因此收益,但隨之而來的問題卻也很多。比如,雖說收發電子郵件很方便,但是無良商家給我們猛發垃圾郵件也很方便。1994年我國第一封電子郵件"Across the Great Wall we can reach every corner in the world."發出的時候,估計誰也不會想到,普通用戶每天就能收到上百封垃圾郵件(更想不到真的要accross the Great Wall)。
做一個好人從來不是容易的事情,就像做忠臣要比奸臣還要奸。我們誰都不想被垃圾郵件轟炸,也不想轟炸別人,但是卻有必要熟悉產生垃圾郵件的那一套理論。
我們不生產垃圾郵件,只做垃圾郵件的搬運工,下面是一個常見的垃圾郵件示例:
垃圾郵件之所以垃圾,因為其信息沒有任何指向性,絕大多數情況下根本不契合我們的需求。這些信息肯定是有市場所以才會存在的,畢竟郵件推送雖然便宜,畢竟也不是免費的。
這樣的一封郵件,內容是不變的,只有地址是靈活的,這樣才能發的出去。有些高級一點的還會加上 君の名は,誘使你點開正文。
03. 正則表達式
現在我們來思考如何批量地撰寫+發送垃圾郵件,首先內容肯定有個模板用來反覆套用,我們把上面的文字存儲在文本文件email.txt當中。
下一步就是讀取內容並替換相應成分了,一種簡單暴力但有些土鱉的方法是,把文字按詞切分組成列表,然後列表循環匹配字元。更優雅的方法是使用正則表達式(Regular Expression):
下面來篡改古人的兩句詩,首先導入Python內置的正則表達式擴展庫re,並調用函數sub()。sub()函數需要3個參數:rule, replace和target。
正則表達式的應用極為廣泛,我們會在後文專門詳細探討,這裡只做簡單介紹。
04. 批量生產
在上一節當中,已經成功改寫了單個的文本內容,但是作為一個敬業的垃圾生產者,零打碎敲是不可取的。為了實現大規模工業化流水線生產,就需要定義一個函數(function)。
函數就像一個機器,放進原料(參數),得到產品(返回)。
(把生豬變成火腿腸的「函數」)
比如定義一個非常簡單的加法函數,返回值就是兩個輸入參數的和。定義函數的關鍵字是def,之後跟函數名+()。()內聲明參數名稱,以,分隔,這裡的聲明順序也就是調用時的默認參數順序。
假設我現在已經取得了NBA總得分榜前十名的郵件地址,並經過數據清洗整理為字典格式,存為address.json:
十個地址不多,我們固然可以手動一個一個改寫,或者直接對這一字典循環。但是我們將來可能要生產更多地垃圾郵件,推送給不同的人群(存在不同的文件里),郵件模板肯定也不能一成不變。那麼合理的策略應該是,編寫函數,以郵件模板文件和郵件列表文件為參數,輸出寫好的郵件。
今天先講到這裡,我們下期再續!
拓展閱讀:
用科學的力量讓你瞎眼——OpenAI的Dota2AI天下無敵?!
以彼之道,還施彼身——使用機器學習來揪出作弊的玩家
人工智慧揭秘,帶你了解AI的前世今生
官方微博:@景略集智
微信公眾號:jizhi-im
集智QQ群:557373801
商務合作:chenyang@jizhi.im
投稿轉載:kexiyang@jizhi.im
推薦閱讀: