迭代器是一個可以記住遍歷的位置的對象。
迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。
語法: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(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(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(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(*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(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']
>>> 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]
>>> D = dict(a=1, b=2, ,c=3) >>> for k in sorted(D): print(k, D[k], end=' ') 1 2 3
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。