案例:
實現乙個連續的浮點數發生器,floatrange,根據給定範圍(start, end) 和步進值,產生一些列的浮點數,例如:floatrange(3,4,0.2),將產生下列序列:
正向:3.0 3.2 …… 4.0
反向:4.0 3.8 …… 3.0
如何實現?
方法1:列表翻轉
#!/usr/bin/python3l = [1, 2, 3, 4, 5, 6]
l.reverse()
for i in l:
print(i)
# 出現問題,改變了原列表,不可取
方法2:列表切片
#!/usr/bin/python3l = [1, 2, 3, 4, 5, 6]
for i in l[::-1]:
print(i)
# 得到了和原列表等大的列表,某種程度上很浪費
方法3: __ reversed__方法
#!/usr/bin/python3l = [1, 2, 3, 4, 5, 6]
for i in reversed(l):
print(i)
如何邏輯整理?
for迴圈正向迭代呼叫__iter__方法,反向迭代呼叫__reversed__方法,可以定義乙個類,寫上這些方法
#!/usr/bin/python3class 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 的特殊方法時才能生效。如果兩者都不符合,那你必須先將物件轉換為乙個列表才行,比如 ...