Skip to content

Commit c328778

Browse files
authored
Add reverse_range() (#615)
1 parent 7f54af4 commit c328778

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

python-range/README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,22 @@
22

33
This repository holds the code for Real Python's [Python `range()`: Represent Numerical Ranges](https://realpython.com/python-range/) tutorial.
44

5+
## reverse_range()
6+
7+
In [`reverse_range.py`](reverse_range.py), you can find an explicit implementation of a function that can reverse a general range.
8+
9+
```python
10+
>>> from reverse_range import reverse_range
11+
12+
>>> reverse_range(range(1, 20, 4))
13+
range(17, 0, -4)
14+
15+
>>> list(reverse_range(range(1, 20, 4)))
16+
[17, 13, 9, 5, 1]
17+
```
18+
19+
In practical applications, you should use `reversed(range(1, 20, 4))` or `range(1, 20, 4)[::-1]` instead.
20+
521
## PiDigits
622

723
The file [`pi_digits.py`](pi_digits.py) shows the implementation of `PiDigits` which is an integer-like type that can be used as arguments to `range()`:

python-range/reverse_range.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
def reverse_range(rng):
2+
"""Explicitly calculate necessary parameters to reverse a general range.
3+
4+
In practice, you should use reversed() or [::-1] instead.
5+
"""
6+
adj = 1 if rng.step > 0 else -1
7+
return range(
8+
(rng.stop - adj) - (rng.stop - rng.start - adj) % rng.step,
9+
rng.start - adj,
10+
-rng.step,
11+
)
12+
13+
14+
if __name__ == "__main__":
15+
numbers = range(1, 20, 4)
16+
17+
print("\nOriginal:")
18+
print(numbers)
19+
print(list(numbers))
20+
21+
print("\nReversed:")
22+
print(reverse_range(numbers))
23+
print(list(reverse_range(numbers)))
24+
25+
print("\nTwice reversed, has the same elements as the original:")
26+
print(reverse_range(reverse_range(numbers)))
27+
print(list(reverse_range(reverse_range(numbers))))

0 commit comments

Comments
 (0)