Python迭代器

1.迭代和可迭代協議
	1)什麼叫迭代
		for i in [1,2,3,4]:  
    		print(i)

    	結果:
    		1
			2
			3
			4		

		for i in 1234
		    print(i) 

		結果:
		Traceback (most recent call last):
		  File "test.py", line 4, in <module>
		    for i in 1234:
		TypeError: 'int' object is not iterable	

		錯誤說,咱們的1234不可迭代。上面的卻能夠。
		那麼大膽推測,若是能夠迭代,就應該能夠被for循環。

		咱們知道,字符串、列表、元祖、集合、字典均可以for循環
		說明他們都是可迭代的。

		那麼正確的路子應該是什麼樣的呢,總不能憑空想象。
		from collections import Iterable   
		s = '1234'  
		l = [1,2,3,4]                
		t = (1,2,3,4)                
		d = {1:2,3:4}                
		s = {1,2,3,4}
		print(isinstance(a,Iterable))#Ture                           
		print(isinstance(l,Iterable))#Ture
		print(isinstance(t,Iterable))#Ture
		print(isinstance(d,Iterable))#Ture
		print(isinstance(s,Iterable))#Ture

		綜上:能夠將某個數據集內的數據「一個挨一個的取出來」,就叫作迭代。

	2)可迭代協議
		能夠被迭代知足的要求就叫作可迭代協議。
		可迭代協議;就是內部實現了 __iter__() 方法

		驗證:
			print(dir([1,2]))
			print(dir((1,2)))
			print(dir({1:2}))
			print(dir({1,2}))

		總結:
			能夠被for循環的都是可迭代的,想要可迭代,內部必須有一個
			__iter__() 方法。

			接着分析,這個 __iter__()作了什麼事情?
			print([1,2].__iter__())

			結果
			<list_iterator object at 0x1024784a8>
			這裏的iterator就是迭代器。

2.迭代器
	
	可迭代後又一難題出現了,什麼叫「迭代器」?
	'''
	dir([1,2].__iter__())是列表迭代器中實現的全部方法,
	dir([1,2])是列表中實現的全部方法,都是以列表的形式返
	回給咱們的,爲了看的更清楚,咱們分別把他們轉換成集合,
	而後取差集。
	'''
	#print(dir([1,2].__iter__()))
	#print(dir([1,2]))
	print(set(dir([1,2].__iter__()))-set(dir([1,2])))

	結果:
	{'__length_hint__', '__next__', '__setstate__'}

	咱們看到在列表迭代器中多了三個方法,那麼這三個方法都是
	幹什麼的呢?

		iter_l = [1,2,3,4,5,6].__iter__()#列表迭代器
		#獲取迭代器中元素的長度
		print(iter_l.__length_hint__())
		#根據索引值指定從哪裏開始迭代
		print('*',iter_l.__setstate__(4))
		#一個一個的取值
		print('**',iter_l.__next__())
		print('***',iter_l.__next__())

		結果:
			6
			* None
			** 5
			*** 6
	這三個方法中,可以一個一個取值的方法就是 __next__()
	在for循環中,就是在內部調用了 __next__() 方法才能取到
	一個一個的值。

	例子:
		l = [1,2,3]
		l_iter = l.__iter__()
		item = l_iter.__next__()
		print(item)#1
		item = l_iter.__next__()
		print(item)#2
		item = l_iter.__next__()
		print(item)#3
		item = l_iter.__next__()
		print(item)#StopIteration

		注意:
			若是咱們一直取,直到next取到迭代器裏已經沒有元素了,
			就會拋出一個StopIteration異常,告訴咱們,列表中已經
			沒有有效元素了。

			這個時候,咱們就要使用異常處理機制來把這個異常處理掉。

			例子:
				lis = ['1', '2', '3']
				it = lis.__iter__()
				while 1:
				    try:
				        res = it.__next__()
				        print(res)
				    except StopIteration:
				        break

				結果:
					1
					2
					3

	注:
		迭代器遵循迭代器協議:必須擁有 __iter__()方法和__next__()方法。

		# 迭代器的特色:
		#   1. 節省內存
		#   2. 惰性機制
		#   3. 只能往前拿. 不能反着拿

3.判斷對象是迭代器仍是可迭代對象
	例子:
		from collections import Iterator
		from collections import Iterable
		print(isinstance(range(10), Iterator))#False
		print(isinstance(range(10), Iterable))#Ture



		>>> from collections import Iterator
		>>> isinstance((x for x in range(10)), Iterator)
		True
		>>> isinstance([], Iterator)
		False
		>>> isinstance({}, Iterator)
		False
		>>> isinstance('abc', Iterator)
		False




		>>> from collections import Iterable
		>>> isinstance([], Iterable)
		True
		>>> isinstance({}, Iterable)
		True
		>>> isinstance('abc', Iterable)
		True
		>>> isinstance((x for x in range(10)), Iterable)
		True
		>>> isinstance(100, Iterable)
		False
相關文章
相關標籤/搜索