python
1.如何實(shí)現(xiàn)
- 需求:有時,我們需要反向迭代序列中的元素嗓蘑。
- 解決思路:python開發(fā)往往以簡潔為主源祈,
Life is short. You need Python. ——Bruce Eckel
,這句python社區(qū)名言榆苞,相信很多喜歡python語言的人都喜歡。是否存在一種python寫好的方法羹铅,來完成反向迭代的工作蚀狰。在用python解決實(shí)際問題的時候,我們應(yīng)該習(xí)慣首先去思考是否有一種已經(jīng)實(shí)現(xiàn)的方法职员。比如說麻蹋,python中的reversed()
。
In [1]: a_list = [1, 2, 3, 4, 5, 6, 7, 8]#新建一個列表焊切,并且給列表賦值
In [2]: for a_li in reversed(a_list):#首先是要reversed反轉(zhuǎn)列表扮授,然后遍歷輸出
...: print(a_li)
...:
8
7
6
5
4
3
2
1
-
注意
:反向迭代有兩個前提(二者之一滿足即可):- 1.待處理的對象有可確定的大小(大小可定)专肪。
- 2.此對象實(shí)現(xiàn)了
__reversed__()
特殊方法刹勃。 -
如果上述兩個條件都無法滿足,首先要做的是將這個對象轉(zhuǎn)換為列表嚎尤。
我們經(jīng)常會忽略一個問題荔仁,那就是內(nèi)存的占用。前面提到將可迭代對象轉(zhuǎn)換為列表可能會占用大量的內(nèi)存,尤其是可迭代對象較大時乏梁。
2.自定義類中實(shí)現(xiàn)反向迭代
- 前提:實(shí)現(xiàn)了
__reversed__()
特殊方法次洼。
#不需要將數(shù)據(jù)先放在列表中,再反向迭代遇骑,提高了效率
In [7]: class re_iterator:
...: def __init__(self,first):
...: self.first = first
...:
...: def __iter__(self):
...: n = self.first
...: while n > 0:
...: yield n
...: n -= 1
...:
...: def __reversed__(self):
...: n = 1
...: while n <= self.first:
...: yield n
...: n += 1
...:
In [8]: itera = re_iterator(15)#實(shí)例化這個反向的類卖毁,并傳入?yún)?shù)
In [9]: for i in itera: #循環(huán)打印出每一個元素
...: print(i,end=' ')
...:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1