Python基礎(08):迭代器和解析
迭代器是一個可以記住遍歷的位置的物件。
迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。
一、NEXT
-
語法:next(iterator[, default])
-
說明:
-
函式必須接收一個可迭代物件引數,每次呼叫的時候,返回可迭代物件的下一個元素。如果所有元素均已經返回過,則丟擲StopIteration 異常。
>>> a = iter('abcd') >>> next(a) 'a' >>> next(a) 'b' >>> next(a) 'c' >>> next(a) 'd'
-
函式可以接收一個可選的default引數,傳入default引數後,如果可迭代物件還有元素沒有返回,則依次返回其元素值,如果所有元素已經返回,則返回default指定的預設值而不丟擲StopIteration 異常。
a = iter('abcd') >>> next(a,'e') 'a' >>> next(a,'e') 'b' >>> next(a,'e') 'c' >>> next(a,'e') 'd' >>> next(a,'e') 'e' >>> next(a,'e') 'e'
二、iter
-
語法:iter(object[, sentinel])
-
說明:
-
函式功能返回一個可迭代物件。
-
當第二個引數不提供時,第一個引數必須是一個支援可迭代協議(即實現了__iter__()方法)的集合(字典、集合、不可變集合),或者支援序列協議(即實現了__getitem__()方法,方法接收一個從0開始的整數引數)的序列(元組、列表、字串),否則將報錯。
>>> a = iter({'A':1,'B':2}) #字典集合 >>> a <dict_keyiterator object at 0x03FB8A50> >>> next(a) 'A' >>> next(a) 'B' >>> a = iter('abcd') #字串序列 >>> a <str_iterator object at 0x03FB4FB0> >>> next(a) 'a' >>> next(a) 'b' >>> next(a) 'c' >>> next(a) 'd'
-
當第二個引數sentinel提供時,第一個引數必須是一個可被呼叫物件。建立的迭代物件,在呼叫__next__方法的時候會呼叫這個可被呼叫物件,當返回值和sentinel值相等時,將丟擲StopIteration異常, 終止迭代。
>>> class IterTest: def __init__(self): self.start = 0 self.end = 10 def get_next_value(self): current = self.start if current < self.end: self.start += 1 else: raise StopIteration return current >>> iterTest = IterTest() #例項化類 >>> a = iter(iterTest.get_next_value,4) # iterTest.get_next_value為可呼叫物件,sentinel值為4 >>> a <callable_iterator object at 0x03078D30> >>> next(a) >>> next(a) 1 >>> next(a) 2 >>> next(a) 3
三、RANGE
-
語法:range(start, stop[, step])
-
說明:
-
range函式用於生成一個range物件,range型別是一個表示整數範圍的型別。
-
可以直接傳入一個結束整數來初始化一個range型別,預設起始值為0(包含0).結束整數可以大於0,也可以小於等於0,但是小於等於0的時候生成的range物件實際是不包含任何元素的。
>>> a = range(5) >>> a range(0, 5) >>> len(a) 5 >>> for x in a:print(x) 1 2 3 4 >>> b = range(0) # 傳入0,空range物件 >>> len(b) >>> c = range(-5) # 傳入負數,空range物件 >>> len(c)
-
可以傳入一個起始整數和一個結束整數來初始化一個range型別,生成的range型別包含起始整數(包含),和結束整數(不包含)之間的所有整數。
>>> a = range(1,5) >>> a range(1, 5) >>> for x in a:print(x) 1 2 3 4
-
傳入了起始整數和結束整數,還可以同時傳入一個步進值來初始化一個range型別,生成的range型別包含起始整數(包含),和結束整數(不包含)之間的以步進值篩選後的整數。
>>> a = range(1,10,3) >>> a range(1, 10, 3) >>> for x in a:print(x) 1 4 7
-
初始化range型別時起始整數和結束整數,遵循的是左臂右開原則,即包含起始整數,但不包含結束整數。
>>> a = range(1,5) >>> a range(1, 5) >>> for x in a:print(x) # 包含1,不包含5 1 2 3 4
-
range接收的引數都必須是整數,不能是浮點數等其它資料型別。
-
range實際上是一個不可變的序列型別,可以對它進行取元素、切片等序列操作,但是不能對其中元素修改值。
>>> a = range(1,5) >>> a[0] # 取元素 1 >>> a[:-2] # 切片 range(1, 3) >>> a[1] = 2 # 修改元素值 Traceback (most recent call last): File "<pyshell#38>", line 1, in <module> a[1] = 2 TypeError: 'range' object does not support item assignment
四、MAP
-
語法:map(function, iterable, ...)
-
說明:
-
函式接受一個函式型別引數、一個或者多個可迭代物件引數,返回一個可迭代器,此迭代器中每個元素,均是函式引數例項呼叫可迭代物件後的結果。
>>> a = map(ord,'abcd') >>> a <map object at 0x03994E50> >>> list(a) [97, 98, 99, 100]
-
當傳入多個可迭代物件時,函式的引數必須提供足夠多的引數,保證每個可迭代物件同一索引的值均能正確傳入函式。
>>> a = map(ord,'abcd','efg') # 傳入兩個可迭代物件,所以傳入的函式必須能接收2個引數,ord不能接收2個引數,所以報錯 >>> list(a) Traceback (most recent call last): File "<pyshell#22>", line 1, in <module> list(a) TypeError: ord() takes exactly one argument (2 given)
-
當傳入多個可迭代物件時,且它們元素長度不一致時,生成的迭代器只到最短長度。
>>> def f(a,b): return a + b >>> a = map(f,'abcd','efg') # 選取最短長度為3 >>> list(a) ['ae', 'bf', 'cg'] map函式是一個典型的函數語言程式設計例子。
五、ZIP
-
語法:zip(*iterables)
-
說明:
-
函式功能是聚合傳入的每個迭代器中相同位置的元素,返回一個新的元組型別迭代器。
>>> x = [1,2,3] >>> y = [4,5,6] >>> xy = zip(x,y) >>> xy #xy的型別是zip型別 <zip object at 0x0429C828> #匯入Iterable >>> from collections import Iterable >>> isinstance(xy,Iterable) #判斷是否可迭代物件 True >>> list(xy) #結果 [(1, 4), (2, 5), (3, 6)]
-
如果傳入的迭代器長度不一致,最短長度的迭代器迭代結束後停止聚合。
>>> x = [1,2,3] #長度3 >>> y = [4,5,6,7,8] #長度5 >>> list(zip(x,y)) # 取最小長度3 [(1, 4), (2, 5), (3, 6)]
-
如果只傳入一個迭代器,則返回的單個元素元組的迭代器。
>>> list(zip([1,2,3])) [(1,), (2,), (3,)]
-
如果不傳入引數,則返回空的迭代器。
>>> list(zip()) []
-
zip(*[iter(s)]*n)等效於呼叫zip(iter(s),iter(s),...,iter(s))。
>>> x = [1,2,3] >>> list(zip(*[x]*3)) [(1, 1, 1), (2, 2, 2), (3, 3, 3)] >>> list(zip(x,x,x)) [(1, 1, 1), (2, 2, 2), (3, 3, 3)]
六、FILTER
-
語法:filter(function, iterable)
-
說明:
-
filter函式用於過濾序列。過濾的方式則是採用傳入的函式,去迴圈序列的元素呼叫,如果函式計算的結果為True則保留元素,否則將捨棄該元素。
>>> a = list(range(1,10)) #定義序列 >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> def if_odd(x): #定義奇數判斷函式 return x%2==1 >>> list(filter(if_odd,a)) #篩選序列中的奇數 [1, 3, 5, 7, 9]
-
當function引數傳入None時,序列中的元素值如果為False,也會自動捨棄。
>>> c = ['',False,'I',{}] #定義序列 >>> c ['', False, 'I', {}] >>> list(filter(None,c)) #篩選函式為None,自動捨棄序列中的False值,空字串、False值、空序列都是False值,所以丟棄 ['I']
七、LIST型別迭代
>>> L = [1,2,3,4,5] >>> for i in range(len(L)): >>> L[i] += 10 >>> print(L) [11, 12, 13, 14, 15] >>> L = [x + 10 for x in L] >>> print(L) [21, 22, 23, 24, 25]
八、DICT型別迭代
>>> D = dict(a=1, b=2, ,c=3) >>> for k in sorted(D): print(k, D[k], end=' ') 1 2 3
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31490526/viewspace-2636148/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python基礎(四)——迭代器/物件,生成器Python物件
- Java基礎Iterator迭代器Java
- Python迭代和迭代器詳解Python
- Python3 迭代器深入解析Python
- 【重溫基礎】13.迭代器和生成器
- 【ES6基礎】迭代器(iterator)
- java基礎之:迭代器詳解Java
- Python 進階_迭代器 & 列表解析Python
- 『無為則無心』Python基礎 — 61、Python中的迭代器Python
- 『無為則無心』Python基礎 — 62、Python中自定義迭代器Python
- python3基礎 之 迭代器與生成器,生成式Python
- Python零基礎學習筆記(二十三)——迭代器Python筆記
- Python 三目運算,列表解析,裝飾器,迭代器和生成器Python
- Python 迭代器Python
- Python迭代器Python
- Python:迭代器Python
- 【重溫基礎】3.迴圈和迭代
- 1.5.4 Python迭代器和生成器Python
- Python的迭代器和生成器Python
- Python進階:迭代器與迭代器切片Python
- Thinkphp5基礎——08 控制器PHP
- 迭代器,迭代器塊和資料管道
- python基礎--函式全解析Python函式
- python基礎之列表解析Python
- 【設計模式基礎】行為模式 - 7 - 迭代器(Iterator)設計模式
- Python之裝飾器、迭代器和生成器Python
- python3.7 迭代器和生成器Python
- python 魔法方法,屬性和迭代器Python
- Python可迭代的物件與迭代器Python物件
- Iterables和迭代器
- python基礎 python類的成員和裝飾器Python
- 關於python中可迭代物件和迭代器的一些理解Python物件
- Python生成器、迭代器、可迭代物件Python物件
- 草根學Python(七) 迭代器和生成器Python
- python迭代器和生成器的總結Python
- python基礎 -08- 資料型別(set)Python資料型別
- 深度理解Python迭代器Python
- python中的迭代器Python