实际案例
实现一个连续浮点数发生器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__()返回一个迭代器对象,这样我们不就可以实现正向迭代吗?
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 可以解决反向迭代的问题?
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
,
"这是反向迭代"
)
|
显示结果是: