У Python є мінливі (mutable) та незмінні (immutable) типи даних.
Раніше розглядався тип даних int, який є незмінним. Так само незмінними є типи даних tuple (кортеж), frozenset (фіксована множина) і string (рядок).
Що значить незмінні? Значить, що вже створений рядок ми не можемо змінити. Це легко покажуть подальші приклади із рядками і кортежами. Якщо ж здається, що об'єкт одного з перерахованих даних змінився - значить, тепер ім'я об'єкта просто вказує на нову область пам'яті з новим об'єктом.
У python між одинарними й подвійними лапками практично немає різниці, а ще є два види потрійних. Всі типи лапок можуть бути вставлені одні в одні. Потрійні так же дозволяють перехід на новий рядок всередині рядка:
S1 = 'Welcome to strings'
S2 = "Another string"
S3 = """And '''another'''
long
string"""
S4 = 'This "string" is a bit """crazy"""'Прості арифметичні операції складання (конкатенації) і множення (повторення) доступні і з рядками. У прикладі нижче - складання двох рядків, множення рядка на число та взяття конкретного елемента рядка за його індексом. Індекси у всіх послідовностях у програмуванні вважаються від нуля. По негативному індексу - відраховуємо від кінця рядка назад.
S = 'abc'
print (len(S)) # 3
S = S + '12' # S = 'abc12'
print (S[2]) # 'c'
print ('ab'*2) # 'abab'Тепер перевіримо, наскільки незмінними є рядки і як з цим боротися:
S = 'asdfghj'
S[5] = 's'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
S = S[:5] + 's' + S[6:]Python дозволяє взяти частину рядка або навіть скласти з елементів рядка будь-який новий рядок, використовуючи фрагменти (зрізи). Приклади:
>>> S = "Welcome to California!"
>>> S
'Welcome to California!'
>>> S[:5]
'Welco'
>>> S[5:]
'me to California!'
>>> S[:]
'Welcome to California!'
>>> S[:-3]
'Welcome to Californ'
>>>print(S[-3:])
'ia!'
>>> S[::-1]
'!ainrofilaC ot emocleW'
>>> S[:5:2]
'Wlo'З прикладу видно, що зрізи створюються шляхом вказівки у квадратних дужках обов'язкової двокрапки. Число до двокрапки - від якого елемента показувати, після - до якого, не включаючи його. Якщо не вказано перше число - показати від початку, якщо не вказано друге - до кінця. Друга двокрапка дозволяє вказати третє число - крок, з яким потрібно йти по послідовності.
>>> S
'Welcome to California!'
>>> len(S) # get length of the string
22
>>> S.find('C') # get index of the first substring found
11
>>> S.replace('C', '7') # Replaces all the substrings to the new one mentioned
'Welcome to 7alifornia!'
>>> S.split() # Cuts the string using the separator provided, creates a list. By default space is used as a separator
['Welcome', 'to', 'California!']
>>> S.upper()
'WELCOME TO CALIFORNIA!'
>>> S += '\n\n'
>>> S
'Welcome to California!\n\n'
>>> S.rstrip() # removes space-like symbols at the end of string
'Welcome to California!'Додаткову інформацію про рядки та функції роботи з ними можна знайти за посиланням: Детальніше про рядки
Існує багато засобів створення рядків. Можна створювати новий рядок, використовуючи як існуючи рядки у змінних, так і нові літерали. Найпростіший варіант - конкатенація:
>>> S = 'Welcome to'
>>> C = 'Ukraine!'
>>> print(S + ' ' + C)
>>>
Welcome to Ukraine!Є найбільш застарілий варіант форматування рядків за допомогою оператора %. Цей підхід зʼявився ще у часи створення мови програмування Фортран (Printf)
Працює це так:
>>> S = 'Welcome to'
>>> C = 'Ukraine!'
>>> print('%s %s' % (S, C))
>>>
Welcome to Ukraine!%sвсередині рядка означає, що тут буде підставлено рядок%після рядку - оператор підставляння- кортеж з двома змінними - рядками, яких буде підставлено замість
%s
Окрім %s для позначення рядка, також використовуються %d для цілих чисел та %f для чисел с крапкою, що плаває:
>>> C = 'Ukraine'
>>> S = 'welcomed'
>>> print('%d people are %s in %s!' % (3, S, C))
3 people are welcomed in Ukraine!Декілька варіантів використання оператора форматування %
Метод .format() є свіжішим та покращує синтаксис форматування в цілому, але при обробці великих рядків все ж таки буде виникати проблема з читанням.
Використовуючи метод рядка .format() можна форматувати рядок різними способами:
- підставляючи змінні підряд, вказуючи позицію
- підставляючи змінні підряд без вказання позиції
- підставляючи змінні по назві
- в змішаному стилі
Наприклад, з вказанням позиції:
>>> S = "Information! {0} people are {1} {2} {3}!"
>>> S.format(3, 'welcomed', 'in', 'Ukraine')
'Information! 3 people are welcomed in Ukraine!'Без вказання позиції:
>>> S = "Information! {} people are {} {} {}!"
>>> S.format(3, 'welcomed', 'in', 'Ukraine')
'Information! 3 people are welcomed in Ukraine!'З назвою:
S = "Information! Russian people are {reaction} {pretext} {country}!"
print(S.format(country = "USA", pretext = "over", reaction = 'hated'))
# Information! Russian people are hated over USA!Більше інформації за посиланням
Найсвіжіший варіант форматування рядків - за допомогою префіксу f. Знайомимось на прикладі:
>>> name = 'Jake'
>>> f'He said his name is {name}'
# 'He said his name is Jake'
>>> f'He said his name is {name!r}'
# "He said his name is 'Jake'"Цей варіант швидший або принаймні такий же швидкий, як інші варіанти форматування, але читається набагато легше.
Зверніть увагу на !r, це цукор для виклику метода repr(), що показує репрезентативний варіант обʼєкта. Є ще цікаві варіанти методів str() та ascii(), відповідно !s та !a. Перший повертає обʼєкт у вигляді рядка, другий - у презентативному вигляді, але на відміну від repr(), він екранує символи, які не є стандартними літерами.
А ось ще цікавий приклад мультірядкового варіанта форматування:
name = "Eric"
profession = "comedian"
affiliation = "Monty Python"
message = (
f"Hi {name}. "
f"You are a {profession}. "
f"You were in {affiliation}."
)
print(message)
#'Hi Eric. You are a comedian. You were in Monty Python.'Велика стаття по префіксах та форматуванню
В python відсутні масиви в традиційному розумінні цього терміну. Точніше, якщо вам конче необхідно використати саме масиви, то варто імпортувати модуль array:
import arrayДаний модуль визначає тип об'єкта, який може ефективно опрацьовувати масив з базових типів даних: букв, цифр, дробів (str, int, float). Масиви є ітерованим типом даних і ведуть себе дуже схоже на списки, з єдиною відмінністю - всі об'єкти всередині них є однотипними.
Тим не менше, у пайтоні для зберігання однорідних (і не тільки) об'єктів частіше використовуються списки. Вони задаються багатьма способами:
# empty list
>>>empty_list = []
# Simple listing
>>> a = [2, 2.25, "Python"]
>>> a
[2, 2.25, 'Python']
# Transforming the string to a list
>>> b = list("help")
>>> b
['h', 'e', 'l', 'p']
>>> b = 'welcome to the hell'.split()
>>> b
['welcome', 'to', 'the', 'hell']До списків застосовні всі зрізи, що застосовуються до рядків. На додаток, до списків таким чином можна ще й додавати нові елементи.
L = [1, 2, 's']
>>> L
[1, 2, 's']
>>> L[1:3]
[2, 's']
>>> L[2] = '17'
>>> L
[1, 2, '17']
>>> L[1:2]
[2]
>>> L[1:2] = ['new', 'list']
>>> L
[1, 'new', 'list', '17']>>> L = list(range(1, 11))
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> L.append(12) # Adds element at the end of the list
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12]
>>> L.extend([13, 14]) # Adds second's list elements to the end of the first list
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14]
>>> L.insert(2, 5) # Insert 5 to the second place (index)
>>> L
[1, 2, 5, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14]
>>> L.remove(5) # Removes the first 5 appeared
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14]
>>> L.pop() #takes the last iterable from the list and transfers it
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13]
>>> print(L.pop()) #takes the last iterable from list and prints it
13>>> L=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# map function applies the method given to the iterable proposed
>>> L = list(map(str, range(1, 11)))
>>> L # Here we have casted all integers to strings
['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
>>> S = ': '.join(L) # concats small strings into one big, using "glue". Starts as a method of "glue"
>>> S
'1: 2: 3: 4: 5: 6: 7: 8: 9: 10'Цикл for спеціально створений для того, щоб виконувати повторювані дії з ітерованими об'єктами, утому числі зі списками. Пара прикладів:
>>> S = 'This is Sparta!!'
>>> L = S.split()
>>> L
['This', 'is', 'Sparta!!']
>>> for elem in L:
... print('say ' + elem)
...
say This
say is
say Sparta!!
>>> for num, elem in enumerate(L):
... print (str(num) + '. say ' + elem)
...
0. say This
1. say is
2. say Sparta!!Зверніть увагу на функцію enumerate, яка видає не лише вміст списку, а і його порядковий номер.
У мовах програмування є таке поняття, як синтаксичний цукор. Це можливості мови за деяким спрощенням мовних конструкцій, які не впливають на виконання конструкцій, але спрощують життя програміста. Найпопулярніший і найпоширеніший приклад - спискові включення, list comprehensions.
Нижче наведено приклади приведення звичайного циклу до спискового включення:
>>> l = []
>>> for x in range(1, 11):
... l.append(x*x)
...
>>> l
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# now with the list comprehension
>>> l2 = [x*x for x in range(1, 11)]
>>> l2
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]Синтаксис у list comprehensions приблизно такий:
result_list = [actions_with_var for var in list if condition]
Як видно з синтаксису, можна навіть додати перевірку певної умови, з виконання якої ми додаватимемо або не додаватимемо елемент до результівного списку:
e='s o m e t e x t' a=[x*2 for x in e if x!=' '] print(a) ['ss', 'oo', 'mm', 'ee', 'tt', 'ee', 'xx', 'tt']
Насправді ця конструкція є прикладом генераторного виразу, що перевіряється обрамленням її не квардатними, а круглими дужками і перевіркою типу даних на виході:
a=(x for x in range(10)) type(a) <class 'generator'> А у прикладах наведених вище відбувалося перетворення згенерованих даних на льоту у елементи списку, завдяки ініціалізації змінної, як списку.
List comprehensions за 5 хвилин