Python學(xué)習(xí)筆記_第六章:抽象

創(chuàng)建函數(shù)

函數(shù)callable在Python3.0不再可用演熟,需要使用表達(dá)式hassttr(func, call)代替衰抑。

文檔化函數(shù)

文檔字符串

>>> def square(x):
    'Calculates the square of the number x.'
    return x * x

>>> square.__doc__
'Calculates the square of the number x.'

上面的位于函數(shù)語句塊兒中的第一行的字符串稱為文檔字符串
文檔字符串可見于:def語句后面、模塊兒或類的開頭
函數(shù)可以返回一個(gè)以上的值,元祖中返回即可掉房。
doc是函數(shù)屬性,屬性中的雙下劃線表示屬性為特殊屬性累驮。

并非真正函數(shù)的函數(shù)

沒有return語句或者雖然有return語句但return后面沒有跟任何值的函數(shù)不返回值府怯,但如果非要接收可以接收到一個(gè)None值。

我們改變參數(shù)嗎

在函數(shù)欸為參數(shù)賦予新值不會(huì)改變?nèi)魏瓮獠孔兞康闹?br> 當(dāng)兩個(gè)變量同時(shí)引用一個(gè)列表時(shí)位岔,它們的確是同時(shí)引用一個(gè)列表如筛。如果想回避這種情況,可以復(fù)制一個(gè)列表副本抒抬。當(dāng)在程序中做切片的時(shí)候杨刨,返回的切片總是一個(gè)副本。
setdefault是Python中字典的特有方法
字典中的鍵并沒有特定的順序擦剑,所以多次打印同一個(gè)字典結(jié)果可能會(huì)不同妖胀。
關(guān)于字典和函數(shù)的一個(gè)例子

def init(dic):
    dic['first'] = {}
    dic['midle'] = {}
    dic['last'] = {}
def lookup(dic, label, name):
    return dic[label].get(name)
def storge(dic, full_name):
    names = full_name.split()
    if len(names) == 2: names.insert(1, ' ')
    labels = 'first', 'midle', 'last'
    for label, name in zip(labels, names):
        people = lookup(dic, label, name)
        if people:
            people.append(full_name)
        else:
            dic[label][name] = [full_name]
if __name__ == '__main__':
    dic = {}
    init(dic)
    my_name = 'zhang qing tian'
    storge(dic, my_name)
    people = lookup(dic, 'midle', 'qing')
    print people

作用域

Python給變量賦值后相當(dāng)于產(chǎn)生了一個(gè)不可見字典芥颈,可以通過鍵(變量名)引用值(變量值),內(nèi)建的vars函數(shù)可以返回這個(gè)不可見字典赚抡。

>>> x = 1
>>> scape = vars()
>>> scape['x']
1
>>> scape['x'] += 1
>>> x
2
  • 屏蔽引發(fā)的問題
    當(dāng)有局部變量或參數(shù)和全局變量同名時(shí)會(huì)屏蔽全局變量爬坑,這是如果必須訪問全局變量,在Python中可以使用globals函數(shù)怕品,可以返回全局變量字典(locals函數(shù)返回局部變量字典)
>>> def conbin(name):
    print 'hello,',name
>>> name = 'zhangsan'
>>> conbin('lisi')
hello, lisi
>>> def conbin(name):
    print 'hello,',globals()['name']    
>>> conbin('lisi')
hello, zhangsan

重新綁定全局變量

>>> x = 1
>>> def add():
    global x
    x = x + 1

    
>>> add()
>>> x
2
  • 嵌套作用域
    Python的函數(shù)是可以嵌套的妇垢,也就是可以將一個(gè)函數(shù)放到另一個(gè)里面。
>>> def multiplier(factor):
    def multiplyByFactor(number):
        return number * factor
    return multiplyByFactor

>>> double = multiplier(2)
>>> double(2)
4
>>> multiplier(2)(2)
4

類似multiplyByFactor存儲(chǔ)子封閉區(qū)域的行為叫閉包
外部作用域的變量一般不允許重新綁定肉康,但是Python3.0提供了一個(gè)nonlocal關(guān)鍵字闯估,它的使用方式和global關(guān)鍵字類似,可以讓用戶對(duì)外部作用域變量賦值吼和。

>>> def multiplier(factor):
    def multiplyByFactor(number):
        nonlocal factor
        factor = 1
        return number * factor
    return multiplyByFactor

>>> double = multiplier(2)
>>> double(2)
2

遞歸

標(biāo)準(zhǔn)庫(kù)中的bisect模塊可以很有效地實(shí)現(xiàn)二分查找

  • 函數(shù)式編程
    函數(shù)的使用方法和其他對(duì)象(字符串涨薪、數(shù)值、序列等)基本一樣炫乓,可以分配給變量刚夺、作為參數(shù)傳遞以及作為返回值返回。
    Python中支持函數(shù)式編程的機(jī)制有:map末捣、filter和reduce(apply:被前面提到的拼接函數(shù)替代)map和filter函數(shù)在目前版本的Python中并不是特別有用侠姑,而且可以被列表推導(dǎo)式替代。map的一個(gè)很重要的功能是他可以將序列中的元素全部傳遞給一個(gè)函數(shù)
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> map(str, range(10))
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

filter函數(shù)可以以一個(gè)返回bool值的函數(shù)為準(zhǔn)箩做,過濾掉序列中不滿足條件的元素

>>> def func(x):
    return x.isalnum() #判斷一個(gè)字符串是否僅僅由字母和數(shù)字組成
>>> seq = ["foo", "x41", "?!", "***"]
>>> filter(func, seq)
['foo', 'x41']

此處可以由列表推導(dǎo)式替代莽红,如下

>>> [x for x in seq if x.isalnum()]
['foo', 'x41']

lambda關(guān)鍵字可以用在此處來定義一個(gè)短小的函數(shù)

>>> filter(lambda x : x.isalnum(), seq)
['foo', 'x41']

reduce函數(shù):以一個(gè)函數(shù)為規(guī)則,作用于序列中的前兩個(gè)元素邦邦,再作用于返回值和第3個(gè)元素安吁,以此類推,直到把序列中數(shù)據(jù)遍歷完燃辖。下面是一個(gè)求和的例子

>>> number = [1, 2, 3, 4, 81, 33, 43, 88]
>>> reduce(lambda x, y : x + y, number)
255
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鬼店,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子黔龟,更是在濱河造成了極大的恐慌妇智,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氏身,死亡現(xiàn)場(chǎng)離奇詭異巍棱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)观谦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門拉盾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桨菜,“玉大人豁状,你說我怎么就攤上這事捉偏。” “怎么了泻红?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵夭禽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我谊路,道長(zhǎng)讹躯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任缠劝,我火速辦了婚禮潮梯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惨恭。我一直安慰自己秉馏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布脱羡。 她就那樣靜靜地躺著萝究,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锉罐。 梳的紋絲不亂的頭發(fā)上帆竹,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音脓规,去河邊找鬼栽连。 笑死,一個(gè)胖子當(dāng)著我的面吹牛抖拦,可吹牛的內(nèi)容都是我干的升酣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼态罪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼噩茄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起复颈,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤绩聘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后耗啦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凿菩,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年帜讲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衅谷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡似将,死狀恐怖获黔,靈堂內(nèi)的尸體忽然破棺而出蚀苛,到底是詐尸還是另有隱情,我是刑警寧澤玷氏,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布堵未,位于F島的核電站,受9級(jí)特大地震影響盏触,放射性物質(zhì)發(fā)生泄漏渗蟹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一赞辩、第九天 我趴在偏房一處隱蔽的房頂上張望雌芽。 院中可真熱鬧,春花似錦辨嗽、人聲如沸膘怕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岛心。三九已至,卻和暖如春篮灼,著一層夾襖步出監(jiān)牢的瞬間忘古,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工诅诱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留髓堪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓娘荡,卻偏偏與公主長(zhǎng)得像干旁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炮沐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容