python學習 迭代器、閉包

迭代器

  1. 可迭代對象
    以直接作用於for循環的數據類型有以下幾種:
    一類是集合數據類型,如list、tuple、dict、set、str等。
    一類是generator,包括生成器和帶 yield 的 generator function。
    這些可以直接作用於 for 循環的對象統稱爲可迭代對象:Iterable。
  2. 判斷是否可以迭代
    可以使用 isinstance() 判斷一個對象是否爲 Iterable 對象:
    例:
		>>> isinstance('abc',Iterable)
		True
		>>> isinstance([],Iterable)
		True
		>>> isinstance({},Iterable)
		True
		>>> isinstance(100,Iterable)
		False
	我們可以判斷出是否爲可迭代對象

【注】可以迭代的對象都可以用for循環打印

  1. 迭代器
    可以被next()函數調用並不斷返回下一個值的對象稱爲迭代器:Iterator。
    可以使用 isinstance() 判斷一個對象是否爲Iterator對象:
	>>> isinstance((x for x in range(10)),Iterator)
	True
	>>> isinstance([],Iterator)
	False
	>>> isinstance({},Iterator)
	False
	>>> isinstance('asdf',Iterator)
	False

所以我們可以發現,生成器就是一個迭代器

  1. 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的值後,每次只需要傳一個值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章