- 為什么匿名函數(shù)叫匿名函數(shù)?
Lambda 函數(shù)又稱匿名函數(shù)杯道,匿名函數(shù)就是沒有名字的函數(shù),函數(shù)沒有名字也行责蝠?當然可以啦党巾。有些函數(shù)如果只是臨時一用,而且它的業(yè)務邏輯也很簡單時霜医,就沒必要非給它取個名字不可齿拂。
好比電影里面的群眾演員,往往他們的戲份很少肴敛,最多是襯托主演署海,跑跑龍?zhí)祝麄冃枰謫嵋侥校坎恍枰局叮驗樗麄儍H僅只是臨時出鏡,下次可能就用不著了昨登,所以犯不著費心思給他們每個人編個號取個名字趾代,畢竟取個優(yōu)雅的名字是很費勁的事情。
引用自這里丰辣,這篇博文還提到了python應用的兩個場合撒强,函數(shù)式編程和閉包
- 閉包
閉包跟程序里面有函數(shù)的區(qū)別是,后者是直接在母函數(shù)內執(zhí)行笙什,而前者返回定義的子函數(shù)飘哨。
閉包使得局部變量可以在函數(shù)外面被訪問,有點像只有一個方法的類琐凭。
請參考這里
- python中的函數(shù)究竟是什么芽隆?聽說類也可以作為函數(shù)調用是怎么回事?
見這里
神馬都是對象统屈,不僅函數(shù)是對象胚吁,連類都是對象。
類方法和靜態(tài)方法
類是一個對象愁憔,對象可以有方法腕扶,類方法就是跟類綁定在一起的方法;靜態(tài)方法跟普通函數(shù)最大的不同就是要用類或者實例進行調用吨掌。for循環(huán)的運行過程
首先調用方法iter獲取迭代器半抱,每次循環(huán)調用next獲取元素函數(shù)跟方法居然不一樣E !A蕖炼幔!
定義在類中的不一定就是方法,方法和函數(shù)的主要區(qū)別還是是否從屬于某個實例史简。要將類里面的當作函數(shù)乃秀,我們要輸入一個類,還記得我們定義類中的方法的時候輸入一個self參數(shù)了嗎乘瓤?
更加詳細見這里為什么定義方法的時候一定要輸入?yún)?shù)self呢环形?
策泣?衙傀?為什么有了列表還要有元組?
詳細請見這里
兩者的區(qū)別:最重要的一點是tuple是不可變類型萨咕,大小固定统抬,而 list 是可變類型、數(shù)據(jù)可以動態(tài)變化危队。
不可變所以操作起來快聪建,占用空間少。
元組不可變可以當作字典的鍵茫陆,
python常犯錯誤
注意4金麸、5、6==和is的區(qū)別
==強調的是值的相等簿盅,而is是內存地址的相同與否變量是對象的一個引用挥下,參數(shù)就是變量。
變量本身沒有類型信息桨醋,類型信息存儲在對象中棚瘟,這和C/C++中的變量有非常大的出入(C中的變量是一段內存區(qū)域)生成器與迭代器的區(qū)別
功能一樣,但是實現(xiàn)不一樣瞬内,前者更加優(yōu)雅迷雪,生成器就像ios,迭代器就像android代碼這樣寫更優(yōu)雅
注意3(使用enumerate)虫蝶、4(字符串連接)振乏、8(該使用隊列的地方要使用隊列)、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
- 如何讓字符串連接更高效
字符串連接時慧邮,普通的方式可以用 + 操作
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 是一種更加高效的字符串連接方式调限,使用 + 操作時,每執(zhí)行一次+操作就會導致在內存中生成一個新的字符串對象误澳,遍歷8次有8個字符串生成耻矮,造成無謂的內存浪費。而用 join 方法整個過程只會產生一個字符串對象忆谓。
- 隊列
from collections import deque
names = deque(['raymond', 'rachel', 'matthew', 'roger',
'betty', 'melissa', 'judith', 'charlie'])
names.popleft()
names.appendleft('mark')
- 遍歷字典的高效方法
方法一每次都要計算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é)流是比較晦澀的倡缠,而字符串是比較明朗哨免,因此,編解碼如下
更多編碼的知識請看這里
i += x 與 i = i + x的區(qū)別
元類就是類的類昙沦,真正的類
平常的我們所說的類其實也是一種對象琢唾,創(chuàng)建這些類(其實是對象)的類
詳細看這里協(xié)程
協(xié)程是消費者,有點像回調函數(shù)盾饮,得到數(shù)據(jù)的地方用yield采桃。
首先生產者將消費者作為參數(shù)調入,在生產者中生產出數(shù)據(jù)后丘损,調用消費者.send普办,這個時候就會回去消費中消費數(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)