如何进行反向迭代以及如何实现反向迭代

实际案例

实现一个连续浮点数发生器FloatRange(和xrange类似),根据给定范围(start,end)和步进值(step)产生一系列连续浮点数,如迭代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

正向

我们首先思考如何实现正向迭代。回想一下之前的知识点,我们可以实现__iter__()返回一个迭代器对象,这样我们不就可以实现正向迭代吗?

Python
In [53]: l Out[53]: [1, 2, 3, 4, 5] In [54]: iter(l) Out[54]: <list_<span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/iterator" title="View all posts in iterator" target="_blank">iterator</a></span> at 0x104871b70> # 这就是正向迭代 它的实现原理其实就是__iter__() 函数 In [56]: for x in iter(l): ...: print(x) ...: 1 2 3 4 5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
In [ 53 ] : l
Out [ 53 ] : [ 1 , 2 , 3 , 4 , 5 ]
 
In [ 54 ] : iter ( l )
Out [ 54 ] : < list_iterator at 0x104871b70 >
 
 
# 这就是正向迭代 它的实现原理其实就是__iter__() 函数
In [ 56 ] : for x in iter ( l ) :
     . . . :      print ( x )
     . . . :
1
2
3
4
5

那么如何实现反向迭代呢?

其实 python 有个内置函数reversed 可以解决反向迭代的问题?

Python
In [57]: <span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/reversed" title="View all posts in reversed" target="_blank">reversed</a></span>? Init signature: <span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/reversed" title="View all posts in reversed" target="_blank">reversed</a></span>(self, /, *args, **kwargs) Docstring: reversed(sequence) -> reverse iterator over values of the sequence Return a reverse iterator Type: type In [58]: for x in reversed(l): ...: print(x) ...: 5 4 3 2 1 由此可见,如果想实现反向迭代可以使用 reversed函数就可以了 [code] 所以这个正向迭代和方向迭代,可以这么写: [code lang="<span class="wp_keywordlink"><a href="http://www.168seo.cn/python" title="python">python</a></span>"] # -*- coding: utf-8 -*- __author__ = 'songhao' class FloatRange(object): def __init__(self, start, end, step): self.start = start self.end = end self.step = step def __iter__(self): """ 实现正向迭代 :return: """ while self.start <= self.end: yield self.start self.start += self.step def __reversed__(self): """ 实现反向迭代 :return: """ while self.end >= self.start: yield self.end self.end -= self.step if __name__ == '__main__': for x in FloatRange(1, 4, 1): print(x, "这是正向迭代") print("*" * 22) for x in reversed(FloatRange(1, 4, 1)): print(x, "这是反向迭代")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
In [ 57 ] : reversed ?
Init signature : reversed ( self , / , * args , * * kwargs )
Docstring :
reversed ( sequence ) -> reverse iterator over values of the sequence
 
Return a reverse iterator
Type :            type
 
In [ 58 ] : for x in reversed ( l ) :
     . . . :      print ( x )
     . . . :
5
4
3
2
1
由此可见 ,如果想实现反向迭代可以使用 reversed函数就可以了
 
[ code ]
 
 
所以这个正向迭代和方向迭代 ,可以这么写 :
 
[ code lang = "python" ]
# -*- coding: utf-8 -*-
__author__ = 'songhao'
 
 
class FloatRange ( object ) :
     def __init__ ( self , start , end , step ) :
         self . start = start
         self . end = end
         self . step = step
 
     def __iter__ ( self ) :
         """
        实现正向迭代
        :return:
        """
         while self . start <= self . end :
             yield self . start
             self . start += self . step
 
     def __reversed__ ( self ) :
         """
        实现反向迭代
        :return:
        """
         while self . end >= self . start :
             yield self . end
             self . end -= self . step
 
 
if __name__ == '__main__' :
     for x in FloatRange ( 1 , 4 , 1 ) :
         print ( x , "这是正向迭代" )
     print ( "*" * 22 )
     for x in reversed ( FloatRange ( 1 , 4 , 1 ) ) :
         print ( x , "这是反向迭代" )

显示结果是:




  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值