python核心 迭代器和閉包

2021-09-26 15:17:43 字數 2344 閱讀 4494

就是迭代是重複反饋過程的活動,也可以粗俗的理解為可以用

for迴圈。

那啥東西可以迭代呢?

list

、元組tuple

、字典dictionary

、字串string

等資料型別都是可迭代的。

我們下面就來

驗證一下:

(這裡就介紹乙個判斷乙個東西是否可以迭代的方法)

from collections import iterable   # 引入這個模組

print(isinstance('abc',iterable)) # isinstance 『需要判斷的物件』

結果輸出:true

這裡只介紹了字串,其他的我就不贅述了。

下面就來介紹什麼是迭代器,迭代器和可迭代有什麼關係呢?

可迭代iterable

與迭代器

itertor

這兩個名詞很相似,很多初學者搞不清楚兩者的區別,甚至認為它們是一樣的。雖然可迭代和迭代器關係密切,但二者卻不是乙個概念。

迭代器必定可迭代,但可迭代不一定是迭代器。

可迭代:之所以物件可迭代,是因為在底層中這個物件有乙個

__iter__( )

方法,通過這個方法我們可以實現

for迴圈

迭代器:迭代器中有兩個方法

__iter__( )

方法和__next__( )

方法,這就是上面那段話的原因。

__next__( )

可以通過

next(item)

訪問下乙個元素。

通過實驗,我判斷了列表、字典、元組、字串不是迭代器,因為它們沒有

__next__( )

方法iter( )函式

舉例:

from collections import iterator

a = [1, 2, 3, 4, 5]

print(isinstance('a',iterator))

b =iter(a) # 這個iter方法是內建函式,引用上面那個模組是為了迭代器

print(isinstance(b,iterator))

結果輸出:false     true

在談閉包之前,我們先來談乙個簡單的例子:就是關於引用的問題

簡單來說就是函式裡面再定義乙個函式,並且內函式用到了外函式的變數。

這裡需要注意的是,當執行

funcb(2)

時,之前傳的

test(1

)還管用麼?

管用!因為

test_in

函式要用到

test

裡面的值,所以執行完

1的時候,它並沒有被銷毀,裡面定義的變數什麼的都會儲存。

def line(a,b):

def in_line(x):

return a*x+b

return in_line

line1=line(2,1)

print(line1(2))

輸出:5

這兩個函式應用閉包的話,就是將函式分成兩段,減少傳參修改量。(我感覺我這個例子舉得有點不恰當,等下回找到更好的例子再來補充)

今天突發奇想,想了乙個還比較好的例子。假如你去銀行辦理業務,進入大門機械人人臉識別功能,它能夠得到你的名字。然後說出:「誰誰,你好。」

# 辦業務(閉包)

context = ',你好'

def task(name):

def robot():

print('%s'%name+context)

return robot

line1 = task('張三')

line1()

結果輸出:張三,你好。

這裡例子講的是,外面這個函式傳入的引數對裡面的函式很重要,這也是閉包用法的重要原因之一。那假如你得到你的名字之 後,機械人傳給櫃檯,櫃檯辦業務也就方便很多。

總結:

在實際的開發中,閉包主要是用來封裝變數和收斂許可權的。

python基礎 迭代器,閉包

函式名是 乙個變 但它是 乙個特殊的變 與括號配合可以執行函式的變 1.函式名的記憶體位址 2.函式名可以賦值給其他變數 3.函式名可以當做容器類的元素 4.函式名可以當做函式的引數 5.函式名可以作為函式的返回值 什麼是閉包?閉包就是內層函式,對外層函式 非全域性 的變數的引用.叫閉包 我們可以使...

Lua for 迭代器和閉包

for迴圈分為兩種 數值型 numerical for和泛型 generic for。1 數值型for 語法如下 for var exp1,exp2,exp3 do something end上述迴圈中,var的作用範圍為for迴圈內部,其值從exp1變化到exp2之前,每次迴圈都會執行someth...

Lua 迭代器和閉包

內容來自 lua程式設計 第四版 18.1節 迭代器和閉包。迭代器 iterator 是一種可以讓我們遍歷乙個集合中所有元素的 結構。在 lua 語言中,通常使用函式表示迭代器 每一次呼叫函式時,函式會返回集合中的 下乙個 元素。乙個典型的例子就是io.read,每次呼叫該函式時它都會返回標準輸入中...