迭代器
- 可迭代對象
以直接作用於for循環的數據類型有以下幾種:
一類是集合數據類型,如list、tuple、dict、set、str等。
一類是generator,包括生成器和帶 yield 的 generator function。
這些可以直接作用於 for 循環的對象統稱爲可迭代對象:Iterable。 - 判斷是否可以迭代
可以使用 isinstance() 判斷一個對象是否爲 Iterable 對象:
例:
>>> isinstance('abc',Iterable)
True
>>> isinstance([],Iterable)
True
>>> isinstance({},Iterable)
True
>>> isinstance(100,Iterable)
False
我們可以判斷出是否爲可迭代對象
【注】可以迭代的對象都可以用for循環打印
- 迭代器
可以被next()函數調用並不斷返回下一個值的對象稱爲迭代器:Iterator。
可以使用 isinstance() 判斷一個對象是否爲Iterator對象:
>>> isinstance((x for x in range(10)),Iterator)
True
>>> isinstance([],Iterator)
False
>>> isinstance({},Iterator)
False
>>> isinstance('asdf',Iterator)
False
所以我們可以發現,生成器就是一個迭代器
- iter()函數
生成器都是Iterator對象,但 list、dict、str 雖然是可迭代的(Iterable),卻不是迭代器(Iterator)。而 iter() 函數,就是使 list、dict、str 等 Iterable 變成 Iterator。
例1:
>>> isinstance (iter([]),Iterator)
True
>>> isinstance(iter({}),Iterator)
True
>>> isinstance(iter('asdf'),Iterator)
True
>>>
例2:
>>> a=[1,2,3,4,5]
>>> next(a)
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
next(a)
TypeError: 'list' object is not an iterator
>>> b=iter(a)
>>> next(b)
1
>>> next(b)
2
>>> next(b)
3
>>>
總結:
凡是可作用於 for 循環的對象都是 Iterable 類型;
凡是可作用於 next() 函數的對象都是 Iterator 類型;
集合數據類型如:list、dict、str 等,都是 Iterable 但不是 Iterator ,不過可以用 iter() 函數來轉換成新的迭代器。
閉包
閉包一個閉包就是你調用了一個函數 a ,這個函數 a 返回了一個函數 b 給你。這個返回的函數 b 就叫做閉包。
程序如下:
def test(number):
print ('=====1=====')
def test_in(number2):
print('======2======')
print(number+number2)
print('=====3======')
return test_in
ret = test(100)
print('-'*30)
ret(1)
ret(100)
ret(200)
運行結果:
在不調用閉包函數的時候,程序默認將閉包跳過,直接運行閉包外的函數。但是在執行閉包函數的時候,需要調用外部函數的變量,在函數執行完,再次需要執行的時候,外部函數不需要再次調用,直接執行,所以外部函數不會結束。
應用:
def test(a,b):
def test_in(x):
print(a*x+b)
return test_in
line1 = test(1,1)
line1(0)
line2 = test(10,4)
line2(0)
line1(0)
運行結果:
創建兩條一次函數的線
創建a,b的值後,每次只需要傳一個值