撩課-Python-每天5道面試題-第8天

一. 解釋下什么是閉包? 有怎樣的場景作用?

  1. 概念
    在函數(shù)嵌套的前提下
    內(nèi)層函數(shù)引用了外層函數(shù)的變量(包括參數(shù))
    外層函數(shù), 又把 內(nèi)層函數(shù) 當(dāng)做返回值進(jìn)行返回
    這個內(nèi)層函數(shù)+所引用的外層變量, 稱為 "閉包"
  2. 標(biāo)準(zhǔn)格式
    def test1(a):
        b = 10
        其他函數(shù)定義代碼
        def test2():
            print(a)
            print(b)
        return test2
  1. 應(yīng)用場景
    外層函數(shù), 根據(jù)不同的參數(shù), 來生成不同作用功能的函數(shù)
  2. 案例
    根據(jù)配置信息, 生成不同的分割線函數(shù)
def line_config(content, length):
     def line():
         print("-"*(length // 2) + content + "-"*(length // 2))
         return line

line1 =  line_config("閉包", 40)
line1()
line2 = line_config("xxxx", 80)
line2()
  1. 注意事項
    • 閉包中, 如果要修改引用的外層變量
      需要使用 nonlocal 變量 聲明
      否則當(dāng)做是閉包內(nèi), 新定義的變量
    • 當(dāng)閉包內(nèi), 引用了一個, 后期會發(fā)生變化的變量時, 一定要注意
      函數(shù), 是被調(diào)用時, 才去確定變量標(biāo)識所對應(yīng)的值

二. 簡述對裝飾器的理解

  1. 作用
    在函數(shù)名以及函數(shù)體不改變的前提下, 給一個函數(shù)附加一些額外代碼
  2. 語法
@裝飾器
def 被裝飾函數(shù)():
    code
  1. 案例

完成基本的 發(fā)說說, 發(fā)圖片 函數(shù)
在上述函數(shù)的基礎(chǔ)上, 嵌入 身份驗證操作, 只有驗證通過后才可以發(fā)說說,發(fā)圖片


def checkLogin(func):
    def inner():
        print("登錄驗證...")
        func()
    return inner

# 定義兩個功能函數(shù)
@checkLogin
def fss():
    print("發(fā)說說")


# 語法糖 寫法
@checkLogin
def ftp():
    print("發(fā)圖片")
# ftp = checkLogin(ftp)


# 相關(guān)的邏輯代碼
btnIndex = 1
if btnIndex == 1:
    fss()
else:
    ftp()

"開放封閉"原則
已經(jīng)寫好的代碼, 盡可能不要修改
如果想要新增功能, 在原先代碼基礎(chǔ)上, 單獨(dú)進(jìn)行擴(kuò)展
單一職責(zé)
功能保持單一, 不要添加太多的冗余功能
注意
裝飾器的執(zhí)行時間, 是立即執(zhí)行
簡介明了有深度的裝飾器教程鏈接

三. 簡述對生成器的理解?

  1. 生成器
  • 是一個特殊的迭代器(迭代器的抽象層級更高)
  • 所以, 擁有迭代器的特性
    惰性計算數(shù)據(jù), 節(jié)省內(nèi)存
    能夠記錄狀態(tài), 并通過next()函數(shù), 訪問下一個狀態(tài)
    具備可迭代特性
  • 但是, 如果打造一個自己的迭代器, 比較復(fù)雜
    需要實現(xiàn)很多方法 后續(xù)在"面向?qū)ο?編程中會進(jìn)行講解
    所以, 就有一個更加優(yōu)雅的方式 "生成器"
  1. 創(chuàng)建方式
  • 生成器表達(dá)式
    把列表推導(dǎo)式的[] 修改成 ()
    (i for i in range(1, 10000000) if i % 2 == 0)
  • 生成器函數(shù)
    函數(shù)中包含 yield語句
    這個函數(shù)的執(zhí)行結(jié)果就是 "生成器"
  1. 產(chǎn)生數(shù)據(jù)的方式
    生成器具備可迭代特性
    next()函數(shù) 等價于 生成器.next()
    for in
  1. 關(guān)閉生成器
    g.close()
    后續(xù)如果繼續(xù)調(diào)用, 會拋出StopIteration異常提示
  1. 注意
    如果碰到return
    會直接終止, 拋出StopIteration異常提示
    生成器只會遍歷一次

四. 什么是遞歸函數(shù)? 有怎樣的應(yīng)用場景?

  1. 體現(xiàn)
    • 函數(shù)A內(nèi)部, 繼續(xù)調(diào)用函數(shù)A
    • 概念
      傳遞
      回歸
  2. 注意事項
    • 有傳遞, 一定要有回歸
    • 否則, 就是無限的循環(huán)調(diào)用
  3. 案例
    求一個數(shù)值的階乘
# 9
# 1 * 2 * 3 * ... 9



# 9! = 9 * 8!
#         8 * 7!
#             7 * 6!
#                ....
#                  1! = 1

# 功能: 如果是不直接知道結(jié)果的數(shù)據(jù), 就進(jìn)行分解 9 9 * 8! 8 =
# 如果說, 直接知道結(jié)果的數(shù)據(jù), 就直接返回 1! = 1
def jiecheng(n):
    if n == 1:
        return 1
    # n != 1
    return n * jiecheng(n - 1)

result = jiecheng(5)
print(result)

五. 函數(shù)作用域

  1. 變量的作用域
    變量的作用范圍 , 可操作范圍
  1. Python是靜態(tài)作用域,也就是說在Python中,變量的作用域源于它在代碼中的位置;
    在不同的位置, 可能有不同的命名空間
  1. 命名空間
  • 是作用域的體現(xiàn)形式
  • 不同的具體的操作范圍
  • Python-LEGB
    L-Local
    函數(shù)內(nèi)的命名空間
    作用范圍: 當(dāng)前整個函數(shù)體范圍
    E-Enclosing function locals
    外部嵌套函數(shù)的命名空間
    作用范圍: 閉包函數(shù)
    G-Global
    全局命名空間
    作用范圍: 當(dāng)前模塊(文件)
    B-Builtin
    內(nèi)建模塊命名空間
    作用范圍: 所有模塊(文件)
    注意
    Python中沒有塊級作用域
    塊級作用域
    代碼塊中, 比如 if while for 后的代碼塊
    LEGB規(guī)則
    按照L -> E -> G -> B 的順序進(jìn)行查找
  1. 基于命名空間的常見變量類型
  • 局部變量
    在一個函數(shù)內(nèi)部定義的變量蕴轨;
    作用域為函數(shù)內(nèi)部
    查看局部變量
    locals()
  • 全局變量
    在函數(shù)外部, 文件最外層定義的變量
    作用域為整個文件內(nèi)部
    查看全局變量
    globals()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勉抓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惑申,更是在濱河造成了極大的恐慌具伍,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硝桩,死亡現(xiàn)場離奇詭異沿猜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)碗脊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門啼肩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衙伶,你說我怎么就攤上這事祈坠。” “怎么了矢劲?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵赦拘,是天一觀的道長。 經(jīng)常有香客問我芬沉,道長躺同,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任丸逸,我火速辦了婚禮蹋艺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘黄刚。我一直安慰自己捎谨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布憔维。 她就那樣靜靜地躺著涛救,像睡著了一般。 火紅的嫁衣襯著肌膚如雪业扒。 梳的紋絲不亂的頭發(fā)上检吆,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音程储,去河邊找鬼咧栗。 笑死逆甜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的致板。 我是一名探鬼主播交煞,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼斟或!你這毒婦竟也來了素征?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤萝挤,失蹤者是張志新(化名)和其女友劉穎御毅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜珍,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡端蛆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酥泛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片今豆。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖柔袁,靈堂內(nèi)的尸體忽然破棺而出呆躲,到底是詐尸還是另有隱情,我是刑警寧澤捶索,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布插掂,位于F島的核電站,受9級特大地震影響腥例,放射性物質(zhì)發(fā)生泄漏辅甥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一燎竖、第九天 我趴在偏房一處隱蔽的房頂上張望肆氓。 院中可真熱鬧,春花似錦底瓣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凳鬓,卻和暖如春茁肠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缩举。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工垦梆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留匹颤,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓托猩,卻偏偏與公主長得像印蓖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子京腥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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

  • 〇赦肃、前言 本文共108張圖,流量黨請慎重公浪! 歷時1個半月他宛,我把自己學(xué)習(xí)Python基礎(chǔ)知識的框架詳細(xì)梳理了一遍。 ...
    Raxxie閱讀 18,952評論 17 410
  • 兩人這么一來二去也算熟絡(luò)了欠气,中年商人干脆端著酒壺和碗筷坐到了秋素雅的對面厅各,仔細(xì)打量著這個俊美得不可思議...
    許念秋閱讀 336評論 0 0
  • “這可不是做夢了。你看预柒,他其實就在這里队塘,一直都在。因為你也是三卫旱,我人灼,也是三」艘恚” 人群中投放,一紅一白兩個身影相攜走著。...
    魚傳閱讀 278評論 3 4
  • 1 凌晨三點 記憶對我撒了謊 明明曾經(jīng)說過我們一起到地老天荒 2 夜涼如水 用我溫柔的指尖 觸摸到的是冷冰冰的清愁...
    浮生猶若夢閱讀 506評論 8 8