Как массивы и списки работают на python

2.5. Изменение типа массива

Интерпретирует входные данные как массив.
Интерпретирует входные данные как массив, но пропускает подклассы ndarray.
Интерпретирует входные данные как матрицу.
Интерпретирует входные данные как массив типа float.
Интерпретирует входные данные как массив, с организацией в памяти в стиле Fortran.
Интерпретирует входные данные как массив, с организацией в памяти в стиле C.
Интерпретирует входные данные как массив, с предварительной их проверкой на наличие элементов Nan и inf.
Преобразует массив с одним элементом в его скалярный эквивалент.
Интерпретирует входные данные как массив, который соответствует указанному типу и флагам.

Обработка текста в NumPy на примерах

Когда дело доходит до текста, подход несколько меняется. Цифровое представление текста предполагает создание некого , то есть инвентаря всех уникальных слов, которые бы распознавались моделью, а также векторно  (embedding step). Попробуем представить в цифровой форме цитату из стихотворения арабского поэта Антара ибн Шаддада, переведенную на английский язык:

“Have the bards who preceded me left any theme unsung?” 

Перед переводом данного предложения в нужную цифровую форму модель должна будет проанализировать огромное количество текста. Здесь можно обработать небольшой набор данный, после чего использовать его для создания словаря из 71 290 слов.

Предложение может быть разбито на массив токенов, что будут словами или частями слов в зависимости от установленных общих правил:

Затем в данной таблице словаря вместо каждого слова мы ставим его :

Однако данные все еще не обладают достаточным количеством информации о модели как таковой. Поэтому перед передачей последовательности слов в модель токены/слова должны быть заменены их векторными представлениями. В данном случае используется 50-мерное векторное представление Word2vec.

Здесь ясно видно, что у массива NumPy есть несколько размерностей . На практике все выглядит несколько иначе, однако данное визуальное представление более понятно для разъяснения общих принципов работы.

Для лучшей производительности модели глубокого обучения обычно сохраняют первую размерность для пакета. Это происходит из-за того, что тренировка модели происходит быстрее, если несколько примеров проходят тренировку параллельно. Здесь особенно полезным будет . Например, такая модель, как BERT, будет ожидать ввода в форме: .

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

(На заметку: Поэма, строчку из которой мы использовали в примере, увековечила своего автора в веках. Будучи незаконнорожденным сыном главы племени от рабыни, Антара ибн Шаддан мастерски владел языком поэзии. Вокруг исторической фигуры поэта сложились мифы и легенды, а его стихи стали частью классической арабской литературы).

Базовые операции

Математические операции над массивами выполняются поэлементно. Создается новый массив, который заполняется результатами действия оператора.

Для этого, естественно, массивы должны быть одинаковых размеров.

Также можно производить математические операции между массивом и числом. В этом случае к каждому элементу прибавляется (или что вы там делаете) это число.

NumPy также предоставляет множество математических операций для обработки массивов:

Полный список можно посмотреть здесь.

Многие унарные операции, такие как, например, вычисление суммы всех элементов массива, представлены также и в виде методов класса ndarray.

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

1.2. Заполнение данными

Создает массив NumPy.
Преобразует последовательность в массив NumPy.
Преобразует последовательность в массив NumPy, пропуская подклассы ndarray.
Возвращает непрерывный массив в памяти с организацией порядка элементов в С-стиле.
Интерпретирует входные данные как матрицу.
Возвращает копию массива.
Преобразует буфер в одномерный массив.
Создает массив из текстового или двоичного файла.
Создает массив с выполнением указанной функции над каждым элементом.
Создает одномерный массив из итерируемого объекта.
Создает одномерный массив из строки.
Создает массив из данных в текстовом файле.

python — Как создать динамический массив

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

Существуют ли типы, которые динамически увеличивают его емкость как список и сохраняют значение в виде массива NumPy? Что-то вроде List in С#. И это здорово, если тип имеет тот же интерфейс, что и массив NumPy.

Я могу создать класс, который обертывает массив NumPy внутри и изменяет размер массива при его заполнении, например:

но DynamicArray не может использоваться как массив NumPy, и я думаю, что все представления, возвращаемые get_data(), прежде чем np.resize() будет содержать старый массив.

Изменить: тип массива в массиве — это динамический массив. Следующая программа проверяет коэффициент увеличения списка и массива:

из графика: коэффициент увеличения списка больше, чем массив.

Базовая работа со списками

Объявление списка

Объявление списка – самый первый и главный этап его создания. Для объявления списка в Python существует несколько способов.

Вариант №1: Через литерал (выражение, создающее объект):

В данном примере мы создали список с заранее известными данными. Если нужен пустой список, в квадратных скобках ничего не указывается – .

Вариант №2: Через функцию

В этом примере создается пустой список.

Обращение к элементу списка в Python

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

Существует также отрицательный индекс, рассмотрим на примере:

Индексы (позиции в списке) соответственно будут: 0, 1, 2, 3.

Нумерация элементов списка в Python начиная с нуля

Отрицательными индексами называют расположение элементов в списке справа налево, то есть индекс значения «1» будет -4, а отрицательный индекс ‘word’ будет -1.

Отрицательным индексом удобно пользоваться, когда необходимо обратиться к последнему в списке элементу, не высчитывая его номер. Любой конечный элемент будет с индексом, равным -1.

Добавление в список

В списках доступно добавление, изменение, удаление элементов. Рассмотрим каждый способ изменения элементов на примерах.

Для того, чтобы добавить новый элемент в список, используется , где – список, – нужное значение.

Для простого примера, рассмотрим создание списка с нуля с помощью метода

Немаловажно обратить внимание на метод , где – список, – позиция, – нужное значение

Изменение элементов списка

Изменение элементов списка происходит следующим образом: нужно выбрать элемент по индексу (порядковому номеру элемента) и присвоить новое значение.

В примере выше мы заменили 6 на 8.

Не забывайте, что счёт начинается с нуля, и в данном списке цифра 6 это 2-й элемент

Удаление элемента из списка

Для удаление из списка используют инструкцию , где – список, – индекс (позиция) элемента в списке:

Удалять можно как из текущего списка, так и из вложенных списков:

Можно удалять целыми диапазонами:

Еще один способ удаления из списка – , где – список, – значение, которое нужно удалить:

Как проверить наличие элемента в списке

Для того, чтобы проверить существование какого-либо элемента в списке, нужно воспользоваться оператором . Рассмотрим на примере:

Списки в Python можно объединят с помощью оператора или метода . Выглядит это так:

Копирование списка Python

Если вы захотите скопировать список оператором , вы скопируете не сам список, а только его ссылку.

Для копирования списков можно использовать несколько вариантов:

  • – встроенный метод copy (доступен с Python 3.3);
  • – через встроенную функцию ;
  • – функция из пакета copy;
  • – через создание среза (устаревший синтаксис);

Рассмотрим на примере каждый из этих способов:

Важно делает поверхностное копирование. Объекты внутри списка будут скопированы как ссылки на них (как в случае с оператором )

Если необходимо рекурсивно копировать всех элементов в списке, используйте

Скопировать часть списка можно с помощью срезов. Есть несколько вариантов использования:

Цикл по списку

Для перебора списков в Python есть два цикла: и .

Результат выполнения:

Попробуем построить цикл . Он выполняется, когда есть какое-либо определённое условие:

Результат выполнения:

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

2.4.5. Двумерные массивы¶

Выше везде элементами массива были числа. Но на самом деле элементами
массива может быть что угодно, в том числе другие массивы. Пример:

a = 10, 20, 30
b = -1, -2, -3
c = 100, 200
z = a, b, c

Что здесь происходит? Создаются три обычных массива , и
, а потом создается массив , элементами которого являются как
раз массивы , и .

Что теперь получается? Например, — это элемент №1 массива
, т.е. . Но — это тоже массив, поэтому я могу написать
— это то же самое, что , т.е. (не забывайте,
что нумерация элементов массива идет с нуля). Аналогично,
и т.д.

То же самое можно было записать проще:

z = , -1, -2, -3], 100, 200]]

Получилось то, что называется двумерным массивом. Его можно себе еще
представить в виде любой из этих двух табличек:

Первую табличку надо читать так: если у вас написано , то
надо взять строку № и столбец №. Например, —
это элемент на 1 строке и 2 столбце, т.е. -3. Вторую табличку надо
читать так: если у вас написано , то надо взять столбец
№ и строку №. Например, — это элемент на 2
столбце и 1 строке, т.е. -3. Т.е. в первой табличке строка — это первый
индекс массива, а столбец — второй индекс, а во второй табличке
наоборот. (Обычно принято как раз обозначать первый индекс и
— второй.)

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

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

Обратите, кстати, внимание на то, что в нашем примере (массив,
являющийся вторым элементом массива ) короче остальных массивов (и
поэтому на картинках отсутствует элемент в правом нижнем углу). Это
общее правило питона: питон не требует, чтобы внутренние массивы были
одинаковой длины

Вы вполне можете внутренние массивы делать разной
длины, например:

x = , 5, 6], 7, 8, 9], [], 10]]

здесь нулевой массив имеет длину 4, первый длину 2, второй длину 3,
третий длину 0 (т.е. не содержит ни одного элемента), а четвертый длину
1. Такое бывает надо, но не так часто, в простых задачах у вас будут все
подмассивы одной длины.

1.1. Автозаполнение массивов

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

Транспонирование и изменение формы матриц в numpy

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

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

Еще больше размерностей NumPy

NumPy может произвести все вышеперечисленные операции для любого количества размерностей. Структура данных, расположенных центрально, называется , или n-мерным массивом.

В большинстве случаев для указания новой размерности требуется просто добавить запятую к параметрам функции NumPy:

Shell

array(,
,
],

,
,
],

,
,
],

,
,
]])

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

array(1.,1.,

1.,1.,

1.,1.,

1.,1.,

1.,1.,

1.,1.,

1.,1.,

1.,1.,

1.,1.,

1.,1.,

1.,1.,

1.,1.)

Решение задач

1. Создайте список из 10 четных чисел и выведите его с помощью цикла for

2. Создайте список из 5 элементов. Сделайте срез от второго индекса до четвертого

3. Создайте пустой список и добавьте в него 10 случайных чисел и выведите их. В данной задаче нужно использовать функцию randint.

from random import randint

n = randint(1, 10) # Случайное число от 1 до 10

4. Удалите все элементы из списка, созданного в задании 3

5. Создайте список из введенной пользователем строки и удалите из него символы ‘a’, ‘e’, ‘o’

6. Даны два списка, удалите все элементы первого списка из второго

a =

b =
# Вывод
>>>

7. Создайте список из случайных чисел и найдите наибольший элемент в нем.

8. Найдите наименьший элемент в списке из задания 7

9. Найдите сумму элементов списка из задания 7

10.Найдите среднее арифметическое элементов списка из задания 7

Примеры работы с NumPy

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

Математические формулы NumPy

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

Реализовать данную формулу в NumPy довольно легко:

Главное достоинство NumPy в том, что его не заботит, если и содержат одно или тысячи значение (до тех пор, пока они оба одного размера). Рассмотрим пример, последовательно изучив четыре операции в следующей строке кода:

У обоих векторов и по три значения. Это значит, что в данном случае равно трем. После выполнения указанного выше вычитания мы получим значения, которые будут выглядеть следующим образом:

Затем мы можем возвести значения вектора в квадрат:

Теперь мы вычисляем эти значения:

Таким образом мы получаем значение ошибки некого прогноза и за качество модели.

Представление данных NumPy

Задумайтесь о всех тех типах данных, которыми вам понадобится оперировать, создавая различные модели работы (электронные таблицы, изображения, аудио и так далее). Очень многие типы могут быть представлены как n-мерные массивы:

Что такое генератор в Python?

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

а. Синтаксис генератора в
Python 3

Для создания генератора в Python внутри
функции вместо ключевого слова return
используется ключевое слово yield

Обратите
внимание на пример:

def counter():
    i=1
    while(i<=10):
        yield i
        i+=1

В этом примере мы определили генератор
с именем counter() и назначили значение 1
локальной переменной i. Цикл while будет
выполняться, пока i меньше или равно 10.
Внутри цикла мы возвращаем (yield) значение
i и увеличиваем его на единицу.

Затем мы используем этот генератор в
цикле for.

for i in counter():
    print(i)

Вывод:

1 2 3 4 5 6 7 8 9 10

b. Как работает генератор в
Python

Чтобы разобраться в том, как работает
этот код, давайте начнем с цикла for. Этот
цикл выводит каждый элемент генератора
(т. е., каждый элемент, возвращаемый
генератором).

Мы начинаем с i=1. Таким образом, первый
элемент, возвращаемый генератором, это
1. Цикл for выводит этот элемент на экран
благодаря ключевому слову print. Затем i
инкрементируется до 2. Весь процесс
повторяется, пока i не инкрементируется
до 11 (т. е., пока условие в цикле while не
даст false).

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

def even(x):
    while x%2==0:
        yield 'Even'
for i in even(2):
    print(i)

Вывод:

Even Even Even Even Even Even Even Even Even Even Even Even Even

EvenTraceback (самый недавний вызов идет последним):

File “”, line 2, in 
print(i)
KeyboardInterrupt

Поскольку 2 это четное число, 2%2 это
всегда 0. Поэтому условие в цикле while
всегда будет соблюдаться (всегда true). В
результате генератор even() продолжает
возвращать значение Even, пока мы не
прервем выполнение цикла вручную
(сочетанием клавиш Ctrl+C).

Обратите внимание, что генератор может
содержать больше одного ключевого слова
yield. Примерно так же, как функция может
иметь больше одного ключевого слова
return

def my_gen(x):
	while( x> 0):
	    if x%2==0:
			yield 'Even'
		else:
			yield 'Odd'
		x-=1
for i in my_gen(7):
  	print(i)

Вывод:

Odd Even Odd Even Odd Even Odd

2. Возврат значений в список

Здесь все просто. Если вы примените
функцию list() к вызову генератора, она
вернет список возвращенных генератором
значений, в том порядке, в котором они
возвращались. В следующем примере
генератор возвращает квадраты чисел,
если эти квадраты четные.

def even_squares(x):
  for i in range(x):
      if i**2%2==0:
          yield i**2

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

print(list(even_squares(10)))

Вывод:

Как видите, для чисел в диапазоне 0-9
(не 10, потому что диапазон (10) это числа
0-9), четные квадраты это 0, 4, 16, 36 и 64.
Остальные — 1, 9, 25, 49, 81 — нечетные. Поэтому
они не возвращаются генератором.

Python NumPy

NumPy IntroNumPy Getting StartedNumPy Creating ArraysNumPy Array IndexingNumPy Array SlicingNumPy Data TypesNumPy Copy vs ViewNumPy Array ShapeNumPy Array ReshapeNumPy Array IteratingNumPy Array JoinNumPy Array SplitNumPy Array SearchNumPy Array SortNumPy Array FilterNumPy Random
Random Intro
Data Distribution
Random Permutation
Seaborn Module
Normal Distribution
Binomial Distribution
Poisson Distribution
Uniform Distribution
Logistic Distribution
Multinomial Distribution
Exponential Distribution
Chi Square Distribution
Rayleigh Distribution
Pareto Distribution
Zipf Distribution

NumPy ufunc
ufunc Intro
ufunc Create Function
ufunc Simple Arithmetic
ufunc Rounding Decimals
ufunc Logs
ufunc Summations
ufunc Products
ufunc Differences
ufunc Finding LCM
ufunc Finding GCD
ufunc Trigonometric
ufunc Hyperbolic
ufunc Set Operations

Часть I: Коллекции: Списки / массивы

  • В языке Python отсутствует такая структура, как «массив». Для работы с массивами используются списки.
  • Cписки — это изменяемые последовательности в отличие от строк.
  • Представим строку как объект в памяти, в этом случае, когда над строкой выполняются операции конкатенации и повторения, то сама строка не меняется, но в результате выполнения операции в другом месте памяти создается другая строка.Пример:
    Так, например, в Питоне нельзя переприсваивать значение для отдельных символов строки.Программа выдаст ошибку!
s="aaa";
s1="b";
print(s1)

Изменять строку можно только, работая с ней, как с объектом (метод , например):

s1="breKeKeKeKs"; 
s1=s1.replace('Ke','XoXo',2) 
s1 # breXoXoXoXoKeKs

Задания для самопроверки

1. Дан список . Необходимо изменить его, увеличив каждое значение на 7.2.

2. Пользователь
вводит с клавиатуры N значений (строки или числа). На их основе
сформировать список, состоящий из продублированных элементов. (Например, из
значений 1, 5, «abc» формируется список ).

3. Написать
программу сложения двух матриц:

4. Пользователь
вводит N значений в
список. Необходимо проверить: было ли введено число 5.

Видео по теме

Python 3 #1: установка и запуск интерпретатора языка

Python 3 #2: переменные, оператор присваивания, типы данных

Python 3 #3: функции input и print ввода/вывода

Python 3 #4: арифметические операторы: сложение, вычитание, умножение, деление, степень

Python 3 #5: условный оператор if, составные условия с and, or, not

Python 3 #6: операторы циклов while и for, операторы break и continue

Python 3 #7: строки — сравнения, срезы строк, базовые функции str, len, ord, in

Python 3 #8: методы строк — upper, split, join, find, strip, isalpha, isdigit и другие

Python 3 #9: списки list и функции len, min, max, sum, sorted

Python 3 #10: списки — срезы и методы: append, insert, pop, sort, index, count, reverse, clear

Python 3 #11: списки — инструмент list comprehensions, сортировка методом выбора

Python 3 #12: словарь, методы словарей: len, clear, get, setdefault, pop

Python 3 #13: кортежи (tuple) и операции с ними: len, del, count, index

Python 3 #14: функции (def) — объявление и вызов

Python 3 #15: делаем «Сапер», проектирование программ «сверху-вниз»

Python 3 #16: рекурсивные и лямбда-функции, функции с произвольным числом аргументов

Python 3 #17: алгоритм Евклида, принцип тестирования программ

Python 3 #18: области видимости переменных — global, nonlocal

Python 3 #19: множества (set) и операции над ними: вычитание, пересечение, объединение, сравнение

Python 3 #20: итераторы, выражения-генераторы, функции-генераторы, оператор yield

Python 3 #21: функции map, filter, zip

Python 3 #22: сортировка sort() и sorted(), сортировка по ключам

Python 3 #23: обработка исключений: try, except, finally, else

Python 3 #24: файлы — чтение и запись: open, read, write, seek, readline, dump, load, pickle

Python 3 #25: форматирование строк: метод format и F-строки

Python 3 #26: создание и импорт модулей — import, from, as, dir, reload

Python 3 #27: пакеты (package) — создание, импорт, установка (менеджер pip)

Python 3 #28: декораторы функций и замыкания

Python 3 #29: установка и порядок работы в PyCharm

2.4.4. Ввод-вывод массива¶

Как вам считывать массив? Во-первых, если все элементы массива задаются
в одной строке входного файла. Тогда есть два способа. Первый — длинный,
но довольно понятный:

a = input().split()  # считали строку и разбили ее по пробелам
                     # получился уже массив, но питон пока не понимает, что в массиве числа
for i in range(len(a)):
    ai = int(ai])  # прошли по всем элементам массива и превратили их в числа

Второй — покороче, но попахивает магией:

a = list(map(int, input().split()))

Может показаться страшно, но на самом деле
вы уже встречали в конструкции

x, y = map(int, input().split())

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

Какой из этих двух способов использовать для чтения данных из одной
строки — выбирать вам, особой разницы нет.

Обратите внимание, что в обоих способах вам не надо знать заранее,
сколько элементов будет в массиве — получится столько, сколько чисел в
строке. В задачах часто бывает что задается сначала количество
элементов, а потом (обычно на следующей строке) сами элементы

Это
удобно в паскале, c++ и т.п., где нет способа легко считать числа до
конца строки; в питоне вам это не надо, вы легко считываете сразу все
элементы массива до конца строки, поэтому заданное число элементов вы
считываете, но дальше не используете:

n = int(input())  # больше n не используем
a = list(map(int, input().split()))

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

n = int(input())
a = []  # пустой массив, т.е. массив длины 0
for i in range(n):
    a.append(int(input()))  # считали число и сразу добавили в конец массива

Более сложные варианты — последовательность элементов по одному в
строке, заканчивающаяся нулем, или задано количество элементов и сами
элементы в той же строке — придумайте сами, как сделать (можете подумать
сейчас, можете потом, когда попадется в задаче). Вы уже знаете всё, что
для этого надо.

Как выводить массив? Если надо по одному числу в строку, то просто:

for i in range(len(a)):
    print(ai])

Если же надо все числа в одну строку, то есть два способа. Во-первых,
можно команде передать специальный параметр ,
который обозначает «заканчивать вывод пробелом (а не переводом строки)»:

for i in range(len(a)):
    print(ai], end=" ")

Есть другой, более простой способ:

print(*a)
Добавить комментарий

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