Возвести в квадрат все числа в списке

Хочу изменить все числы в списке на квадратичную форму, написал код, но выдает ошибку. Как можно решить?

numbers = list(range(1,11))
for number in numbers:
    number = number **2
    print(numbers)

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

Автор решения: Павел

Проблем в коде две:

  1. Выводить содержимое списка print(numbers) стоит после завершения цикла for
  2. Строка number = number **2 не меняет содержимое списка, а просто создает новую переменную с именем number, которая не имеет со списком ничего общего.

Для изменения списка следует воспользоваться присваиванием по индексу (a[i] = ...), методами .append(), .insert(), .remove(), ....

Вообще, такое преобразование делается при помощи генератора списков в одну строку:

a = [1,2,3]

b = [x ** 2 for x in a]

print(b) # [1,4,9]
→ Ссылка
Автор решения: Vladimir Bogdanov

Несколько вариантов:

  1. Чуть иной вариант от Павла:

    numbers = list(range(1,11))
    square_numbers = [x * x for x in numbers]
    print(square_numbers) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    

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

  1. Немного меняем код - квадратные скобки заменим на круглые.

    gen_result = (x * x for x in numbers)
    square_numbers = list(gen_result)
    print(square_numbers)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    

Получим выражение-генератор, элементы которого вычисляются в момент обращения к ним. Полученное выражение-генератор можно перебрать в цикле for или вызывая метод next. При этом решается проблема генератора списков из предыдущего пункта - расход памяти. Но есть одно НО: выражение-генератор можно перебрать только один раз. В приведенном примере кода выражение-генератор преобразуется в список (но можно в кортеж, множество или словарь), что вызывает автоматический перебор элементов.

  1. Наконец вариант с применением функции map.

    square_function = lambda x: x * x
    gen_result = map(square_function, numbers)
    square_numbers = list(gen_result)
    print(square_numbers)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    

Или более кратко:

square_numbers = list(map(lambda x: x * x, numbers))
print(square_numbers)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Функция map возвращает объект-итератор, похожий на выражение-генератор из пункта 2. Мощь функции map в том, что к списку поэлементно можно применить практически любую функцию, в том числе и самописную, и выполнить над списком практически любые вычисления. Кстати, можно обработать сразу несколько списков. Для примера, применим стандартную функцию возведения в степень (можно применить аналогичные функции из библиотек numpy или math):

square_numbers = list(map(pow, numbers, [2 for _ in numbers]))
print(square_numbers)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  1. На последок, если стоит задача заменить элементы исходного списка без создания нового (для экономии памяти):

    numbers = list(range(1,11))
    numbers[:] = list(map(lambda x: x * x, numbers))
    

Либо сразу:

numbers = list(map(lambda x: x * x, range(1,11)))

Или так:

numbers = list(x * x for x in range(1,11))
→ Ссылка