# Строки

***

[**Базовые операции**](#bazovye-operacii)\
[**Методы строк**](#metody-strok)\
[**Практика**](#praktika)

***

* Строка в Python — упорядоченная последовательность символов
* Символ — базовые элемент строки: строка из одного элемента

```python
s = "Hello, World!"
print(type(s))
~# <class 'str'>
```

```python
print("I'm a man") # одинарные и двойные кавычки
print("Hello,\nWorld!") # экранированный символ перевода на новую строку
print('''Hello,
World!''')
# тройные кавычки применяется для документирования самописных функций
# и вывода многострочных блоков текста
```

```python
'''
\ - обратный слеш - применяется для экранирования
\n - один символ, а не два
\\ - символ обратного слеша
\' - символ апострофа
\" - символ двойной кавычки
\t - горизонтальная табуляция
r"string\n\1212" - raw-строки, "сырые" строки - мы игнорируем спецсимволы полностью
'''
```

* Преобразование типов

```
Практика:
Запросите у пользователя ввод данных.
Преобразуйте результат во float, int, bool.
Запустите программу. Какие ошибки могут возникнуть?
```

* f-строки — способ форматирования строк

```python
name = "Sergey"
say_hi = "Hi, "
print(f"{say_hi}{name}")
print(f"{say_hi + name}")
print(f"{'Hi, ' + name}")
~# Hi, Sergey
~# Hi, Sergey
~# Hi, Sergey
```

```
Практика:
Напишите программу, которая запрашивает у пользователя
возраст, имя и фамилию.
Результат - строка приветствие, например:
"Меня зовут Владимир Петров, мне 17 лет. Мне нравится изучать Python"
```

* **Кодировки** — способ сообщить компьютеру любой символ
  * **ASCII** — 255 символов: латиница + основные символы
  * **Юникод** — 1 112 064 символа: символы других языков, графические символы и т.д.
  * UTF-8, UTF-16, UTF-32 — разные форматы преобразования Юникода
* Каждому символу соответствует код
* При сравнении строк сравниваются коды символов
* Функции **ord()** и **chr()**

```python
# каждый символ имеет свой код
print(ord("a")) # 97 - возвращает код символа
print(chr(97)) # a - возвращает символ по его коду
```

```
Практика:
Сравните две строки, введенные пользователем. Выведите сообщение
о том, являются ли строки одинаковыми или разными.
Дополнительно*: решите при помощи тернарного оператора
```

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

* Конкатенация строк

```python
a = "H"
b = "i"
print(a + b)
print(a * 3)
print((a + b) * 3)
print(a * 3 + b * 3)
```

* len() — возвращает длину последовательности

```python
len("Hello") # 5
```

* **Доступ по индексу**

```python
s = "Python"
s[0] # P
s[1] # y
s[2] # t
s[3] # h
s[4] # o
s[5] # n 
s[6] # ошибка: IndexError: string index out of range
```

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

```python
a = "Уха"
a[1] = 'р' 
~# TypeError: 'str' object does not support item assignment
b = a[0] + 'p' + a[2]
```

* *Срезы* — используем часть последовательности
* *Строка\[start:stop:step]*

```python
day = 'morning, afternoon, evening'
day[0:7] 
~# morning
day[9:18]
~# afternoon
day[9:]
~# afternoon, evening
day[:7]
~# morning
day[-7:]
~# evening
day[9:-9]
~# afternoon
day[::9] # выбираем шаг среза
~# ma,
~# Результат такой т.к. по умолчанию начало среза 0, а конец len(day)
```

```python
Интерактив:
Что покажет код?
s = 'abcdefg'
print(s[2:5])
print(s[3:])
print(s[:3])
print(s[:])
```

```
Практика:
Пользователь вводит с клавиатуры строку.
Произведите поворот строки и полученный результат выведите на экран.
```

* Оператор in — принадлежит ли подстрока строке

```python
s = 'Python'
sub_s = 'y'
print(sub_s in s)
sub_s = 'yd'
print(sub_s in s)
~# True
~# False
```

```
Практика:
Запросите у пользователя ввод строки и подстроки. Проверьте,
содержит ли введенная строка указанную подстроку, и выведите
соответствующее сообщение.
Дополнительно*: реализуйте при помощи тернарного оператора
```

* **min() max()** — возвращают минимальный/максимальный символ

```python
s = "Python"
print(min(s))
print(max(s))
~# P
~# y
```

```
Практика:
Напишите программу, которая принимает на ввод три строки.
Задача - определить минимальный из всех трёх и максимальный из всех
трех символ. Вывести на экран.
```

* **Обход строки в цикле**

```python
test_word = "abracadabra"
count_a = 0
for char in test_word:
	if char == "a":
		count_a += 1
print(count_a)
```

```python
# Напишите программу, которая считает гласные буквы в слове
word = "Python"
vowels = "aeiouy"
count = 0
for char in word:
	if char in vowels:
		count += 1
print(count)
```

```python
city = 'Москва'
index = 0
while index < 7:
	print(city[index])
	index += 1
# М
# о
# с
# к
# в
# а
# IndexError: string index out of range
```

```python
name = "Julia"
for char in name:
	ch = 'X'
print(name)
~# Julia
```

```python
password = "qwerty123"
for i in range(len(password))
	print(password[i])

```

#### Методы строк

* Методы — функции, применяемые к объекту
* [Документация на русском](https://docs-python.ru/tutorial/operatsii-tekstovymi-strokami-str-python/)
* [Официальная документация](https://docs.python.org/3/library/stdtypes.html#string-methods)

```python
upper() # преобразует все малые буквы в заглавные. исходная строка не меняется
lower() # преобразует все заглавные буквы в малые. исходная строка не меняется
count() # считает количество включений аргумента в объекте,
# вторым аргументом стартовый индекс, третьим конечный индекс (необязательные)
msg = "abracadabra"
msg.count("ra") # 2
msg.count("ra", 4, 11) # 1
msg.find("br") # 1 - возвращает индекс первого вхождения,
# если подстрока не находится возвращает -1
msg.find("br", 2) # 8 - ищет со второго индекса и далее
msg.rfind() # ищет справа налево
msg.index() # работает, как find(), но возвращает ошибку, вместо -1
msg.replace("a", "o") # obrokodobro - заменяет одно на другое, можно
# использовать с ''. Имеет третий необязательный аргумент - количество замен
isalpha() # возвращает True, если строка целиком состоит из буквенных
# символов (пробел - не буква)
isdigit() # возвращает True, если строка целиком состоит из цифровых символов
d = "abc"
d.rjust(5) # '  abc' - добавляет символы-заполнители до нужного кол-ва символов
d.rjust(4, '0') # 0abc - причем символ во втором аргументе только один! иначе traceback
ljust() # то же самое что и rjust, только добавляет справа
split() # разделитель в качестве аргумента, возвращает список
String.strip() # удалит все пробелы по краям и переносы строк
rstrip() # удаляет справа, аргумент - то, что удаляем
lstrip()
```

* Модуль — отдельный файл с кодом, позволяющий использовать свои функции и переменные в другом файле с кодом
* Модуль **string** — строковые константы

```python
import string
# позволяет использовать функции и переменные модуля string в нашей программе
# для этого нужно обратиться к модулю, затем через точку к объекту этого модуля
a = string.ascii_letters
# abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
```

* [Документация на русском](https://docs-python.ru/standart-library/modul-string-python/strokovye-konstanty-modulja-string/)
* [Официальная документация](https://docs.python.org/3/library/string.html?highlight=module%20string#module-string)

#### Практика

```
1. Пользователь вводит с клавиатуры строку и слово для поиска.
Посчитайте, сколько раз в строке встречается искомое слово.
Регистром пренебречь (то есть считать Love и love одинаковыми словами).
Полученное число выведите на экран.

2. Пользователь вводит с клавиатуры строку. Посчитайте количество букв,
цифр в строке. Выведите оба количества на экран
```

```
3. Напишите программу, которая получает строковое значение
содержащее фамилию, имя и отчество человека. В ответ она показывает инициалы.

Пример входных данных:
Петров Иван Николавич
Пример выходных данных:
П.И.Н.

Дополнительно*: реализуйте программу, при которой ввод данных может быть
как маленькими так и большими буквами

Пример входных данных:
петров иван николаевич
Пример выходных данных:
П.И.Н.
```

```
4. Напишите программу, которая меняет исходную строку, заменяя пробелы
на дефисы и делая все символы строчными.
Пример:
Дана строка "I love Python so much". Результатом будет строка
"i-love-python-so-much"
```

```
5. Пользователь вводит слово. Проверьте, является ли оно палиндромом.
Регистр не учитывайте.
```

```
6. Вы сотрудник лаборатории по изучению Марса, которому поручили
вывести на экран концентрацию неизученных пород в образцах грунта. 
Образцы записаны в формате:

"<кодовое обозначение>:<концентрация>"

Кодовое обозначение может содержать любые буквы, цифры и символы,
кроме ":". Концентрация - только цифры и символ "."
Задача - вывести на экран концентрацию, округленную до 2 знаков после запятой. 

Например:
Дан образец "X-DSPAM-Confidence:0.8475" тогда результат должен быть 0.85
"H-UUIISD-tOOOddss:3.889911" - результат 3.89
"Hekko-88jk_42:6.88112" - результат 6.88

Дополнительно*: Образцы вводятся с клавиатуры, причем
вам неизвестно, сколько образцов будет введено. Ввод заканчивается
словом "exit". Программа должна посчитать суммарную концентрацию всех образцов.
Дополнительно**: Реализуйте валидацию данных в соответствии с
требованиями к кодовому обозначению (любые цифры, буквы и символы, кроме ":")
и к концентрации (цифры и символ ".")
```

```
7. Форматирование дат.
Напишите программу, которая считывает от пользователя строковое
значение, содержащее дату в формате дд/мм/гггг. Она должна напечатать
дату в формате 12 марта 2018г.
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://timosii.gitbook.io/py_tutorial/stroki.-spiski/stroki.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
