# 3. Перечисляемые типы данных, циклы.


## Изменяемые и неизменяемые типы данных

Как мы уже обсуждали, существуют изменяемые (**mutable**) и неизменяемые (**immutable**) типы данных.

Ранее рассматривался целочисленный тип данных, который, зачастую, является неизменяемым. Так же неизменяемыми могут являться типы данных **tuple** (кортеж) и **string** (строка).

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

## Строки

###Создание строк, кавычки

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

![](https://study.com/cimages/multimages/16/java_string_object.png)

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


## Массивы, списки, кортежи

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

Массив может быть **гомогенным**, т.е. содержащим данные только одного типа, и **гетерогенным**, т.е. содержащим разнотиповые данные. 

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

В зависимости от размерности массива различают **одномерные и многомерные** массивы.

![](http://images.myshared.ru/4/222475/slide_4.jpg)

![](http://study-java.ru/wp-content/uploads/2014/03/array.png)

Также массивы могут быть изменяемыми, т.е. **мутабельными**, и неизменяемыми, т.е. **иммутабельными**.

### Операции с массивами

Создаются массивы при помощи:

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

Помимо создания массивов, классическими операцими с массивами являются:

- добавление элементов в начало, конец или любое место массива (если он мутабелен)
- взятие элемента по индексу
- взятие подмассива
- удаление элемента или подмассива
- сортировки различных видов

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


![](https://o7planning.org/en/11437/cache/images/i/7722025.png)


### Циклы

Важнейшим элементов многих ЯП являются циклы.

Для их понимания важны следующие термины:

**Тело цикла** - действия, которые выполняются в рамках цикла. Обычно заключены в фигурные скобки или их аналоги и расположены ниже и со сдвигом, в случае цикла с постусловием - выше и со сдвигом.
**Итерация** - один проход тела цикла.

Распространены следующие варианты циклов:

1. Цикл с предусловием. Чаще всего это **while**. Как правило, такой цикл проверяет условие, и если оно истинно, выполняет ряд действий, находящихся в теле цикла. Затем снова проверяет условие, выполняет те же действия, и так до тех пор, пока условие не станет ложно.

2. Цикл с постусловием - встречается и используется несколько реже.  Чаще всего называется **do while** Очень похож на первый вариант, но всегда выполняет одн итерацию цикла до проверки условия. Проще говоря, сначала делает все действия один раз, потом проверяет условие, и выполняет эти действия снова и снова, пока условие истинно. Если эе условие изначально ложно, цикл с постусловием сработает один раз, тогда как цикл с предусловием - ни разу.

3. Цикл со счетчиком. Чаще всего это **for**. Исользуется для того, чтобы повторить некоторый набор действий - тело цикла - определенное количество раз. Как правило, в самом заголовке цикла определяется переменная, условия ее изменения и условие проверки, не достигла ли эта переменная граничного значения, когда цил должен прекратить выполняться.

4. Цикл перебора. Варианты названий: **for, foreach, each**. Служит для того, чтобы поэлементно работать с массивами или другими перечисляемыми типами данных.
  

## Домашка

[Домашнее задание](hw3.md)

![](http://qaru.site/img/4c47ac86e81a82b9a90c255e9bf45ff5.png)

https://tproger.ru/translations/python-data-types/
