- PEP 322 – Reverse Iteration
- Motivation
- Proposal
- BDFL Pronouncement
- Alternative Method Names
- Discussion
- Real World Use Cases
- Rejected Alternatives
- Copyright
- BreakingCode
- Красивый Питон — часть 1. Правильные циклы в Python.
- Как не надо писать циклы FOR на Python?
- Цикл по диапазону значений в Python
- Цикл с использованием индексов и значений в Python
- Цикл в обратном порядке в Python
- Похожие посты:
- Итерация списка в Python в обратном направлении
- Используйте функцию reversed() для обхода списка в обратном порядке в Python
- Используйте функцию range() для обхода списка в обратном порядке в Python
- Используйте цикл for для обхода списка в обратном порядке в Python
- Сопутствующая статья — Python List
- Reverse for loop Python
- 1. Using reversed() function
- 2. Reverse loop using negative step
PEP 322 – Reverse Iteration
This proposal is to add a builtin function to support reverse iteration over sequences.
Motivation
For indexable objects, current approaches for reverse iteration are error prone, unnatural, and not especially readable:
for i in xrange(n-1, -1, -1): print seqn[i]
One other current approach involves reversing a list before iterating over it. That technique wastes computer cycles, memory, and lines of code:
rseqn = list(seqn) rseqn.reverse() for value in rseqn: print value
Extended slicing is a third approach that minimizes the code overhead but does nothing for memory efficiency, beauty, or clarity.
Reverse iteration is much less common than forward iteration, but it does arise regularly in practice. See Real World Use Cases below.
Proposal
Add a builtin function called reversed() that makes a reverse iterator over sequence objects that support __getitem__() and __len__().
The above examples then simplify to:
for i in reversed(xrange(n)): print seqn[i]
for elem in reversed(seqn): print elem
The core idea is that the clearest, least error-prone way of specifying reverse iteration is to specify it in a forward direction and then say reversed.
The implementation could be as simple as:
def reversed(x): if hasattr(x, 'keys'): raise ValueError("mappings do not support reverse iteration") i = len(x) while i > 0: i -= 1 yield x[i]
No language syntax changes are needed. The proposal is fully backwards compatible.
A C implementation and unit tests are at: https://bugs.python.org/issue834422
BDFL Pronouncement
This PEP has been conditionally accepted for Py2.4. The condition means that if the function is found to be useless, it can be removed before Py2.4b1.
Alternative Method Names
- reviter – Jeremy Fincher’s suggestion matches use of iter()
- ireverse – uses the itertools naming convention
- inreverse – no one seems to like this one except me
The name reverse is not a candidate because it duplicates the name of the list.reverse() which mutates the underlying list.
Discussion
The case against adoption of the PEP is a desire to keep the number of builtin functions small. This needs to weighed against the simplicity and convenience of having it as builtin instead of being tucked away in some other namespace.
Real World Use Cases
Here are some instances of reverse iteration taken from the standard library and comments on why reverse iteration was necessary:
while _exithandlers: func, targs, kargs = _exithandlers.pop() . . .
testfolders.reverse(); for t in testfolders: do('mh.deletefolder(%s)' % `t`)
list.reverse() for i in list: del self.headers[i]
Rejected Alternatives
Several variants were submitted that attempted to apply reversed() to all iterables by running the iterable to completion, saving the results, and then returning a reverse iterator over the results. While satisfying some notions of full generality, running the input to the end is contrary to the purpose of using iterators in the first place. Also, a small disaster ensues if the underlying iterator is infinite.
Putting the function in another module or attaching it to a type object is not being considered. Like its cousins, zip() and enumerate(), the function needs to be directly accessible in daily programming. Each solves a basic looping problem: lock-step iteration, loop counting, and reverse iteration. Requiring some form of dotted access would interfere with their simplicity, daily utility, and accessibility. They are core looping constructs, independent of any one application domain.
Copyright
This document has been placed in the public domain.
BreakingCode
Красивый Питон — часть 1. Правильные циклы в Python.
Python — замечательный язык. Он прост в изучении для новичков, и в то же время обладает обширными возможностями. При программирование на Python можно лишь наслаждаться аккуратным, минималистичным и красивым кодом. Особенно, если следовать рекомендациям, которые описаны в этой и некоторых других статьях. В посте рассказано про циклы в Python.
Синтаксис Питона достаточно простой, однако когда вы начинаете программировать, то вероятно замечаете, что красота и минималистичность местами куда-то исчезает. Вероятно, это связано с тем, что Python-код позволяет использовать множество идиом — специфичных конструкций кода, не присущих другим языкам.
Как не надо писать циклы FOR на Python?
Для цикла используются многие, в том числе и нижеописанные, конструкции. На самом деле, это даже быстрее, чем в других языках. Кроме того, такой код весьма читаем.
Цикл по диапазону значений в Python
Одним из самых распространенных является цикл перебора некоторого диапазона значений. Что-то типа от 0 до 1000, от 1 до 99 — в общем, какие угодно диапазоны. Хороший способ использовать циклы в Python показан ниже.
#Вот так делать не надо! for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]: #бла-бла #А вот так надо. Это же классно! for i in range(11): #бла-бла
В примере используется функция range(). В нее надо передавать значение, до которого будет идти перебор. При этом само значение включено не будет. В функцию можно передавать начало, конец и даже шаг перебора в качестве аргументов.
Цикл с использованием индексов и значений в Python
Еще одним частым применением циклов является цикл по последовательностям, в которых используются пары «индекс-значение».
#Вот так не нужно делать for i in range(len(array)): #действия с i #действия с array[i] #А так нужно, да и еще и удобно! for i, val in enumerate(array): #действия с i #действия val
Используемая функция enumerate() возвращает кортеж, состоящий из пар «индекс-значение». В примере это i и val. Еще функция умеет смещаться — для этого нужно передать ей индекс, с которого нужно начать перебор.
Цикл в обратном порядке в Python
И последнее, что рассмотрим в этой статье — это цикл по последовательности в обратном порядке. Циклы в Python конечно-же можно строить и с конца последовательности, постепенно приближаясь к ее началу. Только делать это нужно правильно.
#Вот так в обратном порядке последовательность не перебирают for val in range(len(array) - 1, -1, -1): #действия #А вот так перебирают. Оцените удобство! for val in reversed(array) #действия
Функция reversed() просто перебирает последовательность в обратном порядке. Большего о ней рассказать нельзя. Берет последовательность, перебирает с конца, и точка.
На этом все. В статье показаны три общие идиомы для циклов, которые вероятно помогут вам сделать код лаконичнее и читабельней. Согласитесь, это: reversed(array) понять гораздо проще, чем это: range(len(array) -1, -1, -1).
Спасибо Jamal Moir за замечательные советы.
Похожие посты:
Итерация списка в Python в обратном направлении
- Используйте функцию reversed() для обхода списка в обратном порядке в Python
- Используйте функцию range() для обхода списка в обратном порядке в Python
- Используйте цикл for для обхода списка в обратном порядке в Python
В этом руководстве будут рассмотрены различные методы, доступные для обхода списка в обратном порядке в Python.
Используйте функцию reversed() для обхода списка в обратном порядке в Python
Мы можем перемещаться по списку в Python в обратном порядке, используя встроенную функцию reversed() . Функция reversed() возвращает обратную итерацию последовательности, предоставленной в качестве входных данных.
Функция reversed() принимает единственный параметр, который представляет собой обратную последовательность. Последовательность может быть кортежем, строкой, списком, диапазоном и т. Д.
x = ["my", "unlimited", "sadness"] for i in reversed(x): print(i)
Однако, чтобы также получить доступ к исходному индексу последовательности, мы можем дополнительно использовать функцию enumerate() в нашем списке, прежде чем передавать ее в функцию reversed() .
x = ["my", "unlimited", "sadness"] for i, e in reversed(list(enumerate(x))): print(i, e)
2 sadness 1 unlimited 0 my
Следовательно, мы получаем результат с исходным индексом последовательности. Однако стоит отметить, что enumerate() возвращает генератор, и генераторы не могут быть отменены. Поэтому очень важно сначала преобразовать его в список.
Используйте функцию range() для обхода списка в обратном порядке в Python
Другой метод обхода последовательности в обратном порядке в Python — использование доступной функции range .
Функция range , доступная в Python, возвращает последовательность чисел, начиная с 0 по умолчанию, которая автоматически увеличивается на дополнительную 1 (по умолчанию).
Функция range принимает три разных параметра — start (необязательно), stop (обязательно), step (необязательно). Все три параметра принимают на вход целое число.
x = ["my", "unlimited", "sadness"] for i in range(len(x)-1, -1, -1): print(i, x[i])
3 sadness 2 unlimited 1 my
Следовательно, как показано выше, мы можем пройти последовательность в обратном порядке с исходным индексом последовательности.
Используйте цикл for для обхода списка в обратном порядке в Python
Мы можем перемещаться по списку в обратном порядке в Python, используя цикл for . Он выполняет итерацию по последовательности, которая может быть списком, кортежем, строкой и т. Д.
Мы можем использовать его для просмотра списка в обратном порядке, как показано ниже.
x = ["my", "unlimited", "sadness"] for item in x[::-1]: print(item)
Обратите внимание, что [::-1] в приведенном выше коде только нарезает список в обратном порядке только для цикла. Следовательно, он не изменяет и не модифицирует массив данных или список, предоставляемый постоянно.
Сопутствующая статья — Python List
Copyright © 2023. All right reserved
Reverse for loop Python
In this tutorial, you will learn how to use for loop in reverse order in Python.
In python, for loop is used to iterate over a sequence (list, tuple, string) or other iterable objects. By default, the for loop iterates over the sequence in ascending order. Means it starts from the first element and ends at the last element.
However, you can also iterate over a sequence in reverse order. Starting from the last element and ending at the first element.
There can be multiple different approaches to iterate over a sequence in reverse order. Let’s see them one by one.
1. Using reversed() function
The reversed() function returns a reverse iterator which can be used to iterate over a sequence in reverse order.
Here is an example of how to use reversed() function in for loop.
my_list = [1, 2, 3, 4, 5] # Iterate over the elements of the list in reverse order for element in reversed(my_list): print(element)
Here, we have created a list of numbers. Then we used reversed() function to iterate over the elements of the list in reverse order.
Note the original list is not modified by the reversed() function.
2. Reverse loop using negative step
Another way to create a reverse loop in Python is to use the built-in range() function with a negative step value.
For example range(5, 0, -1) will return a list of numbers from 5 to 1 in reverse order.
# reverse for loop for i in range(5, 0, -1): print(i)
Here, the range() function starts at 5 and ends at 1. The step value is -1. So, effectively it iterates over the sequence in reverse order.
Another way of reversing the loop with a negative step is by using the len() function within the range() function as follows.
my_list = [1, 2, 3, 4, 5] # Iterate over the elements of the list in reverse order for i in range(len(my_list)-1, -1, -1): print(my_list[i])
Here, we have used len() function to get the length of the list. Then we used the length of the list as the starting point of the range() function. The step value is -1. So, effectively it iterates over the sequence in reverse order.
This is all about for loop in reverse order in python. Hope you have learned something new today.