python迭代器生成器使用技巧(1):遍历、代理、生成器创建迭代、反向迭代
1. 手動遍歷迭代器 next()
遍歷一個可迭代對象中的所有元素,但是卻不想使用for循環。為了手動的遍歷可迭代對象,使用 next() 函數并在代碼中捕獲 StopIteration 異常。 通常來講, StopIteration 用來指示迭代的結尾。 然而,如果手動使用 next() 函數的話,還可以通過返回一個指定值來標記結尾,比如 None 。讀取一個文件的所有行實例。
def manual_iter(filename):with open(filename) as f:try:while True:line = next(f)print(line, end = '')except StopIteration:passmanual_iter(filename = 'test.txt') ############################with open('test.txt') as f:while True:line = next(f, None)if line is None:breakprint(line, end='') # >>> sorry # i really don't know how to choose? # go abroad, tencent, or alibaba? # but anyway, # i absolutely don't choose to huawei...迭代機制:獲取迭代器+運行迭代器
items = [1, 2, 3] # Get the iterator it = iter(items) # Invokes items.__iter__() # Run the iterator print( next(it) ) # 1 print( next(it) ) # 2 print( next(it) ) # 3 print( next(it) ) # Traceback : StopIteration2. 代理迭代
有的時候,我們需要構建自定義容器對象,里面包含有列表、元組或其他可迭代對象。并且直接在新容器對象上執行迭代操作。實際上我們只需要定義一個__iter__()方法,將迭代操作代理到容器內部的對象上去。
class Node:def __init__(self, value):self.value = valueself._children = []def __repr__(self):return 'Node({!r})'.format(self.value)def add_child(self, node):self._children.append(node)def __iter__(self):return iter(self._children)if __name__ == '__main__':root = Node(0)child1 = Node(1)child2 = Node(2)root.add_child(child1)root.add_child(child2)for tar in root:print(tar) # >>> Node(1) Node(2)在上面代碼中, __iter__() 方法只是簡單的將迭代請求傳遞給內部的 _children 屬性。
3. 使用生成器創建新的迭代模式
如果想實現一種新的迭代模式,可以使用生成器函數來定義。 下面是一個生產某個范圍內浮點數的生成器:
def frange(start, stop, increment):x = startwhile x < stop:yield x # pointer to next objectx += incrementfor num in frange(0, 4, 0.5):print(num) # >>> 0 0.5 1.0 1.5 2.0 2.5 3.0 3.5一個函數中需要有一個?yield?語句即可將其轉換為一個生成器。 跟普通函數不同的是,生成器只能用于迭代操作。一個生成器函數主要特征是它只會回應在迭代中使用到的?next?操作。 一旦生成器函數返回退出,迭代終止。
4. 反向迭代
當我們需要反向迭代時,就需要reversed()函數進行處理。
a = [1, 2, 3, 4] for num in reversed(a):print (num) # >>> 4 3 2 1反向迭代僅僅當對象的大小可預先確定或者對象實現了 __reversed__() 的特殊方法時才能生效。 如果兩者都不符合,那必須先將對象轉換為一個列表才行,比如:
""" a = [1, 2, 3, 4] for num in reversed(a):print (num) # >>> 4 3 2 1 """ f = open('test.txt') for line in reversed(list(f)):print(line, end='') # >>> i absolutely don't choose to huawei.but anyway. # go abroad, tencent, or alibaba? # i really don't know how to choose? # sorry.- 自定義類上實現 __reversed__() 方法來實現反向迭代
定義一個反向迭代器可以使得代碼非常的高效, 因為它不再需要將數據填充到一個列表中然后再去反向迭代這個列表。
文章參考《python3-cookbook》
總結
以上是生活随笔為你收集整理的python迭代器生成器使用技巧(1):遍历、代理、生成器创建迭代、反向迭代的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python数字处理技巧(2): Num
- 下一篇: 别让深爱你的人受伤