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()
這是為什麼?原因就是當count()函式返回了3個函式時,這3個函式所引用的變數 i 的值已經變成了3。由於f1、>>> f1() #呼叫的結果 9 >>> f2() 9 >>> f3() 9
f2、f3並沒有被呼叫,所以,此時他們並未計算 i*i,當 f1 被呼叫時,i 的值已經變成了3。因此,返回函式不要
引用任何迴圈變數,或者後續會發生變化的變數。
相關推薦
python進階5:外層函式、內層函式和閉包
在函式內部定義的函式和外部定義的函式是一樣的,只是他們無法被外部訪問,例如: def f(): print 'f()' def g(): print 'g()' return g #將g定義在函式f內部,防止其他程式碼呼叫g 但
python進階14:例項方法和類方法、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.gz和hbase-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