Python 反向迭代和實現反向迭代

2022-05-17 05:39:07 字數 1915 閱讀 5913

案例:

實現乙個連續的浮點數發生器,floatrange,根據給定範圍(start, end) 和步進值,產生一些列的浮點數,例如:floatrange(3,4,0.2),將產生下列序列:

正向:3.0 3.2 …… 4.0

反向:4.0 3.8 …… 3.0

如何實現?

方法1:列表翻轉

#!/usr/bin/python3

l = [1, 2, 3, 4, 5, 6]

l.reverse()

for i in l:

print(i)

# 出現問題,改變了原列表,不可取

方法2:列表切片

#!/usr/bin/python3

l = [1, 2, 3, 4, 5, 6]

for i in l[::-1]:

print(i)

# 得到了和原列表等大的列表,某種程度上很浪費

方法3: __ reversed__方法

#!/usr/bin/python3

l = [1, 2, 3, 4, 5, 6]

for i in reversed(l):

print(i)

如何邏輯整理?

for迴圈正向迭代呼叫__iter__方法,反向迭代呼叫__reversed__方法,可以定義乙個類,寫上這些方法

#!/usr/bin/python3

class floatrange(object):

def __init__(self, start, end, step):

self.dot = self.__get_dot_num(step)

# 有多少個小數點就乘以10的多少次冪,因為浮點數運算不準確,換算成整形數進行計算

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):

# 計算step有多少個小數點

if isinstance(step, int):

return step

else:

# 通過round實現計算有多少位小數,首創

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)

3 4進行反向迭代以及實現反向迭代

coding utf 8 實際案例 實現乙個連續浮點數發生器floatrange 和xrange類似 根據給定範圍 start,end 和步進值 step 產生一系列連續浮點數,如迭代floatrange 3.0,4.0,0.2 可產生序列 l 1,2,3,4,5 l.reverse 會改變原列表 ...

反向迭代與實現

要求 實現乙個連續浮點數發生器floatrange,根據給定範圍和步進值產生一系列連續浮點數,如迭代floatrange 3.0,4.0,0.2 可產生序列 正向 3.0,3.2,3.4,3.6,3.8,4.0 反向 4.0,3.8,3.6,3.4,3.2,3.0 class floatrange ...

Python 迭代器和生成器 反向迭代

你想反方向迭代乙個序列 使用內建的reversed 函式,比如 a 1,2,3,4 for x in reversed a print x 432 1反向迭代僅僅當物件的大小可預先確定或者物件實現了 reversed 的特殊方法時才能生效。如果兩者都不符合,那你必須先將物件轉換為乙個列表才行,比如 ...