復(fù)盤廖大教程時部分遺忘點記錄

遞歸

def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)

使用遞歸函數(shù)需要注意防止棧溢出允跑。在計算機(jī)中,函數(shù)調(diào)用是通過棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的搪柑,每當(dāng)進(jìn)入一個函數(shù)調(diào)用聋丝,棧就會加一層棧幀,每當(dāng)函數(shù)返回拌屏,棧就會減一層棧幀潮针。由于棧的大小不是無限的,所以倚喂,遞歸調(diào)用的次數(shù)過多每篷,會導(dǎo)致棧溢出。


迭代

Python內(nèi)置的enumerate函數(shù)可以把一個list變成索引-元素對端圈,這樣就可以在for循環(huán)中同時迭代索引和元素本身:

>>> for i, value in enumerate(['A', 'B', 'C']):
...     print(i, value)
...
0 A
1 B
2 C


閉包

在高階函數(shù)中焦读,內(nèi)部的函數(shù)可以引用外部函數(shù)的參數(shù)及局部變量,并且返回內(nèi)部函數(shù)舱权,而不是函數(shù)的值矗晃,這種情況,稱為閉包宴倍。

def count():      # 這種形式要避免张症!
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs
f1, f2, f3 = count()      # 結(jié)果f1,f2,f3 等于9, 9, 9 . 且不能直接寫 f4 = count() 這樣的賦值式,必須3個變量一起

全部都是 9!原因就在于返回的函數(shù)引用了變量 i鸵贬,但它并非立刻執(zhí)行俗他。 等到 3 個函數(shù)都返回時,它們所引用的變量 i 已經(jīng)變成了 3阔逼,因此最終 結(jié)果為 9兆衅。
返回閉包時牢記的一點就是:返回函數(shù)不要引用任何循環(huán)變量,或者后 續(xù)會發(fā)生變化的變量嗜浮。


模塊

在計算機(jī)程序的開發(fā)過程中羡亩,隨著程序代碼越寫越多,在一個文件里代 碼就會越來越長危融,越來越不容易維護(hù)畏铆。
為了編寫可維護(hù)的代碼,我們把很多函數(shù)分組吉殃,分別放到不同的文件里及志, 這樣片排,每個文件包含的代碼就相對較少,很多編程語言都采用這種組織 代碼的方式速侈。在 Python 中率寡,一個.py文件就稱之為一個模塊(Module)。
使用模塊有什么好處?
最大的好處是大大提高了代碼的可維護(hù)性倚搬。其次冶共,編寫代碼不必從零開 始。當(dāng)一個模塊編寫完畢每界,就可以被其他地方引用捅僵。我們在編寫程序的 時候,也經(jīng)常引用其他模塊眨层,包括 Python 內(nèi)置的模塊和來自第三方的 模塊庙楚。

使用模塊還可以避免函數(shù)名和變量名沖突。
舉個例子趴樱,一個abc.py的文件就是一個名字叫abc的模塊馒闷,一個xyz.py的文件就是一個名字叫xyz的模塊。

現(xiàn)在叁征,假設(shè)我們的abcxyz這兩個模塊名字與其他模塊沖突了纳账,于是我們可以通過包來組織模塊,避免沖突捺疼。方法是選擇一個頂層包名疏虫,比如mycompany,按照如下目錄存放:
mycompany
├─ init.py
├─ abc.py
└─ xyz.py
引入了包以后啤呼,只要頂層的包名不與別人沖突卧秘,那所有模塊都不會與別人沖突。現(xiàn)在官扣,abc.py模塊的名字就變成了mycompany.abc翅敌,類似的,xyz.py的模塊名變成了mycompany.xyz醇锚。(??有時候的模塊引用出現(xiàn)大量xx.xx.xx.xx的形式可能是模塊多重頂層包名,而不要想成是函數(shù)調(diào)用xxx.xxx)


像列表一樣去讀取斐波那契數(shù)列坯临,用面向?qū)ο蟊硎?/h3>
class Fib(object):
    def __getitem__(self, n):
        a, b = 1, 1
        for x in range(n):
            a, b = b, a + b
        return a

>>> f = Fib()
>>> f[0]
1
>>> f[1]
1
>>> f[2]
2


定制類__getattr__

正常情況下焊唬,當(dāng)我們調(diào)用類的方法或?qū)傩詴r,如果不存在看靠,就會報錯赶促。
比如定義 Student 類:

class Student(object):
    def __init__(self):
        self.name = 'Michael'
 # 調(diào)用 name 屬性,沒問題挟炬,但是鸥滨,調(diào)用不存在的 score 屬性嗦哆,就有問題了:
>>> s = Student()
>>> print(s.name)
Michael
>>> print(s.score)
Traceback (most recent call last):
  ...
AttributeError: 'Student' object has no attribute 'score'

要避免這個錯誤,除了可以加上一個 score 屬性外婿滓,Python 還有另一個 機(jī)制老速,那就是寫一個__getattr__()方法,動態(tài)返回一個屬性凸主。修改如下:

class Student(object):
    def __init__(self):
        self.name = 'Michael'
    def __getattr__(self, attr):
        if attr=='score':
return 99

# 當(dāng)調(diào)用不存在的屬性時橘券,比如 score,Python 解釋器會試圖調(diào)用 __getattr__(self, 'score')來嘗試獲得屬性卿吐,這樣旁舰,我們就有機(jī)會返回 score 的值:
>>> s = Student()
>>> s.name
'Michael'
>>> s.score
99

返回函數(shù)也是完全可以的:

class Student(object):
    def __getattr__(self, attr):
        if attr=='age':
return lambda: 25  # 只是調(diào)用方式要變?yōu)?

>>> s.age()
25

注意,只有在沒有找到屬性的情況下嗡官,才調(diào)用__getattr__箭窜,已有的屬性,比如 name衍腥,不會在__getattr__中查找磺樱。

此外,注意到任意調(diào)用如 s.abc 都會返回 None紧阔,這是因為我們定義的 __getattr__默認(rèn)返回就是 None坊罢。要讓 class 只響應(yīng)特定的幾個屬性,我 們就要按照約定擅耽,拋出 AttributeError 的錯誤

這實際上可以把一個類的所有屬性和方法調(diào)用全部動態(tài)化處理了活孩,不需 要任何特殊手段。
這種完全動態(tài)調(diào)用的特性有什么實際作用呢?作用就是乖仇,可以針對完全 動態(tài)的情況作調(diào)用憾儒。

現(xiàn)在很多網(wǎng)站都搞 REST API,比如新浪微博乃沙、豆瓣啥的起趾,調(diào)用 API 的
URL 類似:
? http://api.server/user/friends
? http://api.server/user/timeline/list
如果要寫 SDK,給每個 URL 對應(yīng)的 API 都寫一個方法警儒,那得累死训裆,而
且,API 一旦改動蜀铲,SDK 也要改边琉。
利用完全動態(tài)的__getattr__,我們可以寫出一個鏈?zhǔn)秸{(diào)用:

class Chain(object):
    def __init__(self, path=''):
        self._path = path
    def __getattr__(self, path):
        return Chain('%s/%s' % (self._path, path))
    def __str__(self):
        return self._path
__repr__ = __str__ 試試:
>>> Chain().status.user.timeline.list
'/status/user/timeline/list'    
 # 這里結(jié)果第一個 / 前應(yīng)該有個值记劝,是 self._path,但是Chain()沒有傳參变姨,默認(rèn)path = ' ',空的了

python標(biāo)準(zhǔn)異常表


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市厌丑,隨后出現(xiàn)的幾起案子定欧,更是在濱河造成了極大的恐慌渔呵,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砍鸠,死亡現(xiàn)場離奇詭異扩氢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)睦番,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門类茂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人托嚣,你說我怎么就攤上這事巩检。” “怎么了示启?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵兢哭,是天一觀的道長。 經(jīng)常有香客問我夫嗓,道長迟螺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任舍咖,我火速辦了婚禮矩父,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘排霉。我一直安慰自己窍株,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布攻柠。 她就那樣靜靜地躺著球订,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瑰钮。 梳的紋絲不亂的頭發(fā)上冒滩,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音浪谴,去河邊找鬼开睡。 笑死,一個胖子當(dāng)著我的面吹牛苟耻,可吹牛的內(nèi)容都是我干的篇恒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼梁呈,長吁一口氣:“原來是場噩夢啊……” “哼婚度!你這毒婦竟也來了蘸秘?” 一聲冷哼從身側(cè)響起官卡,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蝗茁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寻咒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哮翘,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年毛秘,在試婚紗的時候發(fā)現(xiàn)自己被綠了饭寺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡叫挟,死狀恐怖艰匙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抹恳,我是刑警寧澤员凝,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站奋献,受9級特大地震影響健霹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓶蚂,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一糖埋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窃这,春花似錦瞳别、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至朴上,卻和暖如春垒棋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痪宰。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工叼架, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衣撬。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓乖订,卻偏偏與公主長得像,于是被迫代替她去往敵國和親具练。 傳聞我的和親對象是個殘疾皇子乍构,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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

  • pyton review 學(xué)習(xí)指南 https://www.zhihu.com/question/29138020...
    孫小二wuk閱讀 1,053評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法扛点,內(nèi)部類的語法哥遮,繼承相關(guān)的語法岂丘,異常的語法,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,166評論 30 470
  • 兩本不錯的書: 《Python參考手冊》:對Python各個標(biāo)準(zhǔn)模塊眠饮,特性介紹的比較詳細(xì)奥帘。 《Python核心編程...
    靜熙老師哈哈哈閱讀 3,363評論 0 80
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,116評論 0 62