Рядкові величини

Рядки
Ми вже розглядали рядки як простий тип даних поряд з цілими і дійсними числами і знаємо, що рядок - це послідовність символів, укладених в одинарні або подвійні лапки.

В Python немає символьного типу, типу даних, об'єктами якого є поодинокі символи. Однак мова дозволяє розглядати рядки як об'єкти, що складаються з підрядків довжиною в один і більше символів. При цьому, на відміну від списків, рядки не прийнято відносити до структур даних. Мабуть тому, що структури даних складаються з більш простих типів даних, а для рядків в Python немає більш простого (символьного) типу.

Нумерація символів у рядку
Кожний символ у рядку має унікальний порядковий номер — індекс. Нумерація символів починається з нуля. Розглянемо приклади роботи з рядками в інтерактивному режимі
До конкретного символу в рядку можна звертатися за його індексом, зазначивши індекс у квадратних дужках.
Надрукуємо першу літеру рядка Червона калина:

>>> a = 'Червона калина'
>>> a[0]
'Ч'

Можна починати відлік символів із кінця рядка У цьому випадку індекси починаються з –1 (останній символ).
Надрукуємо третю з кінця літеру рядка Червона калина:

>>> a[–3]
'и'

Присвоїмо змінній b символ рядка а з індексом 8:

>>> b = a[8]
>>> b
'к'

Функція len() повертає кількість символів, із яких утворено рядок.
Синтаксис функції:

k = len(s),
де k — змінна цілого типу для збереження значення, яке повертає функція; s — рядок, довжину якого потрібно визначити.
Визначимо довжину рядка Червона калина:

>>>len(a)
14

Пропуск теж є символом, тому довжина рядка дорівнює 14.

Отримання зрізів
Можна вибирати з рядка не один символ, а декілька, тобто добувати зріз (підрядок)
Оператор добування зрізу з рядка:

z = s[i:j:step],
де z — змінна, в яку зберігається підрядок рядка s;
і — індекс початку зрізу;
j — його закінчення (причому символ із номером j у зріз не входить);
step — з яким кроком вибираються символи

Якщо символи вибираються підряд, параметр step можна опустити. Якщо відсутній перший індекс, то зріз береться від початку до другого індексу; за відсутності другого індексу зріз береться від першого індексу до кінця рядка.

Скопіюємо з рядка а підрядок Червона:

>>> a = 'Червона калина'
>>> a[:7]
'Червона'

Скопіюємо з рядка а підрядок калина:

>>> a[8:]
'калина'

Скопіюємо з рядка а символи з парними індексами:

>>> a[::2]
'Чроаклн'

Рядки — незмінювані послідовності. Якщо спробувати змінити значення символу всередині рядка, виникне помилка

>>> s[3] = 'a'
Traceback (most recent call last):
File ''<pyshe11#3>'', line 1, in <module>
s[3] = 'a'
TypeError: 'str' object does not support item assignment

Перегляд символів у рядку
Перевірити, чи є певний рядок в іншому рядку, можна, скориставшись оператором in:

>>> print('y' in 'Python')
True

За допомогою циклу for можна переглянути рядок по символах:

>>> for c in a: print(c)

Операції конкатенації і дублювання
Об’єднання двох або більше рядків у один рядок називають конкатенацією Цю операцію позначають символом «+»
Об’єднаємо рядкові змінні а і b, додавши між ними пропуск

>>> a = 'Богдан'
>>> b = 'Хмельницький'
>>> c = a+ ' ' +b
# c = 'Богдан Хмельницький'

Дублювання — це повторення текстового фрагмента задану кількість разів Цю операцію позначають символом «*»
Повторимо символ «-» 20 разів

>>> с = '-'*20
# c = '--------------------'

Потроїмо кожний символ рядка s

s = '12345'
s1 = ''
for i in s:
    s1 = s1+i*3
print(s1)
# Буде надруковано 111222333444555

Опрацювання рядкових величин
Ви вже знайомі з прийомами опрацювання текстів у текстовому редакторі, наприклад із пошуком і заміною символів Мова Python має засоби для того, щоб запрограмувати подібні дії з рядковими величинами/ Зважаючи на те, що всі змінні в Python є об’єктами, відповідні
операції доступні у вигляді методів.
Синтаксис виклику методу для рядкової змінної:

ім’я змінної.назва методу (параметри)

Рядкові методи в Python не змінюють рядок, а утворюють новий рядок.
Якщо потрібно далі в програмі використовувати результат виконання методу, його слід зберегти в новій змінній.

В Python для рядків є чимало методів. Подивитися їх можна по команді dir (str), отримати інформацію по кожному - help (str.імя_метода).

Рядкові методи
Розглянемо деякі методи опрацювання рядкових величин і проаналізуємо результат застосування цих методів в інтерактивному режимі.
У наведених далі прикладах методи викликаються для змінної s, яка містить рядок, який опрацьовується.

Пошук символів у рядку find()
Метод шукає задану групу символів у рядку і повертає номер першого символу шуканого підрядка в рядку. Якщо підрядок не знайдено, результат виклику методу дорівнює –1:

nomer = s.find(subs),

де nomer — змінна цілого типу, яка отримує значення індексу першого символу підрядка subs у рядку s; subs — шуканий підрядок.
Знайдемо індекс першого символу підрядка 'га' у рядку s:

>>> s = 'Гуси, гуси, га-га-га'  
>>> n = s.find('га')           # n = 12

Заміна символів у рядку replace()
Метод replace() шукає й замінює шуканий підрядок у заданому рядку

srez = s.replace(sfind, sins),

де srez — змінна для рядка, що повертає метод;
sfind - підрядок, який потрібно замінити у рядку s;
sins - рядок, яким буде замінений підрядок sfind.

Замінимо в рядку s усі підрядки 'cry' на підрядки 'smile' і результат запишемо в змінну s1:

>>> s = 'Why do You cry, Willy, why do You cry?'
>>> s1 = s.replace('cry', 'smile')
>>> s1

'Why do You smile, Willy, why do You smile?'

Визначення кількості входжень підрядка
За допомогою методу count() можна визначити кількість входжень заданої групи символів у рядок:

kilk = s.count(subs),

де kilk — змінна цілого типу, яка отримує значення кількості входжень підрядка subs у рядок s; subs — шуканий підрядок.

Підрахуємо кількість повторень підрядка 'га' в заданому рядку s
Результат присвоїмо змінній k:

>>> s = 'Гуси, гуси, га-га-га'
>>> k = s.count('га')          # k = 3

Перевірка складу рядка
Іноді буває потрібно перевірити, чи складається рядок тільки з літер або тільки з цифр Для цього в Python є спеціальні методи, які повертають логічне значення (True або False).
 А саме:
• s.isdigit() — повертає True, якщо рядок s містить тільки цифри;
• s.isalpha() — повертає True, якщо рядок s містить тільки літери.

Напишемо код, який пропонує користувачеві створити пароль, що складається тільки з літер:

parol = ''
while not(parol.isalpha()):
    parol = input('Введіть пароль: ')
print('Ваш пароль' + parol)

Введіть пароль: 123secret
Введіть пароль: secret
Ваш пароль secret

Методи split() і join()
Метод split () дозволяє розбити рядок по прогалинах. В результаті виходить список слів. Якщо користувач вводить в одному рядку ряд слів або чисел, кожне з яких має в програмі оброблятися окремо, то без split () не обійтися.

>>> s = input()
red blue orange white
>>> s
'Red blue orange white'
>>> sl = s.split()
>>> sl
['Red', 'blue', 'orange', 'white']
>>> s
'Red blue orange white'

Список, повернутий методом split (), ми могли б привласнити до тієї ж змінної s,
s = s.split(). Тоді вихідний рядок був би втрачений. Якщо s не потрібна, то краще не вводити додаткову змінну.

Метод split() може приймати необов'язковий аргумент-рядок, що вказує з якого символу або підрядку слід виконати поділ:

>>> s.split('e')
['R', 'd blu', 'orang', 'whit', '']
>>> '40030023'.split ('00')
['4', '3', '23']

Метод рядків join() виконує зворотну дію. Він формує зі списку рядок. Оскільки це метод рядки, то попереду ставиться рядок-роздільник, а в дужках - передається список:

>>>'-'.join(sl)
'Red-blue-orange-white'

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

>>> ''.join(sl)
'Redblueorangewhite'

Метод format()
Строковий метод format () вже згадувався при розгляді виведення на екран за допомогою функції print ():

>>> print("This is a {0}. It's {1}.".format "ball", "red"))
This is a ball. It's red.

Однак до print () він ніякого відношення не має, а застосовується до рядків. Лише потім заново сформований рядок передається в функцію виведення.

Можливості format () широкі, розглянемо основні.

>>> size1 = "length - {}, width - {}, height - {}"
>>> size1.format(3, 6, 2.3)
'Length - 3, width - 6, height - 2.3'

Якщо фігурні дужки вихідного рядка порожні, то підстановка аргументів йде згідно з порядком їх слідування. Якщо в фігурних дужках для рядків вказані індекси аргументів, порядок підстановки може бути змінений:

>>> size2 = "height - {2}, length - {0}, width - {1}"
>>> size2.format(3, 6, 2.3)
'Height - 2.3, length - 3, width - 6'

Крім того, аргументи можуть передаватися по слову-ключу:

>>> info = "This is a {subj}. It's {prop}."
>>> info.format(subj = "table", prop = "small")
"This is a table. It's small."

Приклад форматування дійсних чисел:

>>> "{1: .2f} {0: .3f}". Format(3.33333, 10/6)
'1.67 3.333'

Коди символів
Усі символи (літери, цифри, знаки пунктуації тощо) утворюють так звану таблицю символів Кожний символ у таблиці має свій номер, який називають його кодом.
Код будь-якого символу можна визначити за допомогою функції ord():

>>> ord('A') # Велика англійська 'A'
65

Дізнатися, який символ відповідає певному коду, можна за допомогою функції chr():

>>> chr(1040)  # Код великої української 'A'
'A'

Великі й малі літери, літери англійського та українського алфавітів із однаковим написанням мають різні коди. Коди від 0 до 31 і від 127 до 160 не призначені для зображуваних
символів, а є керувальними. Коду 32 відповідає символ «пропуск».

--------------------------------------------------------------------------------------------------------------

# Приклад 1
# Опишемо функцію ins для вставляння підрядка subs у заданий рядок s після n-го символу:

# нумерація символів в рядку починається з 0
def ins(s, subs, n)
    snew = ''
    snew = s[0: n+1]+subs+s[n+1: len(s)]
    return snew
s = '1234'
subs = 'abc'
s = ins(s, subs, 2)  
print(s)             # Буде надруковано '123abc4'

# Приклад 2
# Запишемо рядок s у зворотному порядку, вилучивши пропуски:

def rev(s):   
    snew = s.replace(' ', '')    # Вилучаємо пропуски
    snew = snew[::-1]            # Pозвертаємо рядок
    return snew
s = '1 2 3 4'

print(rev(s))         # Буде надруковано 4321

# Приклад 3
# Зашифруємо речення шляхом вставлення заданого рядка після кожної  # літери:
def shifr(s, c):

    snew = ''
    for i in range(len(s)):
        snew = snew+s[i]+c
    return snew
s = 'Секрет'
c = 'abc'         # Рядок для вставляння
print(shifr(s, c) # Буде надруковано 'Сabcеabcкabcрabcеabcтabc'

# Приклад 4 
# Задано текстовий рядок. Вилучимо з нього всі цифри.
def lit(s):
    snew = ''
    for c in s:
        if not(c.isdigit()):
            snew = snew+c
    return snew
s = 'd3fgh56as67'
s = lit(s)
print(s)          # Буде надруковано 'dfghas'

Опрацювання рядкових величин лежить в основі програм, які призначено для шифрування та дешифрування текстів, автоматичного перекладу тощо.

Запитання
1. За допомогою яких засобів можна отримати підрядок заданого рядка? Поясніть на прикладі
2. Як можна вилучити підрядок із заданого рядка?
3. Як запрограмувати вставляння підрядка в заданий рядок?
4. Обчисліть значення функції:

а) chr(90) 
б) ord('z')–ord('y')
в) ord(chr(13))

5. Яких значень набудуть змінні внаслідок послідовного виконання операторів, якщо початкові значення
а = 'ми '; b = 'вивчаємо ';
c = 'Python'
а) c = a+c+b; 
в) b = c[12:];
б) x = len(c); 
г) b = c[0:10:2];
ґ) a = c.replace('и', ''); 
е) х = c.count('в');

д) x = c.find("P")

Завдання
1. Непорожній рядок, який містить деяке слово, називається паліндромом, якщо це слово однаково читається як зліва направо, так і з права наліво (наприклад: зараз, корок, ротатор, комок, біб, піп, дід, шалаш, кок, тут, око вимив, вилив, вишив, вирив).
Створіть програму яка аналізує введене слово, що складається з символів одного регістру, та виводить повідомлення про те. чи є дане слово паліндромом.

2. Створіть програму для знаходження кількості певних букв (вводить користувач) у даному тексті.

3. Створити програму для з’ясування того, чи можна скласти слово з літер іншого слова.

4. Створити програму для підрахунку цифр, великих та малих букв у введеному рядку.

5. Створіть програму для знаходження кількості одиниць у двійковому запису заданого числа.


Додатково
1.
# Задача про шифрування повідомлень.
# Розглянемо програму, що шифрує повідомлення, міняючи місцями
# кожні два символи
s="Я чекатиму на тебе завтра"
print(s)
s1=""
if (len(s)%2 != 0):
    s = s + " "
for i in range(0, len(s), 2):
    s1 = s1 + s[i+1] +s[i]
print("Зашифроване повідомлення:")
print(s1)

Скриншот результату роботи програми:






2. Зашифрувати текстове повідомлення методом Цезаря

Шифр Цезаря - це вид шифру підстановки, в якому кожен символ у відкритому тексті замінюється символом, що знаходяться на деякій постійній числі позицій ліворуч або праворуч нього в алфавіті. Наприклад, в шифрі зі зрушенням вправо на 3, А була б замінена на Г, Б стане Д, і так далі.

string = "абвгдеєжзиіїйклмнопрстуфхцчшщьюя"
key = int(input("Введи ключ : "))
word = input("Введи текст, який шифруємо: ")
res = ''
k=len(word) 
for j in range(k):
    for i in range(32):
        if string[i] == word[j]:
            res += string[(i + key) % 33]
print(res)

Скриншот результату роботи програми:




Комментариев нет:

Отправить комментарий