日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python迭代器生成器使用技巧(1):遍历、代理、生成器创建迭代、反向迭代

發(fā)布時間:2025/3/15 python 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python迭代器生成器使用技巧(1):遍历、代理、生成器创建迭代、反向迭代 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 手動遍歷迭代器 next()

遍歷一個可迭代對象中的所有元素,但是卻不想使用for循環(huán)。為了手動的遍歷可迭代對象,使用 next() 函數(shù)并在代碼中捕獲 StopIteration 異常。 通常來講, StopIteration 用來指示迭代的結(jié)尾。 然而,如果手動使用 next() 函數(shù)的話,還可以通過返回一個指定值來標記結(jié)尾,比如 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 : StopIteration

2. 代理迭代

有的時候,我們需要構(gòu)建自定義容器對象,里面包含有列表、元組或其他可迭代對象。并且直接在新容器對象上執(zhí)行迭代操作。實際上我們只需要定義一個__iter__()方法,將迭代操作代理到容器內(nèi)部的對象上去。

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__() 方法只是簡單的將迭代請求傳遞給內(nèi)部的 _children 屬性。

3. 使用生成器創(chuàng)建新的迭代模式

如果想實現(xiàn)一種新的迭代模式,可以使用生成器函數(shù)來定義。 下面是一個生產(chǎn)某個范圍內(nèi)浮點數(shù)的生成器:

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

一個函數(shù)中需要有一個?yield?語句即可將其轉(zhuǎn)換為一個生成器。 跟普通函數(shù)不同的是,生成器只能用于迭代操作。一個生成器函數(shù)主要特征是它只會回應(yīng)在迭代中使用到的?next?操作。 一旦生成器函數(shù)返回退出,迭代終止。

4. 反向迭代

當(dāng)我們需要反向迭代時,就需要reversed()函數(shù)進行處理。

a = [1, 2, 3, 4] for num in reversed(a):print (num) # >>> 4 3 2 1

反向迭代僅僅當(dāng)對象的大小可預(yù)先確定或者對象實現(xiàn)了 __reversed__() 的特殊方法時才能生效。 如果兩者都不符合,那必須先將對象轉(zhuǎn)換為一個列表才行,比如:

""" 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.
  • 自定義類上實現(xiàn) __reversed__() 方法來實現(xiàn)反向迭代
class Countdown:def __init__(self, start):self.start = startdef __iter__(self):# Forwardn = self.startwhile n > 0:yield nn -= 1def __reversed__(self):# Reversen = 1while n <= self.start:yield nn += 1for rr in reversed(Countdown(30)):print(rr) for rr in Countdown(30):print(rr)

定義一個反向迭代器可以使得代碼非常的高效, 因為它不再需要將數(shù)據(jù)填充到一個列表中然后再去反向迭代這個列表。

文章參考《python3-cookbook》

總結(jié)

以上是生活随笔為你收集整理的python迭代器生成器使用技巧(1):遍历、代理、生成器创建迭代、反向迭代的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。