官术网_书友最值得收藏!

2.1.5 嵌套函數

本書中用到的另一個技巧是在函數內部定義函數。這樣做有兩個很好的理由:一是,它允許內部函數訪問外部函數的所有信息,而不需要將這些信息作為參數傳遞;二是,內部函數可以定義一些對外部世界不可見的邏輯。

使用常規語法即可在函數中定義函數。讓我們看一個例子:

這里,inner_fn函數是在outer_fn函數內部定義的,因此,它不能從主函數的外部訪問,只能從其內部訪問。inner_fn函數可以訪問outer_fn中定義的所有內容,包括函數參數。

當函數的邏輯變得復雜,且可以被分解時,在函數內部定義子函數很有用。當然,我們也可以將函數分解成同一級別的簡單函數。在這種情況下,為了表明這些子函數不從模塊外部導入和使用,我們需要遵循Python的標準,將函數名稱寫成兩個下劃線開頭的形式:

注意,Python沒有訪問修飾符(公共、專用……),因此,在模塊頂層(即Python文件)編寫的所有代碼都可以被導入和使用。

記住,這兩個下劃線只是表示一個我們應該遵守的約定。實際上并沒有阻止我們導入和使用這些代碼。在導入以兩個下劃線開頭的函數時,我們必須明白,該函數的作者并不希望其被外部引用;如果調用該函數,結果可能在意料之外。通過在被調用的函數內部定義子函數,我們可以避免這種行為。

主站蜘蛛池模板: 柳江县| 紫云| 鄢陵县| 大埔区| 阿拉善右旗| 乐山市| 合川市| 巫山县| 青海省| 花莲县| 灵寿县| 大化| 临潭县| 旺苍县| 霍山县| 吴桥县| 湘西| 桃园县| 昭苏县| 商城县| 大连市| 建水县| 峡江县| 马龙县| 惠东县| 万全县| 盐源县| 北流市| 沛县| 堆龙德庆县| 张掖市| 高青县| 灵寿县| 林口县| 安阳县| 美姑县| 岳普湖县| 宝清县| 菏泽市| 大竹县| 高台县|