您好,登錄后才能下訂單哦!
本文實(shí)例為大家分享了python實(shí)現(xiàn)反向迭代的具體代碼,供大家參考,具體內(nèi)容如下
案例:
實(shí)現(xiàn)一個(gè)連續(xù)的浮點(diǎn)數(shù)發(fā)生器,FloatRange,根據(jù)給定范圍(start, end) 和步進(jìn)值,產(chǎn)生一些列的浮點(diǎn)數(shù),例如:FloatRange(3,4,0.2),將產(chǎn)生下列序列:
正向:3.0 3.2 …… 4.0
反向:4.0 3.8 …… 3.0
如何實(shí)現(xiàn)?
方法1:列表翻轉(zhuǎn)
#!/usr/bin/python3 l = [1, 2, 3, 4, 5, 6] l.reverse() for i in l: print(i) # 出現(xiàn)問題,改變了原列表,不可取
方法2:列表切片
#!/usr/bin/python3 l = [1, 2, 3, 4, 5, 6] for i in l[::-1]: print(i) # 得到了和原列表等大的列表,某種程度上很浪費(fèi)
方法3: __ reversed__方法
#!/usr/bin/python3 l = [1, 2, 3, 4, 5, 6] for i in reversed(l): print(i)
如何邏輯整理?
for循環(huán)正向迭代調(diào)用__iter__方法,反向迭代調(diào)用__reversed__方法,可以定義一個(gè)類,寫上這些方法
#!/usr/bin/python3 class FloatRange(object): def __init__(self, start, end, step): self.dot = self.__get_dot_num(step) # 有多少個(gè)小數(shù)點(diǎn)就乘以10的多少次冪,因?yàn)楦↑c(diǎn)數(shù)運(yùn)算不準(zhǔn)確,換算成整形數(shù)進(jìn)行計(jì)算 self.start = start*pow(10, self.dot) self.end = end*pow(10, self.dot) self.step = step*pow(10, self.dot) def __get_dot_num(self, step): # 計(jì)算step有多少個(gè)小數(shù)點(diǎn) if isinstance(step, int): return step else: # 通過round實(shí)現(xiàn)計(jì)算有多少位小數(shù),首創(chuàng) for dot in range(len(str(step))+1): if step == round(step, dot): return dot def __iter__(self): # 正向迭代 while self.start <= self.end: yield self.start/pow(10, self.dot) self.start += self.step def __reversed__(self): # 反向迭代 while self.end >= self.start: yield self.end/pow(10,self.dot) self.end -= self.step if __name__ == '__main__': float_num_1 = FloatRange(2, 5, 0.1) float_num_2 = FloatRange(2, 5, 0.1) # 正向迭代 for i in float_num_1: print(i) print('_'*60) # 反向迭代 for x in reversed(float_num_2): print(x)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。