Python基礎(08):迭代器和解析

Ryan_Bai發表於2019-02-15

迭代器是一個可以記住遍歷的位置的物件。

迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。

一、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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章