Функция range в Python

введите сюда описание изображениявведите сюда описание изображенияПодскажите, пожалуйста, как списки связаны с функцией range? Неясно написанное:"По умолчанию функция range создает последовательность чисел, которая увеличивается на 1 для каждого последующего числа в списке" (см. скрин). И на втором скриншоте смутила запись "второй аргумент (10) — это конечный предел списка. "


Ответы (1 шт):

Автор решения: MarianD

Предисловие:

Учитель ученику: «Напиши все числа от 1 до 100!»

  • Никакой труд для учителя произнести это — он употребил только 2 числа,
  • но большой труд для ученика — он должен написать 100 чисел.

Чтобы понят смысл существования объектов типа range и что это за объект, пусть нам нужен огромный список всех четных чисел от 10 до 10 миллионов.

Да, вы можете эго задать как

lst = [10, 12, 14, 16, 18, 20, ..., 10_000_000]

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

  • range(10, 10_000_001, 2) намного короче.

  • range(10, 10_000_001, 2) не список, он не занимает в памяти почти 5 миллионов ячеек (см. дальше).

  • range(10, 10_000_001, 2) только рецепт, как получить одно единственное число — сначала первое (10), затем второе (12) за тем третье (14), и т.д., опять экономя памятью.

  • range(10, 10_000_001, 2) знает, когда уже не выдавать дальнейшее число (после числа
    10 миллионов, т.е. перед достижением предела).
    Вы бы могли в качестве предела использовать даже число 10_000_002 и ничего бы не изменилось.

Ну а теперь возникает вопрос — как заставить объект типа range() чтобы эго рецепт начал работать, т.е. постепенно выдавать дальнейшее и дальнейшее число?

  1. Использовать его как параметр стандартной функции (конструктора) list() или tuple().
    Тогда он (объект типа range) с огромной скоростью сделает за вас то, что бы вы должна была сделать вручную, как я намекнул в начале этого ответа:

    lst = list(range(10, 10_000_001, 2))        # [10, 12, ..., 10_000_000]
    

    или

    tpl = tuple(range(10, 10_000_001, 2))       # (10, 12, ..., 10_000_000)
    

    Но для такого огромного количества чисел это неразумно — таким образом бы вы потеряли главное преимущество объекта типа rangе, т.е. экономностью памятью.

  2. Применить его в цикле for:

    for i in range(10, 10_000_001, 2):  
    

    В памяти будет всегда только одно число — текущее значение переменной i.

→ Ссылка