Перейти к содержимому

Как заменить range в питоне

  • автор:

Alternate for range in python

If I have to generate natural numbers, I can use ‘range’ as follows:

Is there any way to achieve this without using range function or looping?

Flying Dutchmann's user avatar

4 Answers 4

You could use recursion to print first n natural numbers

Nihal Rp's user avatar

Based on Nihal’s solution, but returns a list instead:

Looping will be required in some form or another to generate a list of numbers, whether you do it yourself, use library functions, or use recursive methods.

If you’re not opposed to looping in principle (but just don’t want to implement it yourself), there are many practical and esoteric ways to do it (a number have been mentioned here already).

A similar question was posted here: How to fill a list. Although it has interesting solutions, they’re all still looping, or using range type functions.

Функция enumerate

В Python есть еще одна встроенная функция, которая часто используется в заголовке for . Это функция enumerate() . Если range() позволяет получить только индексы элементов списка, то enumerate() – сразу индекс элемента и его значение.

Функция enumerate() применяется для так называемых итерируемых объектов (список относится к таковым) и создает объект-генератор, который генерирует кортежи, состоящие из двух элементов – индекса элемента и самого элемента.

Эти кортежи можно распаковывать, то есть извлекать индекс и значение, в теле цикла:

Однако чаще это делают еще в заголовке for , используя две переменные перед in :

Функция enumerate используется для упрощения прохода по коллекциям в цикле, когда кроме самих элементов требуется их индекс:

В данном случае на каждой итерации цикла из объекта, полученного от вызова функции enumerate , извлекается очередной кортеж. Этот кортеж состоит из индекса очередного элемента списка и значения этого элемента. Элементы кортежа связываются с идентификаторами id и item .

Без использования enumerate в цикл пришлось бы вводить переменную-счетчик:

Или извлекать элементы по индексу:

Другими словами, без функции enumerate можно обойтись. Однако в ряде случаев она может быть удобней.

Если enumerate() так хороша, зачем использовать range() в заголовке for ? На самом деле незачем, если только вам так не проще. Кроме того, бывают ситуации, когда значения не нужны, нужны только индексы. Однако следует учитывать один нюанс. Функция enumerate() возвращает так называемый объект-итератор. Когда такие объекты сгенерировали значения, то становятся «пустыми». Второй раз по ним пройтись нельзя.

Функция range() возвращает итерируемый объект. Хотя такой объект может быть превращен в объект-итератор, сам по себе таковым не является.

Когда range() и enumerate() используются в заголовке for , то разницы нет, так как range- и enumerate-объекты не присваиваются переменным и после завершения работы цикла теряются. Но если мы присваиваем эти объекты переменным, их отличия могут сказаться на выполнении программы:

Сначала мы прерываем извлечение элементов из объектов на элементе с индексом 1. Когда снова прогоняем объекты через цикл for , то в случае r_obj обход начинается сначала, а в случае e_obj продолжается после места останова. Объект e_obj уже не содержит извлеченных ранее элементов.

Практическая работа

Дан список чисел. Используя функцию enumerate() в заголовке цикла for , создайте второй список, в котором каждый элемент должен быть строкой, включающей через пробел индекс и значение соответствующего элемента первого списка.

Питонистический подход к циклам for: range() и enumerate()

Автор заметки, перевод которой мы сегодня публикуем, хочет рассказать о некоторых особенностях использования циклов for в Python.

Цикл for — это один из краеугольных камней программирования. С этими циклами будущие программисты знакомятся в самом начале учёбы и, после первого знакомства, пользуются ими постоянно.

Если вы занялись разработкой на Python, имея опыт работы с другим популярным языком программирования, вроде PHP или JavaScript, то вам знакома методика применения переменной-счётчика, хранящей, например, индекс текущего элемента массива, обрабатываемого в цикле. Вот пример работы с циклом, написанный на JavaScript:

Работая с циклами for очень важно понимать то, что эти циклы не перебирают массивы. Они лишь дают программисту механизм для работы с переменной-счётчиком, которая используется для обращения к элементам обрабатываемых массивов.

В предыдущем примере переменная i не имеет какого-то явного отношения к массиву scores . Она всего лишь хранит некое число, которое увеличивается на 1 в каждой итерации цикла, и которое, как оказывается, подходит для последовательного обращения к элементам массива по их индексам.

Старый (неудачный) способ работы с массивами

В Python нет традиционных циклов for , подобных тому, что показан выше. Правда, если вы похожи на меня, то первым вашим желанием при освоении Python станет поиск способа создания цикла, с которым вам привычно и удобно работать.

В результате вы можете обнаружить функцию range() и написать на Python нечто подобное следующему:

Проблема этого цикла заключается в том, что он не очень хорошо соответствует идеологии Python. В нём мы не перебираем список, а, вместо этого, используем вспомогательную переменную i для обращения к элементам списка.

На самом деле, даже в JavaScript существуют методы, позволяющие перебирать массивы, так сказать, без посредников. Речь идёт о циклах forEach и for of .

Использование функции enumerate()

Если вам нужно адекватным образом отслеживать «индекс элемента» в for -цикле Python, то для этого может подойти функция enumerate() , которая позволяет «пересчитать» итерируемый объект. Её можно использовать не только для обработки списков, но и для работы с другими типами данных — со строками, кортежами, словарями.

Эта функция принимает два аргумента: итерируемый объект и необязательное начальное значение счётчика.

Если начальное значение счётчика enumerate() не передаётся — оно, по умолчанию, устанавливается в 0 . Функция создаёт объект, генерирующий кортежи, состоящие из индекса элемента и самого этого элемента.

Такой код получился гораздо чище кода из предыдущего примера. Мы ушли от работы со списком индексов, мы перебираем сами значения, получая к ним прямой доступ в цикле for, и видим значения, с которыми работаем, в объявлении цикла.

Вот одна приятная возможность, которая понравится тем, кому нужно выводить нумерованные списки так, чтобы номер первого элемента был бы не 0 , в соответствии с его индексом, а 1 . Обычно для того, чтобы это сделать, приходится менять выводимый номер элемента. Например — так: i + 1 . При использовании же функции enumerate() достаточно передать ей, в качестве второго аргумента, то число, с которого нужно начинать нумерацию. В нашем случае — 1 :

Итоги

Надеюсь, этот небольшой рассказ о циклах for в Python позволил вам узнать что-то новое об этом языке.

Уважаемые читатели! Знаете ли вы ещё какие-нибудь способы применения функции enumerate() ? Кажутся ли вам циклы, построенные с использованием enumerate() , более читабельными, чем циклы, созданные с использованием range(len()) ?

Как заменить range в питоне

If I have to generate natural numbers, I can use ‘range’ as follows:

Is there any way to achieve this without using range function or looping?

Flying Dutchmann's user avatar

4 Answers 4

You could use recursion to print first n natural numbers

Nihal Rp's user avatar

Based on Nihal’s solution, but returns a list instead:

Looping will be required in some form or another to generate a list of numbers, whether you do it yourself, use library functions, or use recursive methods.

If you’re not opposed to looping in principle (but just don’t want to implement it yourself), there are many practical and esoteric ways to do it (a number have been mentioned here already).

A similar question was posted here: How to fill a list. Although it has interesting solutions, they’re all still looping, or using range type functions.

Питонистический подход к циклам for: range() и enumerate()

Автор заметки, перевод которой мы сегодня публикуем, хочет рассказать о некоторых особенностях использования циклов for в Python.

Цикл for — это один из краеугольных камней программирования. С этими циклами будущие программисты знакомятся в самом начале учёбы и, после первого знакомства, пользуются ими постоянно.

Если вы занялись разработкой на Python, имея опыт работы с другим популярным языком программирования, вроде PHP или JavaScript, то вам знакома методика применения переменной-счётчика, хранящей, например, индекс текущего элемента массива, обрабатываемого в цикле. Вот пример работы с циклом, написанный на JavaScript:

Работая с циклами for очень важно понимать то, что эти циклы не перебирают массивы. Они лишь дают программисту механизм для работы с переменной-счётчиком, которая используется для обращения к элементам обрабатываемых массивов.

В предыдущем примере переменная i не имеет какого-то явного отношения к массиву scores . Она всего лишь хранит некое число, которое увеличивается на 1 в каждой итерации цикла, и которое, как оказывается, подходит для последовательного обращения к элементам массива по их индексам.

Старый (неудачный) способ работы с массивами

В Python нет традиционных циклов for , подобных тому, что показан выше. Правда, если вы похожи на меня, то первым вашим желанием при освоении Python станет поиск способа создания цикла, с которым вам привычно и удобно работать.

В результате вы можете обнаружить функцию range() и написать на Python нечто подобное следующему:

Проблема этого цикла заключается в том, что он не очень хорошо соответствует идеологии Python. В нём мы не перебираем список, а, вместо этого, используем вспомогательную переменную i для обращения к элементам списка.

На самом деле, даже в JavaScript существуют методы, позволяющие перебирать массивы, так сказать, без посредников. Речь идёт о циклах forEach и for of .

Использование функции enumerate()

Если вам нужно адекватным образом отслеживать «индекс элемента» в for -цикле Python, то для этого может подойти функция enumerate() , которая позволяет «пересчитать» итерируемый объект. Её можно использовать не только для обработки списков, но и для работы с другими типами данных — со строками, кортежами, словарями.

Эта функция принимает два аргумента: итерируемый объект и необязательное начальное значение счётчика.

Если начальное значение счётчика enumerate() не передаётся — оно, по умолчанию, устанавливается в 0 . Функция создаёт объект, генерирующий кортежи, состоящие из индекса элемента и самого этого элемента.

Такой код получился гораздо чище кода из предыдущего примера. Мы ушли от работы со списком индексов, мы перебираем сами значения, получая к ним прямой доступ в цикле for, и видим значения, с которыми работаем, в объявлении цикла.

Вот одна приятная возможность, которая понравится тем, кому нужно выводить нумерованные списки так, чтобы номер первого элемента был бы не 0 , в соответствии с его индексом, а 1 . Обычно для того, чтобы это сделать, приходится менять выводимый номер элемента. Например — так: i + 1 . При использовании же функции enumerate() достаточно передать ей, в качестве второго аргумента, то число, с которого нужно начинать нумерацию. В нашем случае — 1 :

Итоги

Надеюсь, этот небольшой рассказ о циклах for в Python позволил вам узнать что-то новое об этом языке.

Уважаемые читатели! Знаете ли вы ещё какие-нибудь способы применения функции enumerate() ? Кажутся ли вам циклы, построенные с использованием enumerate() , более читабельными, чем циклы, созданные с использованием range(len()) ?

Встроенные функции Python: какие нужно знать и на какие не стоит тратить время

В Python существуют десятки встроенных функций и классов, сотни инструментов, входящих в стандартную библиотеку Python, и тысячи сторонних библиотек на PyPI. Держать всё в голове начинающему программисту нереально. В статье расскажем про стандартные встроенные функции Python: какие используются часто, а какие вам, вероятно, не пригодятся никогда.

Чтобы разобраться, на какие функции стоит обратить внимание, их следует разделить на группы:

  • общеизвестные: почти все новички используют эти функции и довольно часто;
  • неочевидные для новичков: об этих функциях полезно знать, но их легко пропустить, когда вы новичок в Python;
  • понадобятся позже: об этих встроенных функциях полезно помнить, чтобы найти их потом, когда/если они понадобятся;
  • можно изучить когда-нибудь: это может пригодиться, но только при определённых обстоятельствах;
  • скорее всего, они вам не нужны: они вряд ли понадобятся, если вы не занимаетесь чем-то достаточно специализированным.

Встроенные функции в первых двух категориях являются основными. Они в конечном итоге будут нужны почти всем начинающим программистам на Python. Встроенные модули в следующих двух категориях являются специализированными, но потребности в них будут варьироваться в зависимости от вашей специализации. Категория 5 — это скрытые встроенные функции. Они очень полезны, когда в них есть необходимость, но многим программистам Python они, вероятно, никогда не понадобятся.

Общеизвестные функции

Если вы уже писали код на Python, эти модули должны быть вам знакомы.

print

Вряд ли найдётся разработчик, даже начинающий, который не знает эту функцию вывода. Как минимум реализация «Hello, World!» требует использования данного метода. Но вы можете не знать о различных аргументах, которые можно передавать в print .

В Python нет синтаксиса вроде my_list.length() или my_string.length , вместо этого используются поначалу непривычные конструкции len(my_list) и len(my_string) .

Нравится вам такая реализация или нет, другой альтернативы не предусмотрено, поэтому к ней нужно привыкнуть.

К сожалению, в отличие от многих других языков программирования, в Python нельзя объединять строки и числа.

Python отказывается приводить целое число 3 к типу строка, поэтому нужно сделать это самостоятельно, используя встроенную функцию str (технически это класс, но с целью уменьшить количество ненужной информации будем принимать все методы за функции).

Если нужно пользовательский ввод преобразовать в integer , эта функция незаменима. Она может преобразовывать строки в целые числа.

Эту функцию также можно использовать для отсечения дробной части у числа с плавающей точкой.

Обратите внимание, если нужно обрезать дробную часть при делении, оператор « // » более уместен (с отрицательными числами это работает иначе).

float

Если строка, которую надо конвертировать в число, не является целым числом, здесь поможет метод float .

Float также можно использовать для преобразования целых чисел в числа с плавающей запятой.

В Python 2 такое преобразование необходимо, но в Python 3 целочисленное деление больше не является чем-то особенным (если вы специально не используете оператор « // »). Поэтому больше не нужно использовать float для этой цели, теперь float(x)/y можно легко заменить на x/y .

Эта функция может очень облегчить задачу, если вы хотите составить список из итераций цикла.

При работе со списком метод copy позволяет создать его копию.

Если вы не знаете, с какими элементами работаете, функция list является более общим способом перебора элементов и их копирования.

Также можно использовать списковое включение, но делать это не рекомендуется.

Обратите внимание, когда вы хотите создать пустой список, следует использовать буквальный синтаксис списка (« [ ] »).

Использование « [ ] » считается более идиоматическим, так как эти скобки на самом деле выглядят как список Python.

tuple

Эта функция во многом похожа на функцию list , за исключением того, что вместо списков она создает кортежи.

Если вы пытаетесь создать хешируемую коллекцию (например, ключ словаря), стоит отдать предпочтению кортежу вместо списка.

Эта функция создаёт новый словарь.

Подобно спискам и кортежам, dict эквивалентна проходу по массиву пар «ключ-значение» и созданию из них словаря.

Дан список кортежей, по два элемента в каждом.

Выведем его на экран с помощью цикла.

То же самое, но с использованием dict .

Функция dict может принимать 2 типа аргументов:

  • другой словарь: в этом случае этот словарь будет скопирован;
  • список кортежей «ключ-значение»: в этом случае из этих слов будет создан новый словарь.

Поэтому следующий код также будет работать.

Функция dict также может принимать ключевые слова в качестве аргументов для создания словаря со строковыми ключами.

Но рекомендуется всё же использовать литералы вместо ключевых слов.

Такой синтаксис более гибок и немного быстрее. Но самое главное он более чётко передаёт факт того, что вы создаёте именно словарь.

Как в случае со списком и кортежем, пустой словарь следует создавать с использованием буквального синтаксиса (« »).

Использование « » более идиоматично и эффективно с точки зрения использования процессора. Обычно для создания словарей используются фигурные скобки, dict встречается гораздо реже.

Функция set создаёт новый набор. Она принимает итерации из хешируемых значений (строк, чисел или других неизменяемых типов) и возвращает set .

Создать пустой набор с « » нельзя (фигурные скобки создают пустой словарь). Поэтому функция set — лучший способ создать пустой набор.

Можно использовать и другой синтаксис.

Такой способ имеет недостаток — он сбивает с толку (он основан на редко используемой функции оператора * ), поэтому он не рекомендуется.

Перестаньте использовать range() в цикле for в Python

Python

Цикл for . Краеугольный камень программирования. Технологический приём, который вы осваиваете, ещё будучи новичком, и продолжаете использовать в течение всей своей карьеры программиста.

Если вы использовали другие популярные языка, например PHP или JavaScript, вы знакомы с использованием переменной для отслеживания текущего индекса.

Важно понимать, что эти циклы for фактически не выполняют итерацию по массиву. Они перебирают выражение, которое служит посредником для ссылки на каждое значение массива.

В примере выше i не имеет явного отношения к scores , просто оно совпадает с каждым необходимым значением индекса.

Старый (плохой) способ

В Python традиционный цикл for в показанном выше виде не существует. Однако, почему бы не адаптировать любимый способ под язык?

В результате быстро обнаруживается функция range() и получается подобный код:

Проблема с этим циклом for состоит в том, что он не очень в стиле Python. То есть мы не перебираем список, а используем i в качестве предварительного индекса.

На самом деле даже в JavaScript существуют методы прямого перебора массива ( forEach() и for…of ).

Использование функции enumerate()

Если вы хотите правильно отслеживать “значение индекса” в цикле for в Python, используйте функцию enumerate() , которая “считает” итерируемое. Её можно использовать для других типов данных: строк, кортежей и словарей.

Функция принимает два аргумента: итерируемое и необязательный аргумент начала отсчёта.

Если начало отсчёта не задано, по умолчанию оно будет 0 . Затем функция будет возвращать кортежи с текущим порядковым номером и соответствующим значением итерируемого.

Этот код намного чище! Мы избегаем работы со списками индексов, перебираем фактические значения и явно видим каждое значение в определении цикла for .

В качестве бонуса: обычно, если нужно напечатать нумерованный список, приходится добавлять i + 1 из-за того, что первый индекс 0 . Просто передайте значение 1 в enumerate() и наслаждайтесь магией!

Надеюсь, статья была вам полезна. Другие полезные рекомендации вы можете найти в моей статье 4 простых способа рефакторинга кода.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *