官术网_书友最值得收藏!

Using reversed() to change the order

There are times when we need a sequence reversed. Python offers us two approaches to this: the reversed() function, and slices with reversed indices.

For example, consider performing a base conversion to hexadecimal or binary. The following code is a simple conversion function:

def digits(x: int, b: int) -> Iterator[int]:
if x == 0: return yield x % b for d in digits(x//b, b): yield d

This function uses a recursion to yield the digits from the least significant to the most significant. The value of x%b will be the least significant digits of x in the base b.

We can formalize it as follows:

In many cases, we'd prefer the digits to be yielded in the reverse order. We can wrap this function with the reversed() function to swap the order of the digits:

def to_base(x: int, b: int) -> Iterator[int]:
return reversed(tuple(digits(x, b)))
The reversed() function produces an iterable, but the argument value must be a sequence object. The function then yields the items from that object in the reverse order.

We can do a similar kind of thing with a slice, such as tuple(digits(x, b))[::-1]. The slice, however, is not an iterator. A slice is a materialized object built from another materialized object. In this case, for such small collections of values, the distinction is minor. As the reversed() function uses less memory, it can be advantageous for larger collections.

主站蜘蛛池模板: 阳朔县| 闸北区| 额尔古纳市| 桐庐县| 沽源县| 安丘市| 新田县| 湖北省| 宁南县| 当阳市| 百色市| 泾川县| 永昌县| 高雄县| 庄浪县| 宜兰县| 类乌齐县| 广西| 新营市| 泾阳县| 隆昌县| 云浮市| 定日县| 武功县| 永登县| 松潘县| 汝阳县| 宜城市| 铜陵市| 景东| 始兴县| 呼玛县| 泸州市| 太仆寺旗| 河北区| 钟山县| 廊坊市| 铜鼓县| 亚东县| 平昌县| 彭阳县|