這里的Pickle和cPickle是模塊名稱不能用小寫;cPickle 和 Pickle 是python的兩個模塊,提供了數(shù)據(jù)持久化的方法,其中cPickle是Pickle的C語言實現(xiàn)。
創(chuàng)新互聯(lián)建站主要從事網(wǎng)站設計、網(wǎng)站建設、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務泌陽,10多年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18982081108
try:
import cPickle as p # 若能導入cPickle模塊則導入,并以p命名
except:
import Pickle as p # 若導入cPickle模塊導入錯誤,則導入Pickle,并以p命名
在研究 k8s 的yaml 配置文件的時候,我總擔心自己一不小心 會寫錯,所以我向往 使用將對象 序列化 yaml 的形式,
其實 python object 可以 直接 轉(zhuǎn) yaml ,甚至也可以 直接 轉(zhuǎn)成yaml文件?。?!
這里 會經(jīng)常用到幾個 函數(shù) vars() ast.
我們先嘗試用最笨的方法 實現(xiàn) object到y(tǒng)aml 的轉(zhuǎn)化
在python對象 convert to dict 的形式,使用 vars()函數(shù)
然后 dict convert to json 使用 json.dumps(dict)函數(shù)
然后 json converte to yaml 使用 ya= yaml.load(json.dumps(dict)) 然后
再 yaml.safe_dump(ya,default_flow_style=False)
至此我們看到 從 python Object --- dict ---- json --- yaml 的轉(zhuǎn)化
其中 obj dict json yaml 轉(zhuǎn) string ,只要 str()函數(shù)即可,或者 str(vars())結(jié)合
yaml 格式 寫入到文件 ,需要注意的是, open()函數(shù) 的mode 一定要是 'w' ,不能是’wb', b代表是二進制寫入
yaml 寫入的是dict str,使用 ‘wb' 會報錯,[yaml TypeError: a bytes-like object is required, not 'str']
【出現(xiàn)該錯誤往往是通過open()函數(shù)打開文本文件時,使用了‘rb’屬性,如:fileHandle=open(filename,'rb'),則此時是通過二進制方式打開文件的,所以在后面處理時如果使用了str()函數(shù),就會出現(xiàn)該錯誤,該錯誤不會再python2中出現(xiàn)。
具體解決方法有以下兩種:
第一種,在open()函數(shù)中使用‘r’屬性,即文本方式讀取,而不是‘rb’,以二進制文件方式讀取,可以直接解決問題。
第二種,在open()函數(shù)中使用‘rb’,可以在使用之前進行轉(zhuǎn)換,有以下實例,來自: 】
其實 python object 可以 直接 轉(zhuǎn) yaml ,甚至也可以 直接 轉(zhuǎn)成yaml文件?。?!
比如我已經(jīng)定義了一個 Dog python class,他有 好幾個屬性 并已經(jīng)賦值初始化了
另外生成 yaml 對象
生成yaml文件
結(jié)果是
反過來 yaml ---- json --- 持久化 json 文件 indent=1屬性是為了讓 json 不以單行展示,而是展開
注意的是 python 的 dict 和set 很相似 ,都是 { }, set 里是list, dict 是鍵值對
【# set object is not JSON serializable [duplicate]
】
打開 demo.json
yaml --- dict
yaml --- python object
json -- dict
json.loads()
dict-- json
json.jumps()
str --- dict
newdict=dict(str)
json -- python object
一個python object無法直接與json轉(zhuǎn)化,只能先將對象轉(zhuǎn)化成dictionary,再轉(zhuǎn)化成json;對json,也只能先轉(zhuǎn)換成dictionary,再轉(zhuǎn)化成object,通過實踐,源碼如下:
yaml -- python object
對yaml,也只能先轉(zhuǎn)換成json ---dictionary,再轉(zhuǎn)化成object,通過實踐,源碼如下:
dict -- -python object
python對象 默認都有一個 私有的屬性 dict 取值 就是 object的 字典形式, 賦值就就可以給對象屬性對應賦值
例如json 轉(zhuǎn) 對象
對象 轉(zhuǎn) json
Python之dict(或?qū)ο?與json之間的互相轉(zhuǎn)化
在Python語言中,json數(shù)據(jù)與dict字典以及對象之間的轉(zhuǎn)化,是必不可少的操作。
dict字典轉(zhuǎn)json數(shù)據(jù)
對象轉(zhuǎn)json數(shù)據(jù)
json數(shù)據(jù)轉(zhuǎn)成dict字典
json數(shù)據(jù)轉(zhuǎn)成對象
json的load()與dump()方法的使用
dump()方法的使用
怎么學python
俗話說得好,“摩天大樓從地起”,學習任何編程語言都一定要把該語言的基礎打牢,而怎么打地基呢?秘訣只有一條:多敲代碼多敲代碼多敲代碼。學習前期建議找一本講python基礎的書或博客,把里面的例題跟著操作一遍,在基礎打扎實后,可上一些比較出名的競賽項目的網(wǎng)站如kaggle等,通過做項目去鞏固知識。
推薦書籍:《Python基礎教程(第3版)》Magnus Lie Hetland著
推薦理由:全面介紹了Python的基礎知識、基本概念,高級主題,還有Python程序測試、打包、發(fā)布等知識,及10個具有實際意義的Python項目的開發(fā)過程,涉及的范圍較廣,既能為初學者夯實基礎,又能幫助程序員提升技能,適合各個層次的Python開發(fā)人員閱讀參考。
基礎知識
代碼規(guī)范
1. 縮進
相比于其他語言用大括號和end來標識代碼塊,python語言比較“獨特”,其通過代碼的縮進來標識所屬代碼塊,通常4個空格為一個縮進,可用tab鍵實現(xiàn)。縮進是python代碼的重要組成部分,若你的代碼縮進格式不正確,如同一段代碼塊語句縮進不一致,首句未頂格等,都會運行出錯。
#一個完整的語句首句要頂格
i=0
#同一代碼塊的語句應縮進一致
for i in range(5):
print(i)
i+=1
2. 注釋
編程語言的注釋,即對代碼的解釋和說明。給代碼加上注釋,可提高代碼的可讀性,當你閱讀一段他人寫的代碼時,通過注釋迅速掌握代碼的大致意思,讀起代碼將更加得心應手。
python語言的注釋分為單行注釋和多行注釋,在注釋符后的內(nèi)容計算機會自動跳過不去執(zhí)行。
單行注釋:在需注釋語句前加“#”,可在代碼后使用,也可另起一行使用
i=1 #在代碼后使用注釋
#另起一行使用注釋
多行注釋:在語句開頭和結(jié)尾處加三個單引號或三個雙引號(前后須一致)
'''
使用單引號的多行注釋
'''
"""
使用雙引號的多行注釋
"""
使用注釋除了起到望文生義,迅速了解代碼意思的作用外,還有一個小妙處,可以將某段未完成或需要修改的代碼隱蔽起來,暫時不讓計算機執(zhí)行。
3. 多行語句
python中默認以行結(jié)束作為代碼結(jié)束的標記,而有時候為了閱讀方便,我們需要將一個完整代碼跨行表示,這時候我們可以使用續(xù)行符:反斜杠“\”來將一行語句分為多行顯示:
score = eng_score + \
math_score + \
his_score
注意:若語句中使用大括號{}、中括號[]或小括號()將數(shù)據(jù)括起來,則不需要使用續(xù)行符,如下所示:
name=['Ada','Ailsa','Amy',
'Barbara','Betty','Blanche'
'Carina','Carrie','Carry'
'Daisy','Darcy','Diana']
什么是算法
在學習使用python之前,要先明確使用python的目的是什么?作為一名數(shù)據(jù)分析工作者,我們并不需要使用python語言來設計程序,只需要使用python來完成算法的實現(xiàn)。那么算法又是什么呢?
算法是指解決某項問題的流程或步驟,我們可以用一個很貼近生活的例子去理解,假如你需要做一道“西紅柿炒雞蛋”,根據(jù)菜譜:先準備食材,然后下油熱鍋,將西紅柿倒進去翻炒后,加入蛋液翻炒至熟。
這就是我們完成“西紅柿炒雞蛋”這道菜所用的“算法”,而完成這個算法所需要的就是原料和操作說明,下面來看看原料和說明是什么。
變量
Python語言中的“原料”即對象,在python里萬物皆對象,而對象通過引用變量唯一存在,引用上面的例子,可以將”雞蛋”理解為”對象”,而給它取的名字”小紅家雞生的蛋”則是”變量”。
變量的概念想必大家不會陌生,和中學方程中學的變量基本上是一致的.變量可以理解為對事物的一個代號或者貼的一個標簽,是一個可重復使用的量;而不同于方程中的變量,編程語言中的變量不僅僅是數(shù)值型, 還可以是字符型、邏輯型等其他數(shù)據(jù)類型。
1. 變量的性質(zhì)
先定義后使用在python中引用變量需要先定義,否則會報錯,但與其他編程語言如C語言不同,python定義變量不需要事先定義變量類型,變量類型隨變量所賦值的類型決定可重復賦值及運算在python中變量可以重復賦值使用,變量間也可相互賦值,同時可以對變量進行運算操作#變量可重復賦值
i=2
i=3
#可對變量做運算
i+1
#查看變量的數(shù)據(jù)類型
type(a)
2. 變量的命名規(guī)則
只能包含:數(shù)字、字母、下劃線不能以數(shù)字開頭,不能包含python保留字、關鍵字、函數(shù)名慎用小寫字母l和大寫字母O, 避免與數(shù)字1和0混淆建議用駝峰命名法,即以單詞加“"命名,如:studentname#查看python有哪些保留字
import keyword
print(keyword.kwlist)
3. 變量的賦值
基本賦值在python中,我們使用“=”對變量進行賦值,如“x=3"。這里要注意,數(shù)據(jù)和變量是分開存儲的,即在內(nèi)存中先建立數(shù)據(jù)“3”,然后建立一個標記“x”,再將x指向內(nèi)存中的值。若重新對變量x賦值為“2”,實質(zhì)上是修改了數(shù)據(jù)的引用,變量x重新指向內(nèi)存中的數(shù)據(jù)“2”。
多重賦值對同一對象可以引用多個變量,例如一個人可以有多重身份,Mr Li 是一位父親,同時也是一位教師,不同的變量,實質(zhì)指向的對象是同一事物。father = teacher = 'Mr Li'
多元賦值對多個變量同時賦值,等號兩邊可加括號可不加a,b,c=1,2,3
(a,b,c)=(1,2,3)
語句
了解完算法中的“原料”,我們再來看看算法中的“操作說明”是什么呢?算法中的“操作說明”可以說是算法的“靈魂”,就好像一道菜完成的作品如何,很大程度取決于廚師的廚藝(即做菜秘籍)。構(gòu)成算法“操作步驟”的是語句,其中包含python的基本語句和控制流程語句??刂屏鞒陶Z句的語法相對較復雜,在后面的文章再繼續(xù)介紹,我們先認識一下python的基本語句:
其實前面我們已經(jīng)接觸過python的基礎語句:賦值語句,賦值語句較簡單不展開介紹,下面主要介紹python另一個使用特別廣泛的基礎語句:輸出與輸入語句。
1. 輸出語句
python中輸出值的方式主要有兩種:表達式和print( )函數(shù),兩者的區(qū)別在于,表達式輸出的結(jié)果為一個python對象,而在實際運用中,為方便閱讀,通常需要按照一定格式輸出結(jié)果,print( )函數(shù)就很好地解決此問題。
print( )語法:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
print( )參數(shù):
objects -- 復數(shù),表示可以一次輸出多個對象。輸出多個對象時,需要用 , 分隔。sep -- 用來間隔多個對象,默認值是一個空格。end -- 用來設定以什么結(jié)尾。默認值是換行符 “\n”,可換成其他字符串。file -- 要寫入的文件對象。flush -- 輸出是否被緩存通常決定于 file,但如果 flush 關鍵字參數(shù)為 True,流會被強制刷新。#打印多個值,設置中間分隔符為“-”
print("廣州","上海","深圳",sep="-")
#先以默認結(jié)尾符"\n"輸出,再以結(jié)尾符設置為“-”,注意區(qū)別二者區(qū)別
print("廣州")
print("上海")
print("深圳")
print("廣州",end="-")
print("上海",end="-")
print("深圳",end="-")
以上代碼實行結(jié)果為:
2. 輸入語句
在python中獲取鍵盤輸入數(shù)據(jù)的函數(shù)是input()函數(shù),input函數(shù)會自動將輸入的數(shù)據(jù)轉(zhuǎn)為字符串類型,并自動忽略換行符,同時可給出提示字符串。如果需要得到其他類型的數(shù)據(jù),可對其進行強制性類型轉(zhuǎn)換。
input( )語法:
input([prompt])
input( )參數(shù):
prompt: 給輸入者的提示信息,可選參數(shù)age=input("請輸入您的年齡:")
每張圖像是一個二維矩陣(灰度圖像)或者三維張量(彩色圖像)。計算均值的話可以用12import numpy as npnp.mean()這個函數(shù)的功能可以查看你的python庫,help(np)即可(或者help(numpy))。
1、C++和C都是屬于編譯型語言,本來的.c文件都是用高級語言編寫的,計算機是不能識別高級語言的,所以,必須要通過編譯,鏈接等手段,將.c文件轉(zhuǎn)換成可執(zhí)行文件,可執(zhí)行文件就是純二進制文件,然后計算機才能夠執(zhí)行。
unix./p:(p是可執(zhí)行文件)
上述命令的過程,是外殼(shell)調(diào)用操作系統(tǒng)一個叫加載器的函數(shù),它拷貝可執(zhí)行文件p中的代碼和數(shù)據(jù)到存儲器,然后將控制轉(zhuǎn)移到這個程序的開頭。
2、
1. Python是一門解釋型語言?
我初學Python時,聽到的關于Python的第一句話就是,Python是一門解釋性語言,我就這樣一直相信下去,直到發(fā)現(xiàn)了*.pyc文件的存在。如果是解釋型語言,那么生成的*.pyc文件是什么呢?c應該是compiled的縮寫才對?。?/p>
為了防止其他學習Python的人也被這句話誤解,那么我們就在文中來澄清下這個問題,并且把一些基礎概念給理清。
2. 解釋型語言和編譯型語言
計算機是不能夠識別高級語言的,所以當我們運行一個高級語言程序的時候,就需要一個“翻譯機”來從事把高級語言轉(zhuǎn)變成計算機能讀懂的機器語言的過程。這個過程分成兩類,第一種是編譯,第二種是解釋。
編譯型語言在程序執(zhí)行之前,先會通過編譯器對程序執(zhí)行一個編譯的過程,把程序轉(zhuǎn)變成機器語言。運行時就不需要翻譯,而直接執(zhí)行就可以了。最典型的例子就是C語言。
解釋型語言就沒有這個編譯的過程,而是在程序運行的時候,通過解釋器對程序逐行作出解釋,然后直接運行,最典型的例子是Ruby。
通過以上的例子,我們可以來總結(jié)一下解釋型語言和編譯型語言的優(yōu)缺點,因為編譯型語言在程序運行之前就已經(jīng)對程序做出了“翻譯”,所以在運行時就少掉了“翻譯”的過程,所以效率比較高。但是我們也不能一概而論,一些解釋型語言也可以通過解釋器的優(yōu)化來在對程序做出翻譯時對整個程序做出優(yōu)化,從而在效率上超過編譯型語言。
此外,隨著Java等基于虛擬機的語言的興起,我們又不能把語言純粹地分成解釋型和編譯型這兩種。
用Java來舉例,Java首先是通過編譯器編譯成字節(jié)碼文件(不是二進制碼),然后在運行時通過解釋器給解釋成機器文件。所以我們說Java是一種先編譯后解釋的語言。
總結(jié):將由高級語言編寫的程序文件轉(zhuǎn)換為可執(zhí)行文件(二進制的)有兩種方式,編譯和解釋,編譯是在程序運行前,已經(jīng)將程序全部轉(zhuǎn)換成二進制碼,而解釋是在程序執(zhí)行的時候,邊翻譯邊執(zhí)行。
3. Python到底是什么
其實Python和Java/C#一樣,也是一門基于虛擬機的語言,我們先來從表面上簡單地了解一下Python程序的運行過程吧。
當我們在命令行中輸入python hello.py時,其實是激活了Python的“解釋器”,告訴“解釋器”:你要開始工作了??墒窃凇敖忉尅敝?,其實執(zhí)行的第一項工作和Java一樣,是編譯。
熟悉Java的同學可以想一下我們在命令行中如何執(zhí)行一個Java的程序:
javac hello.java(編譯的過程)
java hello(解釋的過程)
只是我們在用Eclipse之類的IDE時,將這兩部給融合成了一部而已。其實Python也一樣,當我們執(zhí)行python hello.py時,他也一樣執(zhí)行了這么一個過程,所以我們應該這樣來描述Python,Python是一門先編譯后解釋的語言。
4. 簡述Python的運行過程
在說這個問題之前,我們先來說兩個概念,PyCodeObject和pyc文件。
我們在硬盤上看到的pyc自然不必多說,而其實PyCodeObject則是Python編譯器真正編譯成的結(jié)果。我們先簡單知道就可以了,繼續(xù)向下看。
當python程序運行時,編譯的結(jié)果則是保存在位于內(nèi)存中的PyCodeObject中,當Python程序運行結(jié)束時,Python解釋器則將PyCodeObject寫回到pyc文件中。
當python程序第二次運行時,首先程序會在硬盤中尋找pyc文件,如果找到,則直接載入,否則就重復上面的過程。
所以我們應該這樣來定位PyCodeObject和pyc文件,我們說pyc文件其實是PyCodeObject的一種持久化保存方式。
總結(jié):Python也是先編譯后解釋的一門語言,當python程序運行時,編譯的結(jié)果是保存在內(nèi)存中的PyCodeObject中,當Python程序運行結(jié)束時,Python解釋器則將PyCodeObject寫回到pyc文件中。也就是說保存,pyc文件是為了下次再次使用該腳本時避免重復編譯,以此來節(jié)省時間。也就是說,只執(zhí)行一次的腳本,就沒必要保存其編譯結(jié)果pyc,這樣只是浪費空間。下面舉例解釋。
5、?運行一段Python程序
我們來寫一段程序?qū)嶋H運行一下:
程序本身毫無意義。我們繼續(xù)看:
然而我們在程序中并沒有看到pyc文件,仍然是test.py孤零零地呆在那!(因為,test.py只是一次性的腳本文件,系統(tǒng)任務僅是會調(diào)用一次,所以,生成pyc文件只是浪費空間而已)那么我們換一種寫法,我們把print_str方法換到另外的一個python模塊中:
6. pyc的目的是重用
回想本文的第二段在解釋編譯型語言和解釋型語言的優(yōu)缺點時,我說編譯型語言的優(yōu)點在于,我們可以在程序運行時不用解釋,而直接利用已經(jīng)“翻譯”過的文件。也就是說,我們之所以要把py文件編譯成pyc文件,最大的優(yōu)點在于我們在運行程序時,不需要重新對該模塊進行重新的解釋。
所以,我們需要編譯成pyc文件的應該是那些可以重用的模塊,這于我們在設計軟件類時是一樣的目的。所以Python的解釋器認為:只有import進來的模塊,才是需要被重用的模塊。
這個時候也許有人會說,不對??!你的這個問題沒有被解釋通啊,我的test.py不是也需要運行么,雖然不是一個模塊,但是以后我每次運行也可以節(jié)省時間??!
OK,我們從實際情況出發(fā),思考下我們在什么時候才可能運行python xxx.py文件:
A. 執(zhí)行測試時。
B. 開啟一個Web進程時。
C. 執(zhí)行一個程序腳本。
我們逐個來說,第一種情況我們就不用多說了,這個時候哪怕所有的文件都沒有pyc文件都是無所謂的。
第二種情況,我們試想一個webpy的程序把,我們通常這樣執(zhí)行:
總結(jié):只有模塊文件會被認為是可能被重用的,所以,只用模型文件才會保存編譯或者(編譯+解釋)后的結(jié)果.pyc文件。
6、?pyc的過期時間
說完了pyc文件,可能有人會想到,每次Python的解釋器都把模塊給持久化成了pyc文件,那么當我的模塊發(fā)生了改變的時候,是不是都要手動地把以前的pyc文件remove掉呢?
當然Python的設計者是不會犯這么白癡的錯誤的。而這個過程其實就取決于PyCodeObject是如何寫入pyc文件中的。
我們來看一下import過程的源碼吧:
這段代碼比較長,我們只來看我標注了的代碼,其實他在寫入pyc文件的時候,寫了一個Long型變量,變量的內(nèi)容則是文件的最近修改日期,同理,我們再看下載入pyc的代碼:
不用仔細看代碼,我們可以很清楚地看到原理,其實每次在載入之前都會先檢查一下py文件和pyc文件保存的最后修改日期,如果不一致則重新生成一份pyc文件。
8. 寫在最后的
其實了解Python程序的執(zhí)行過程對于大部分程序員,包括Python程序員來說意義都是不大的,那么真正有意義的是,我們可以從Python的解釋器的做法上學到什么,我認為有這樣的幾點:
A.?其實Python是否保存成pyc文件和我們在設計緩存系統(tǒng)時是一樣的,我們可以仔細想想,到底什么是值得扔在緩存里的,什么是不值得扔在緩存里的。只有要重用的模塊才是值得編譯成pyc文件的。
B. 在跑一個耗時的Python腳本時,我們?nèi)绾文軌蛏晕赫ヒ恍┏绦虻倪\行時間,就是將模塊從主模塊分開。(雖然往往這都不是瓶頸),那么再次運行時,就可以不用編譯了,直接使用上次編譯后的結(jié)果。
C. 在設計一個軟件系統(tǒng)時,重用和非重用的東西是不是也應該分開來對待,這是軟件設計原則的重要部分。
D. 在設計緩存系統(tǒng)(或者其他系統(tǒng))時,我們?nèi)绾蝸肀苊獬绦虻倪^期,其實Python的解釋器也為我們提供了一個特別常見而且有效的解決方案。
總結(jié):Python是編譯+解釋型的語言,執(zhí)行的時候是由Python解釋器,逐行編譯+解釋,然后運行,因為在運行的過程中,需要編譯+解釋,所以Python的運行性能會低于編譯型語言,比如C++。為了提高性能,Python解釋器,會將模塊(以后要重用的腳本文件放在模塊里)的編譯+解釋的結(jié)果,保存在.pyc中。這樣下次執(zhí)行的時候,就省了編譯這個環(huán)節(jié)。提高性能。一次性的腳本文件,解釋器是不會保存編譯+解釋的結(jié)果,也就是沒有.pyc文件。
本文名稱:python持久化函數(shù) python優(yōu)化函數(shù)
文章路徑:http://aaarwkj.com/article42/hhhgec.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供域名注冊、品牌網(wǎng)站建設、虛擬主機、網(wǎng)站設計公司、網(wǎng)站營銷、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)