3. Рядки
Як ви вже знаєте, у багатьох створених програмах
ми використовували рядки. Давайте докладніше
з’ясуємо, що ж це таке насправді!
Мова Python вважає рядком все, що знаходиться
всередині лапок. Наприклад, якщо помістити цей текст
в лапки, він також стане рядком для Python (рис. 1).
З точки зору комп’ютера, весь текст – це набір сим-
волів. У кожного символа є свої код. Різний код та у
різних за регістром символів, це потрібно враховува-
ти, коли ви заходите на сайти. Наприклад, логін Alex і
alex належатимуть абсолютно різним користувачам. Все
тому, що велика буква представлена одним кодом, а ма-
ленька – зовсім іншим, тому комп’ютер сприймає їх як
два різні символи.
Рисунок 1
3
Рядки і символи
4. Якщо говорити про рядки, то це – послідовність різ-
них символів.
Для написання деяких програм просто необхідно
вміти працювати з рядками. Давайте ще раз подивимося
на приклад рядків з попереднього уроку:
s = "Guess my number"
print(s)
Іноді потрібно розбити один рядок на кілька, напри-
клад, коли потрібно помістити багато тексту всередині
лапок. Такий запис ніяк не вплине на результат роботи
функції print(), але дозволить більш компактно роз-
містити код. Спершу поставимо символ , а потім вже
виконаємо перенесення тексту:
s = "Hello! This is my new game
Guess my number"
print(s) # Hello! This is my new game Guess my
number
Робота з рядками
Як ви пам’ятаєте, якщо потрібно виконати перене-
сення рядка, ми використовуємо строковий літерал n.
Щоб додати табуляцію перед текстом, слід додати літе-
рал t:
print("Start:ntstringntstringntstringnEnd")
4
Урок № 7
5. Конкатенація (додавання) застосовується для з’єд-
нання двох рядків і реалізується за допомогою знаку +:
s1 = "Hello"
s2 = "World"
print(s1 + s2) # HelloWorld
Дублювання рядка може знадобитися, коли потріб-
но продублювати будь-який текст або набір символів
певну кількість разів:
s1 = "Hello"
print(s1 * 3) # HelloHelloHello
Довжина рядка визначається за допомогою функції
len(). Ця функція може знадобитися у найрізноманіт-
ніших завданнях. Припустимо, ми пропонуємо корис-
тувачеві ввести код з шести символів, а потім перевіря-
ємо, чи увів він достатню кількість символів. Приклад
запису такої функції виглядає наступним чином:
s1 = "Hello"
print(len(s1)) # 5
Індексація рядків
Оскільки рядки – це набір символів, то з будь-якого
рядка можна отримати конкретний символ. Для цього
потрібно лише знати його індекс (порядковий номер).
Важливо пам’ятати, що індекс першого елемента завжди
дорівнює нулю.
5
Рядки і символи
6. Давайте розглянемо приклад використання індек-
сів:
s = "Hello World"
print("symbol [0]: " + str(s[0])) # H
print("symbol [6]: " + str(s[6])) # W
В даному прикладі створюється рядок s, а потім
виводяться символи з індексами s[0] і [6]. Майте на
увазі, що функція len() поверне кількість символів в
рядку, але індекс останнього елемента буде на одиницю
меншим. Для даного рядка допустимі індекси від 0 до 10,
більше значення викличе помилку. Наприклад, s[11]
виконається з помилкою:
s = "Hello World"
i = len(s) # i = 11
print(s[i]) # s[11] = Error
В результаті в консоль буде виведено повідомлення
типу IndexError: string index out of range. Через
цю особливість, будьте більш уважні під час звертання
до елементів рядка за індексом.
6
Урок № 7
7. Методи рядків
Часто з рядками потрібно виконувати різні шаблон-
ні дії (заміну букв, пошук і т. п.). Саме для таких завдань
у багатьох мовах програмування є заготовлений набір
методів.
Метод – це функція, яка застосовується до об’єкта, в
даному випадку – до рядка. У мові Python достатньо ба-
гато різних методів і запам’ятати призначення кожного з
них буде непростим завданням. У зв’язку з цим, завжди
звертайтеся до документації (https://docs.python.org/3.6/
library/stdtypes.html#string-methods).
Розглянемо деякі методи на прикладі їхньої роботи
в коді.
Синтаксис методу:
імя_об›екта.імя_метода (параметри)
Уявіть, ми виявили, що символи представлені в різ-
них регістрах, що робить нашу програму особливо не-
привабливою. Чи не шукати ж нам усі рядки в коді і ко-
ригувати кожен з них! Для цього використовуємо один з
наведених нижче методів:
s = "guEss mY numBer"
s.capitalize() # Guess my number
s.title() # Guess My Number
s.upper() # GUESS MY NUMBER
s.lower() # guess my number
7
Рядки і символи
8. Метод find і rfind
Одне з основних завдань при роботі з рядками – по-
шук ключових слів.
Метод find застосовується до рядка і виконує пошук
підрядка, який передається як параметр, тобто в дужках
find(""). В результаті функція повертає індекс першого
входження шуканого підрядка. Якщо ж такий підрядок
не знайдено, метод повертає значення, яке дорівнює -1.
Не лякайтеся, якщо таке формулювання здалося вам
складним. З’ясуємо принцип використання find на при-
кладі, і ви відразу зрозумієте що до чого:
s = "message"
s.find("m")) # 0
s.find("s") # 2
s.find("w") # -1
Метод rfind працює за тим же принципом, тільки
повертає індекс останнього входження підрядка, тобто
виконує пошук справа наліво:
s = "message"
s.rfind("m") # 0
s.rfind("s") # 3
s.rfind("w") # -1
Різницю в роботі цих методів можна побачити, по-
глянувши на третій рядок, де виконується пошук сим-
вола s. У першому випадку було знайдено перше вхо-
дження цього символу з індексом 2, а в другому випадку
символ s був знайдений в позиції 3.
8
Урок № 7
9. 9
Рядки і символи
Метод replace
Метод replace(old, new) повертає рядок, в яко-
му будуть замінені всі входження old на підрядок new.
Метод може приймати два параметри replace(old,
new) або три replace(old, new, num). Як ви вже мог-
ли здогадатися, old – це текст, який будемо замінювати,
new – текст, на який будемо замінювати, num – кількість
зроблених замін.
s = "best regards best"
s.replace("best", "kind") # kind regards kind
s.replace("best", "kind", 1) # kind regards best
Метод count
Порахувати кількість входжень підрядка в рядок до-
поможе метод count:
s = "Hello World"
s.count("l")) # 3
Методи рядків
Перейдемо до вивчення методів, які дозволять пере-
вірити рядок за різними критеріями. Це може бути пе-
ревірка на наявність букв, цифр і навіть регістрів. Роз-
беремося докладніше, як це працює.
■■ Метод isnumeric() перевіряє, чи є в рядку цифри.
Якщо цифра є, поверне true, якщо ні – false.
10. 10
Урок № 7
■■ Метод isupper() дозволяє дізнатися, чи є в рядку
літери у верхньому регістрі. Як ви вже могли здога-
датися, повернеться true, якщо такі будуть знайдені.
■■ Метод islower(), в свою чергу, використовується для
нижнього регістра. Працює за аналогією з описом
вище, повертає true або false.
■■ Метод isalpha() поверне true, якщо всі символи в
рядку будуть буквами.
Приклад використання методів:
password = "qw@E1r"
print("nTry isalpha: ")
for symbol in password:
alpha = symbol.isalpha()
print(f"{symbol} - {alpha}")
if (not alpha) and (symbol == "@"):
print(f"It is {symbol}")
Результат виконання коду буде наступний:
Try isalpha:
q - True
w - True
@ - False
It is @
E - True
1 - False
r - True
11. Рисунок 2
11
Рядки і символи
Зрізи рядків
Зріз (slice) – це витяг з рядка одного символа або су-
купності. Можна провести аналогію з відсіканням пев-
ної частини тексту.
Оператор вилучення зрізу має вигляд [I:j], де
i – початок зрізу, а j – кінець. Цікаво те, що символ з
індексом j у зріз не входить. Можна також задати крок
[I:j:step] зрізу. За замовчуванням перший сим-
вол – це початок рядка, відповідно, він дорівнює 0, а
другий дорівнює довжині рядка (рис. 2).
s = "message"
print(s[0:]) # message
print(s[2:5]) # ssa
print(s[2:-1]) # ssag
print(s[1:6:2]) # esg
print(s[:5]) # messa
print(s[:]) # message
12. Рисунок 3
12
Урок № 7
Напишемо програму для створення надійного паро-
ля.
Здавалося б, немає нічого простішого, ніж створен-
ня надійного пароля. Однак часто користувачі банально
не хочуть придумувати складний пароль, використову-
ють один і той же ключ для різних сервісів або вводять
прості стандартні слова, піддаючи ризику свій обліко-
вий запис (рис. 3).
Для багатьох не буде секретом, що оптимальна дов-
жина пароля повинна бути близько 15-ти символів, а
складатися він повинен з малих, великих літер і симво-
лів. Також пароль не повинен містити популярних ком-
бінацій, наприклад: admin, qwerty, 12345, password і т. д.
До того ж використання одного пароля, навіть якщо він
надійний, є поганою практикою.
Існує ряд ресурсів, за допомогою яких можна при-
близно розрахувати, за який час може бути зламаний
пароль, наприклад How Secure Is My Password? (https://
howsecureismypassword.net).
13. Рисунок 4-5
13
Рядки і символи
Давайте за допомогою даного сервісу протестуємо
різні комбінації символів: qwerty і q1W2e#R4t%y^. Як
видно на зображеннях, другий пароль виявився більш
складний і надійний (рис. 4-5).
Варто зауважити, що вводити справжні паролі в по-
дібні форми не рекомендується. Сервіс наведено лише
для ознайомлення і створення загального розуміння
того, яка комбінація символів вважається особливо на-
дійною.
14. 14
Урок № 7
Напишемо програму, яка буде генерувати складні
паролі:
Лістинг 1
import random
s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
s2 = "0123456789"
s3 = "~!@#$%^&*()_+{}[]:/"
s = s1.upper() + s1.lower() + s2 + s3
password = ""
for i in range(15):
p = random.choice(s)
password = password + p
print(f"New password [{i}]: {password}")
Давайте з’ясуємо, що відбувається в програмі. Спер-
шу імпортували модуль import random.
Потім створили три змінні s1, s2, s3, в які записа-
ли всі можливі символи, які будуть використовуватися
в процесі генерації пароля:
s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
s2 = "0123456789"
s3 = "~!@#$%^&*()_+{}[]:/"
Потім нам потрібно буде отримати абсолютно ви-
падкове значення – чи то цифру, букву або символ.
15. 15
Рядки і символи
Для цього створюємо змінну s і, немов у коробку,
складаємо в неї всі рядки. Таким чином, отримаємо на-
ступний запис:
s = s1.upper() + s1.lower() + s2 + s3
# s = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm
nopqrstuvwxyz0123456789~!@#$%^&*()_+{}[]:/
Чудово! У нас є рядок.Тепер саме час згенерувати
пароль. У циклі for з рядка s з кожним проходом отри-
муємо випадкове значення random.choice(s). Потім
додаємо це значення до змінної password.
За допомогою послідовного виведення рядків ми
можемо відобразити результат в консоль:
for i in range(15):
p = random.choice(s)
print(p, end="")
В результаті роботи програми сформується пароль з
випадкових букв, цифр і символів:
New password [14]: qH3/0)D8_vpATV7
New password [14]: L)l@+Wd*JXsJZ)8
New password [14]: y7nT:k*&K@RgO$k
Тепер ви можете генерувати надійні паролі для своїх
облікових записів за допомогою створеної програми.
16. 16
Урок № 7
Ознайомлення з модулем string
У мові Python є модуль import string, який може
значно полегшити генерацію пароля, дозволяючи отри-
мати все той же набір букв і символів, не прописуючи їх
вручну.
Повернемося до Лістингу 1 і зосередимо увагу на та-
кому запису:
s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
s2 = "0123456789"
s3 = "~!@#$%^&*()_+{}[]:/"
s = s1.upper() + s1.lower() + s2 + s3
Замість нього можна використовувати константи з
модуля string:
# string.ascii_lowercase + string.ascii_uppercase
s1 = string.ascii_letters
s2 = string.digits
s3 = string.punctuation
s = s1 + s2 + s3
Таким чином, результат при використанні модуля
string жодним чином не відрізнятиметься від резуль-
тату, отриманого в Лістингу 1. Відповідно, у своїх про-
грамах ви можете використовувати будь-який зручний
для вас варіант.