1. 程式人生 > >python進階5:外層函式、內層函式和閉包

python進階5:外層函式、內層函式和閉包

  在函式內部定義的函式和外部定義的函式是一樣的,只是他們無法被外部訪問,例如:

def f():
    print 'f()'
    def g():
        print 'g()'
    return g #將g定義在函式f內部,防止其他程式碼呼叫g
  但是如果內部函式引用了外部函式的引數,就沒法把內部函式再移到外部函式的外部,例如:
def calc_sum(lst):
    def sec_sum():
        return sum(lst)
    return sec_sum #此時sec_sum函式不能移到calc_sum的外部
  像這種內層函式引用了外層函式的變數(引數也算變數),然後返回內層函式的情況,稱為閉包

  閉包的特點是返回的函式還引用了外層函式的區域性變數,所以,要正確使用閉包,就要確保引用的區域性變數在函

數返回後不能變。舉例如下:

#希望一次返回3個函式,分別計算1*1,2*2,3*3:
def count():
    fs = []
    for i in range(1,4):
        def f():
            return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()
>>> f1() #呼叫的結果
9
>>> f2()
9
>>> f3()
9
  這是為什麼?原因就是當count()函式返回了3個函式時,這3個函式所引用的變數 i 的值已經變成了3。由於f1、

f2、f3並沒有被呼叫,所以,此時他們並未計算 i*i,當 f1 被呼叫時,i 的值已經變成了3。因此,返回函式不要

引用任何迴圈變數,或者後續會發生變化的變數。


相關推薦

python5外層函式函式

  在函式內部定義的函式和外部定義的函式是一樣的,只是他們無法被外部訪問,例如: def f(): print 'f()' def g(): print 'g()' return g #將g定義在函式f內部,防止其他程式碼呼叫g  但

python14例項方法類方法types.MethodType()

1 例項方法   一個例項的私有屬性就是以__開頭的屬性,無法被外部訪問,那這些屬性定義有什麼用?雖然私有屬性無法從外 部訪問,但是,從類的內部是可以訪問的。除了可以定義例項的屬性外,還可以定義例項的方法。例項的方法就是在 類中定義的函式,它的第一個引數永遠是 self,指

python 學習列表解析效率timeit模組

測試程式: import timeit lst = [] def test_xrange(n): global lst lst = [] for i in xrange(n): lst.append(1) assert len(lst) == n def

python指南list如何去重(去掉list中元素為字典的且字典部分key相同的list元素)

def _remove_duplicate(self, dict_list): seen = set() new_dict_list = [] for dict in dict_list: t_

python-基礎知識之匿名函式函式

一、什麼是匿名函式? 匿名就是沒有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #與函式有相同的作用域,但是匿名意味著引用計數為0,使用一次就釋放,除非讓其有名字 func=lambda x,

執行緒之執行緒佇列執行緒池協程

本節目錄: 1.執行緒佇列 2.執行緒池 3.協程   一、執行緒佇列   執行緒之間的通訊我們列表行不行呢,當然行,那麼佇列和列表有什麼區別呢?   queue佇列 :使用import queue,用法與程序Queue一樣   queue is especially useful

Android 6兩種序列化方式 Serializable Parcelable

什麼是序列化 我們總是說著或者聽說著“序列化”,它的定義是什麼呢? 序列化 (Serialization)將物件的狀態資訊轉換為可以儲存或傳輸的形式的過程。在序列化期間,物件將其當前狀態寫入到臨時或永續性儲存區。以後,可以通過從儲存區中讀取或反序列化物

3 zookeeper-3.4.9.tar.gzhbase-1.2.4-bin.tar.gz 環境搭建

lse 不一致 per ted 1.2 解決 als zook info 前提條件: 成功安裝了 jdk1.8, hadoop2.7.3 註意條件: zookeeper,hbase 版本必須要和hadoop 安裝版本相互兼容,否則

記錄我的 python 學習歷程-Day13 匿名函式函式 II

一、匿名函式 以後面試或者工作中經常用匿名函式 lambda,也叫一句話函式。 課上練習: # 正常函式: def func(a, b): return a + b print(func(4, 6)) # 10 # 匿名函式: func = lambda a, b: a + b print(

Python——詳解元類,metaclass的原理用法

本文始發於個人公眾號:**TechFlow**,原創不易,求個關注 今天是Python專題第18篇文章,我們來繼續聊聊Python當中的元類。 在上上篇文章當中我們介紹了type元類的用法,在上一篇文章當中我們介紹了__new__函式與__init__函式的區別,以及它在一些設計模式當中的運用。這篇文

第四章 php函式(自定義函式變數範圍引數傳遞,可變函式遞迴函式函式)

任何有效的php程式碼都可以作為函式體使用 //例子1 function add($a,$b){ echo $a+$b; } add(10,20); //php頁面顯示30 // 例子2 function add($a,$b){ return $a+$b; //r

回調匿名函數

pub 第一個 ble else message run tin 函數應用 cnblogs (1) is_callable用來檢測傳進來的值能被call_user_func或者array_walk等函數使用,它非常智能,能夠測試數組,數組形式的有效回調應該是以對象作為第一個

十二匿名函數

lee 內存問題 基於 傳參 不能 更多 垃圾 資源 增強 十二、匿名函數和閉包 匿名函數就是沒有名字的函數,閉包是可訪問一個函數作用域裏變量的函數。聲明:本節內容需要有面向對象和少量設計模式基礎,否則無法聽懂. 1.匿名函數 //普通函數 function b

作用域作用域鏈

作用域 1.變數的作用域無非就是兩種:全域性變數和區域性變數; 全域性作用域:最外層函式定義的變數擁有全域性作用域,即對任何內部函式來說都是可以訪問的; <script>      var outerVar = "outer"; &nbs

關於作用域防止作用域汙染作用域鏈的理解

作用域 變數的作用域無非就是兩種:全域性作用域和區域性作用域。  全域性作用域:  最外層函式定義的變數擁有全域性作用域,即對任何內部函式來說,都是可以訪問的: <script> var outerVar = "outer";

JavaScript關於作用域作用域鏈的理解

作用域 先來談談變數的作用域  變數的作用域無非就是兩種:全域性變數和區域性變數。  全域性作用域:  最外層函式定義的變數擁有全域性作用域,即對任何內部函式來說,都是可以訪問的: <script>       var outerVar = "outer";

一個函式理解js的this——詳解debounce

debounce應用場景模擬 debounce函式,俗稱防抖函式,專治input、resize、scroll等頻繁操作打爆瀏覽器或其他資源。前端面試幾乎必考,當然肯定會做一些變化。 <!DOCTYPE html> <html lang="en">

Python爬蟲新手怎樣讀取非結構化圖像視頻語音數據

image clas 訓練 在線的 功能 方式 base64編碼 contain width 通過open讀取之後會返回一個圖像文件對象,後續所有的圖像處理都基於該對象進行。上述代碼執行後,通過 img.show() 會調用系統默認的圖像瀏覽器查看打

Python(十四)- 基礎課程結課總結高階函式

分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow 也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/mm2zzyzzp Python進階(十四)- 基礎課程結課總結:高階函式

Python(3)_程與線程中的lock(互斥鎖遞歸鎖信號量)

fun 我們 bsp 控制 支持 發生 class 線程 數據操作 1、同步鎖 (Lock) 當各個線程需要訪問一個公共資源時,會出現數據紊亂 例如: 1 import threading,time 2 def sub(): 3 global num