- 為什么匿名函數(shù)叫匿名函數(shù)?
Lambda 函數(shù)又稱匿名函數(shù),匿名函數(shù)就是沒有名字的函數(shù),函數(shù)沒有名字也行?當(dāng)然可以啦。有些函數(shù)如果只是臨時(shí)一用,而且它的業(yè)務(wù)邏輯也很簡單時(shí),就沒必要非給它取個(gè)名字不可。
好比電影里面的群眾演員,往往他們的戲份很少,最多是襯托主演,跑跑龍?zhí)?,他們需要名字嗎?不需要,因?yàn)樗麄儍H僅只是臨時(shí)出鏡,下次可能就用不著了,所以犯不著費(fèi)心思給他們每個(gè)人編個(gè)號(hào)取個(gè)名字,畢竟取個(gè)優(yōu)雅的名字是很費(fèi)勁的事情。
引用自這里,這篇博文還提到了python應(yīng)用的兩個(gè)場合,函數(shù)式編程和閉包
- 閉包
閉包跟程序里面有函數(shù)的區(qū)別是,后者是直接在母函數(shù)內(nèi)執(zhí)行,而前者返回定義的子函數(shù)。
閉包使得局部變量可以在函數(shù)外面被訪問,有點(diǎn)像只有一個(gè)方法的類。
請(qǐng)參考這里
- python中的函數(shù)究竟是什么?聽說類也可以作為函數(shù)調(diào)用是怎么回事?
見這里
神馬都是對(duì)象,不僅函數(shù)是對(duì)象,連類都是對(duì)象。
類方法和靜態(tài)方法
類是一個(gè)對(duì)象,對(duì)象可以有方法,類方法就是跟類綁定在一起的方法;靜態(tài)方法跟普通函數(shù)最大的不同就是要用類或者實(shí)例進(jìn)行調(diào)用。for循環(huán)的運(yùn)行過程
首先調(diào)用方法iter獲取迭代器,每次循環(huán)調(diào)用next獲取元素函數(shù)跟方法居然不一樣?。。?!
定義在類中的不一定就是方法,方法和函數(shù)的主要區(qū)別還是是否從屬于某個(gè)實(shí)例。要將類里面的當(dāng)作函數(shù),我們要輸入一個(gè)類,還記得我們定義類中的方法的時(shí)候輸入一個(gè)self參數(shù)了嗎?
更加詳細(xì)見這里為什么定義方法的時(shí)候一定要輸入?yún)?shù)self呢?
??為什么有了列表還要有元組?
詳細(xì)請(qǐng)見這里
兩者的區(qū)別:最重要的一點(diǎn)是tuple是不可變類型,大小固定,而 list 是可變類型、數(shù)據(jù)可以動(dòng)態(tài)變化。
不可變所以操作起來快,占用空間少。
元組不可變可以當(dāng)作字典的鍵,
python常犯錯(cuò)誤
注意4、5、6==和is的區(qū)別
==強(qiáng)調(diào)的是值的相等,而is是內(nèi)存地址的相同與否變量是對(duì)象的一個(gè)引用,參數(shù)就是變量。
變量本身沒有類型信息,類型信息存儲(chǔ)在對(duì)象中,這和C/C++中的變量有非常大的出入(C中的變量是一段內(nèi)存區(qū)域)生成器與迭代器的區(qū)別
功能一樣,但是實(shí)現(xiàn)不一樣,前者更加優(yōu)雅,生成器就像ios,迭代器就像android代碼這樣寫更優(yōu)雅
注意3(使用enumerate)、4(字符串連接)、8(該使用隊(duì)列的地方要使用隊(duì)列)、9(序列解包)、
- enumerate用法
colors = ['red', 'green', 'blue', 'yellow']
for color in enumerate(colors):
print ('--->', color)
輸出:
---> (0, 'red')
---> (1, 'green')
---> (2, 'blue')
---> (3, 'yellow')
這樣可以方便我們這樣子寫
colors = ['red', 'green', 'blue', 'yellow']
for i, color in enumerate(colors):
print (i, '--->', color)
輸出:
0 ---> red
1 ---> green
2 ---> blue
3 ---> yellow
- 如何讓字符串連接更高效
字符串連接時(shí),普通的方式可以用 + 操作
names = ['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie']
s = names[0]
for name in names[1:]:
s += ', ' + name
print (s)
pythonic
print (', '.join(names))
join 是一種更加高效的字符串連接方式,使用 + 操作時(shí),每執(zhí)行一次+操作就會(huì)導(dǎo)致在內(nèi)存中生成一個(gè)新的字符串對(duì)象,遍歷8次有8個(gè)字符串生成,造成無謂的內(nèi)存浪費(fèi)。而用 join 方法整個(gè)過程只會(huì)產(chǎn)生一個(gè)字符串對(duì)象。
- 隊(duì)列
from collections import deque
names = deque(['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie'])
names.popleft()
names.appendleft('mark')
- 遍歷字典的高效方法
方法一每次都要計(jì)算hash值,方法二在python3中使用迭代器
# 方法一
for k in d:
print (k, '--->', d[k])
# 方法二
for k, v in d.items():
print (k, '--->', v)
- 獲取字典元素
d = {'name': 'foo'}
if d.has_key('name'):
print(d['name'])
else:
print('unkonw')
pythonic
d.get("name", "unknow")
- 字符編解碼理解
解碼通常是將密文解為明文,字節(jié)流是比較晦澀的,而字符串是比較明朗,因此,編解碼如下

更多編碼的知識(shí)請(qǐng)看這里
i += x 與 i = i + x的區(qū)別
元類就是類的類,真正的類
平常的我們所說的類其實(shí)也是一種對(duì)象,創(chuàng)建這些類(其實(shí)是對(duì)象)的類
詳細(xì)看這里協(xié)程
協(xié)程是消費(fèi)者,有點(diǎn)像回調(diào)函數(shù),得到數(shù)據(jù)的地方用yield。
首先生產(chǎn)者將消費(fèi)者作為參數(shù)調(diào)入,在生產(chǎn)者中生產(chǎn)出數(shù)據(jù)后,調(diào)用消費(fèi)者.send,這個(gè)時(shí)候就會(huì)回去消費(fèi)中消費(fèi)數(shù)據(jù),然后再回來。
def consumer():
r = ''
while True:
n = yield r
if not n:
return
print('[CONSUMER] Consuming %s...' % n)
r = '200 OK'
def produce(c):
c.send(None)
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n)
print('[PRODUCER] Consumer return: %s' % r)
c.close()
c = consumer()
produce(c)