基礎(chǔ)篇14講06丨python黑箱輸入與輸出_第1頁
基礎(chǔ)篇14講06丨python黑箱輸入與輸出_第2頁
基礎(chǔ)篇14講06丨python黑箱輸入與輸出_第3頁
基礎(chǔ)篇14講06丨python黑箱輸入與輸出_第4頁
基礎(chǔ)篇14講06丨python黑箱輸入與輸出_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

最簡單直接的輸入來自鍵盤操作,比如下面這個例代name=input('yourgender=input('youarea3######輸入youryouarea7e_str= etothematrix{prefix}e_dic='prefix':'Mr.'ifgender=='y'else'name':12 ##########輸出etothematrixMr.inut()函數(shù)暫停程序運(yùn)行,同時等待鍵盤輸入;直到回車被按下,函數(shù)的參數(shù)即為提示語,輸入的類型是字符串型(str)。注意,初學(xué)者在這里很容易犯錯,下面的例子我會講到。rint函數(shù)則接受字符串、數(shù)字、字典、列表甚至一些自定義類的輸出。我們再來看下面這個例子代a=1b=25print('a+b={}'.format(a+##########輸出a+b=print('typeofais{},typeofbis{}'.format(type(a),##########輸出typeofais<class'str'>,typeofbis<classprint('a+b={}'.format(int(a)+##########輸出a+b=這里注意,把str制轉(zhuǎn)換為int用int(),轉(zhuǎn)為浮點(diǎn)數(shù)請用float()。而在生產(chǎn)環(huán)境中使用強(qiáng)制轉(zhuǎn)換時,請記得加上tryexcept(即錯誤和異常處理,專欄后面文章會講到)。Python對int類型沒有最大限制(相比之下,C++的int最大為 個數(shù)字會產(chǎn)生溢出),但是對float類型依然有精度限制。這些特點(diǎn),除了在一些算法競賽中要注意,在生產(chǎn)環(huán)境中也要時刻,避免因為對邊界條件判斷不清而造成bug甚至我們回望一下幣圈。2018年4月23日中午11點(diǎn)30分左右,BEC代幣智能合約被。利用數(shù)據(jù)溢出的,與美圖合作的公司美鏈BEC的智能合約,成功地向兩個地址轉(zhuǎn)出了天量級別的BEC代幣,導(dǎo)致市場上的海量BEC被拋售,該數(shù)字貨幣的價值也幾近歸零,給BEC市場帶來了性的打擊。由此可見,雖然輸入輸出和類型處理事情簡單,但要慎之又慎。畢竟相當(dāng)比例的安全,都來自隨意的I/O處理。命令行的輸入輸出,只是Python互的最基本方式,適用一些簡單小程序的交互。而生產(chǎn)級別的Python代碼,大部分I/O則來自于文件、網(wǎng)絡(luò)、其他進(jìn)程的消息等等。接下來,我們來詳細(xì)分析一個文本文件讀寫。假設(shè)我們有一個文本文件in.txt,內(nèi)容如下代Ihaveadreamthatmyfourlittlechildrenwillonedayliveinanationwherethey23IhaveadreamthatonedaydowninAlabama,withitsviciousracists,...oneday45Ihaveadreamthatonedayeveryvalleyshallbeexalted,everyhillandmountain67Thisisourhope...Withthisfaithwewillbeabletohewoutofthemountainof89Andwhenthishappens,andwhenweallowdomring,whenweletitringfromevery好,讓我們來做一個簡單的NLP(自然語言處理)任務(wù)。如果你對此不太了解也沒有影首先,我們要清楚NLP任務(wù)的基本步驟,也就是下面的四文件去除所有標(biāo)點(diǎn)符號和換行符,并把所有大寫變成小合并相同的詞,統(tǒng)計每個詞出現(xiàn)的頻率,并按照詞頻從大到小排將結(jié)果按行輸出到文件out.txt你可以自己先思考一下,用Python何解決這個問題。這里,我也給出了我的代碼,并附代1import2#你不用太關(guān)心這個def#使用正則表達(dá)式去除標(biāo)點(diǎn)符號和text=re.sub(r'[^\w]','',7 #轉(zhuǎn)為小 text=#生成所有單詞的列word_list=text.split('#去除word_list=filter(None, #生成單詞和詞頻的 t=forwordinifwordnot t[word]=t[word]+= #按照 t= t.items(),key=lambdakv:kv[1], 29withopen('in.txt','r')as text=32word_and_freq=withopen('out.txt','w')asforword,freqinfout.write('{}{}\n'.format(word,38##########輸出(省略較長的中間結(jié)果andbewilltotheofaweday50oldnegrospiritualthankgodalmightyare你不用太關(guān)心parse()函數(shù)的具體實(shí)現(xiàn),你只需要知道,它做的事情是把輸入的text字符 t則是一個二元組的列表(listoftuples)首先我們需要先了解一下,計算機(jī)中文件的基礎(chǔ)知識。事實(shí)上,計算機(jī)內(nèi)核(kernel)對文件的處理相對比較復(fù)雜,涉及到內(nèi)核模式、虛擬文件系統(tǒng)、鎖和指針等一系列概念,這些內(nèi)容我不會深入講解,我只說一些基礎(chǔ)但足夠使用的知識。我們先要用open數(shù)拿到文件的指針。其中,第一個參數(shù)指定文件位置(相對位置或者絕對位置);第二個參數(shù),如果是'r'表示,如果是'w'則表示寫入,當(dāng)然也可以用'rw',表示讀寫都要。a則是一個不太常用(但也很有用)的參數(shù),表示追加(append),這樣打開的文件,如果需要寫入,會從原始文件的最末尾開始寫 件,就不要請求寫入權(quán)限。這樣在某種程度上可以降低bug對整個系統(tǒng)帶來的風(fēng)險。好,回到我們的話題。在拿到指針后,我們可以通過read()函數(shù),來文件的全部內(nèi)容。代碼text=fin.read(),即表示把文件所有內(nèi)容到內(nèi)存中,并賦值給變量text。優(yōu)點(diǎn)是方便,接下來我們可以很方便地調(diào)用parse數(shù)進(jìn)行分析;這時,我們可以給read指定參數(shù)size,用來表示的最大長度。還可以通過readline()函數(shù),每次一行,這種做法常用于數(shù)據(jù)挖掘(DataMining)中的數(shù)據(jù),在寫一些 這里我需要簡單提一下with句(后文會詳細(xì)講到)。open數(shù)對應(yīng)于close數(shù),with語句,就不需要顯式調(diào)用close()。在with的語境下任務(wù)執(zhí)行完畢后,close()函數(shù)會最后需要注意的是,所有I/O都應(yīng)該進(jìn)行錯誤處理。因為I/O操作可能會有各種各樣的情況出現(xiàn),而一個健壯(robust)的程序,需要能應(yīng)對各種情況的發(fā)生,而不應(yīng)該(故最后,我來講一個和實(shí)際應(yīng)用很貼近的知JSON(JavaScriptObjectNotation)是一種輕量級的數(shù)據(jù)交換格式,它的設(shè)計意圖是把(相比一些binary的協(xié)議)。JSON在互聯(lián)網(wǎng)中應(yīng)用非常廣泛,也是每一個Python程序員應(yīng)當(dāng)熟練掌握的技能設(shè)想一個情景,你要向所一定數(shù)額的。那么,你需要提交代碼、方向(買入/賣出)、訂單類型(市價/限價)、價格(如果是限價單)、數(shù)量等一系列參數(shù),而那該怎么辦呢其實(shí),我們要講的JSON,正能解決這個場景。你可以把它簡單地理解為兩種黑箱:第一種,輸入這些雜七雜八的信息,比如Python字典,輸出一個字符串;第二種,輸入這個字符串,可以輸出包含原始信息的Python典。代import23params= 'symbol': 'type': 'price': 'amount':8910params_str=12print('afterjson13print('typeofparams_str={},params_str={}'.format(type(params_str),15original_params=17print('afterjson18print('typeoforiginal_params={},original_params=20##########輸出22afterjson23typeofparams_str=<class'str'>,params_str={'symbol':'123456','type':24afterjson25typeoforiginal_params=<class'dict'>,original_params={'symbol':'123456',其中json.dumps()這個函數(shù),接受Python的基本數(shù)據(jù)類型,然后將其序列化為json.loads個函數(shù),接受一個合法字符串,然后將其反序列化為Python基本是不是很簡單呢不過還是那句話,請記得加上錯誤處理。不然,哪怕只是給json.loads送了一個字符串,而你沒有catch到,程序就會了。到這一步,你可能會想,如果我要輸出字符串到文件,或者從文件中JSON字符串,是的,你仍然可以使用上面提到的open()和read()/write(),先將字符串/輸出到內(nèi)存,再進(jìn)行JSON編碼/,當(dāng)然這有點(diǎn)麻煩。代1import23params= 'symbol':'type':'price':'amount':89withopen('params.json','w')asparams_str=json.dump(params,withopen('params.json','r')asoriginal_params=print('afterjsonprint('typeoforiginal_params={},original_params=19##########輸出afterjsontypeoforiginal_params=<class'dict'>,original_params={'symbol':'123456',這樣,我們就簡單清晰地實(shí)現(xiàn)了讀寫JSON字符串的過程。當(dāng)開發(fā)一個第應(yīng)用程序時,你可以通過JSON將用戶的個人配置輸出到文件,方便下次程序啟動時自動。這那么JSON是唯一的選擇嗎?顯然不是,它只是輕量級應(yīng)用中最方便的選擇之一。據(jù)我所知,在,有類似的工具叫做ProtocolBuffer,當(dāng)然,已經(jīng)完全開源了這相比于JSON,它的優(yōu)點(diǎn)是生成優(yōu)化后的二進(jìn)制文件,因此性能更好。但與此同時,生成的二進(jìn)制序列,是不能直接閱讀的。它在TensorFlow等很多對性能有要求的系統(tǒng)中都有廣這節(jié)課,我們主要學(xué)習(xí)了Python普通I/O文件I/O,同時了解了JSON列化的基 操作需謹(jǐn)慎,一定要進(jìn)行充分的錯誤處理,并細(xì)心編碼,防止出現(xiàn)編碼;JSON序列化是很方便的工具,要結(jié)合實(shí)戰(zhàn)多多練習(xí);代碼盡量簡潔、清晰,哪怕是初學(xué)階段,也要有一顆當(dāng)元帥的最后,我給你留了兩道思考第一問:你能否把NLP例子中的wordcount實(shí)現(xiàn)一遍?不過這次,in.txt可能非常非常大(意味著你不能一次到內(nèi)存中),而output.txt不會很大(意味著重復(fù)的單詞數(shù)量第二問:你應(yīng)該使用過類似網(wǎng)盤、Dropbox等網(wǎng)盤,但是它們可能空間有限(比5GB)。如果有一天,你計劃把家里的100GB數(shù)據(jù)傳送到公司,可惜你沒帶U盤,于是你想了一個主意每次從家里向Dropbox網(wǎng)盤寫入不超過5GB的數(shù)據(jù),而公司電腦一旦偵測到新數(shù)據(jù),就立即拷貝到本地,然后刪除網(wǎng)盤上的數(shù)據(jù)。等家里電腦偵測到本次數(shù)據(jù)全部傳入公司電腦后,再進(jìn)行下一次寫入,直到所有數(shù)據(jù)都傳輸過去。根據(jù)這個想法,你計劃在家寫一個server.py,在公司寫一個.py來實(shí)現(xiàn)這個需求。提示:我們假設(shè)每個文件都不超過5GB。你可以通過寫入一個控制文件(config.json)來同步狀態(tài)。不過,要設(shè)計狀態(tài),這里有可能產(chǎn)生racecondition。 不得售賣。頁面已增加防盜追蹤,將依 上一 05|深入淺出字符下一 07|基本功:條件與循言精選留言言Jingxiao置 13網(wǎng)盤的路徑在NET_DIR…展Jingxiao置 importCHUNK_SIZE=100#這個數(shù)表示一次最多的字符長度展不瘦到 15fro

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論