python封装函数、实现将任意的对象序列化到磁盘上_Python系列之lambda、函数、序列化...
lambda
在python中使用lambda來創(chuàng)建匿名函數(shù),而用def創(chuàng)建的方法是有名稱的,除了從表面上的方法名不一樣外,python lambda還有哪些和def不一樣呢?
1 python lambda會創(chuàng)建一個函數(shù)對象,但不會把這個函數(shù)對象賦給一個標(biāo)識符,而def則會把函數(shù)對象賦值給一個變量。
2 python lambda它只是一個表達(dá)式,而def則是一個語句。
下面是python lambda的格式,看起來好精簡:
lambda x: print(x)
下面舉幾個例子:
def su(func):
return func +2
for x in range(10):
ret = su(x)
#------------------------------------# 兩個例子輸出的結(jié)果是一樣的[2,3,4,5,6,7,8,9,10,11]
g = lambda x:x+2
info = [g(x) for x in range(10)]
可以看出lambda確實很簡單!
函數(shù)
曾多次提到函數(shù),函數(shù)到底是什么東東,那我們就一探究竟。首先先說下 為什么要用函數(shù)?
函數(shù)是組織好的,可重復(fù)使用的,用來實現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段.函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。
定義函數(shù):
函數(shù)代碼塊以?def?關(guān)鍵詞開頭,后接函數(shù)標(biāo)識符名稱和圓括號()。
任何傳入?yún)?shù)和自變量必須放在圓括號中間。圓括號之間可以用于定義參數(shù)。
函數(shù)的第一行語句可以選擇性地使用文檔字符串—用于存放函數(shù)說明。
函數(shù)內(nèi)容以冒號起始,并且縮進(jìn)。
return [表達(dá)式]?結(jié)束函數(shù),選擇性地返回一個值給調(diào)用方。不帶表達(dá)式的return相當(dāng)于返回 None。
語法:
def functionname( parameters ):
function_suite
return [expression]
返回值
def foo(func):
return func + 1 #return,表示函數(shù)的返回值
python 函數(shù)返回值有兩種形式:
返回一個值。
返回多個值。
默認(rèn)返回None。
參數(shù)
必備參數(shù) :?必備參數(shù)須以正確的順序傳入函數(shù)。調(diào)用時的數(shù)量必須和聲明時的一樣
關(guān)鍵字參數(shù): ?關(guān)鍵字參數(shù)和函數(shù)調(diào)用關(guān)系緊密,函數(shù)調(diào)用使用關(guān)鍵字參數(shù)來確定傳入的參數(shù)值。
默認(rèn)參數(shù) ?:調(diào)用函數(shù)時,缺省參數(shù)的值如果沒有傳入,則被認(rèn)為是默認(rèn)值。
不定長參數(shù): 函數(shù)能處理比當(dāng)初聲明時更多的參數(shù)
#必備參數(shù)
def foo(func):
print(func)
foo('hello') #hello
#關(guān)鍵字參數(shù)
def foo(func):
print(func)
foo(func = 'hello') #hello
#缺省參數(shù)
def printinfo( name, age = 35 ):
print("Name: ", name)
print("Age ", age)
printinfo( age=50, name="miki" ) #Name: miki,Age 50
printinfo( name="miki" ) #Name: miki,Age 35
#不定長參數(shù)
def functionname(*args,**kwargs):
print('輸出:%s'%args)
functionname(['ok',11,22,33]) #輸出:['ok', 11, 22, 33]
序列化之pickle和json
pickle 和json 是序列化的兩個模塊。
Json模塊提供了四個功能:dumps、dump、loads、load
pickle模塊提供了四個功能:dumps、dump、loads、load
pickle
首先,我們嘗試把一個對象序列化并寫入文件:
accounts = {
'k1':'hello',
'k2':'world'
}
f = open('dump.txt','wb')
f.write(pickle.dumps(accounts))
f.close()
pickle.dumps()把任意對象序列化成一個str,然后,就可以把這個str寫入文件.或者用另一個方法pickle.dump()直接把對象序列化后寫入一個文件:
f = open('dump.txt','wb')
pickle.dump(accounts,f)
f.close()
看看寫入的dump.txt文件,一堆亂七八糟的內(nèi)容,這些都是Python保存的對象內(nèi)部信息。
當(dāng)然有序列化也有反序列化,我們把dump.txt的一堆亂碼給還原:
f = open('dump.txt','rb')
ret = pickle.loads(f.read())
f.close()
當(dāng)然我們也可以直接用pickle.load()方法從dump.txt中直接反序列化出對象:
f = open('dump.txt','rb')
pickle.load(f)
f.close()
內(nèi)容又變回來了。
ps:是python獨有的序列化方式,比json功能強(qiáng)大任何類型的數(shù)據(jù)都可以被序列化和反序列化。
json
如果我們要在不同的編程語言之間傳遞對象,就必須把對象序列化為標(biāo)準(zhǔn)格式,比如XML,但更好的方法是序列化為JSON,因為JSON表示出來就是一個字符串,可以被所有語言讀取,也可以方便地存儲到磁盤或者通過網(wǎng)絡(luò)傳輸。JSON不僅是標(biāo)準(zhǔn)格式,并且比XML更快,而且可以直接在Web頁面中讀取,非常方便。
accounts = {
'k1':'hello',
'k2':'world'
}
f = open('dump.txt','w')
f.write(json.dumps(accounts))
f.close()
打開dump.txt 文件內(nèi)容不在是亂碼,并且是可讀的
{"k1": "hello", "k2": "world"}
由此可見dumps()方法返回一個str。內(nèi)容就是標(biāo)準(zhǔn)的JSON。類似的,dump()方法可以直接把JSON寫入一個file-like Object。
f = open('dump.txt','w')
json.dump(accounts,f)
f.close()
要把JSON反序列化為Python對象,用loads()或者對應(yīng)的load()方法,前者把JSON的字符串反序列化,后者從file-like Object中讀取字符串并反序列化:
f = open('dump.txt','r')
c = json.loads(f.read())
f.close()
有一點需要注意,就是反序列化得到的所有字符串對象默認(rèn)都是unicode而不是str。由于JSON標(biāo)準(zhǔn)規(guī)定JSON編碼是UTF-8,所以我們總是能正確地在Python的str或unicode與JSON的字符串之間轉(zhuǎn)換。
importsmtplibfrom email.mime.text importMIMETextfrom email.utils importformataddr
msg= MIMEText('郵件內(nèi)容', 'plain', 'utf-8')
msg['From'] = formataddr(["武沛齊",'wptawy@126.com'])
msg['To'] = formataddr(["走人",'424662508@qq.com'])
msg['Subject'] = "主題"server= smtplib.SMTP("smtp.126.com", 25)
server.login("wptawy@126.com", "郵箱密碼")
server.sendmail('wptawy@126.com', ['424662508@qq.com',], msg.as_string())
server.quit()
發(fā)郵件實例
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的python封装函数、实现将任意的对象序列化到磁盘上_Python系列之lambda、函数、序列化...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 币未来趋势分析_分析:中国便利店零售市场
- 下一篇: python刷leetcode_零基础p