Урок №3 Подпишитесь на рассылку в конце статьи чтобы смотреть материал раньше всех
Теоретические сведения
Строка — это неизменяемая упорядоченная последовательность символов.
В Python нет типа char(символ), поэтому можно считать, что символ — это строка длиной 1. Определение получается не формальным (замкнутым само на себя), тем не менее этого достаточно для понимания строк. Другой вариант: символ — это элемент таблицы кодировки. Тем не менее и это определение формальным не будет.
Life-hack
В целом, при даче определения встроенным коллекциям в Python можно использовать следующий способ.
Есть три составляющих части:
- Изменяемая/неизменяемая?
- Упорядоченная/неупорядоченная?
- Тип содержащихся элементов?
Ответив на три тих вопроса, мы даем определение любой коллекции. Пример: строка — неизменяемая, упорядоченная, содержит символы.
Эти типы будут в будущем:
- Список — изменяемый, упорядоченный, содержит любые элементы.
- Словарь — изменяемый, упорядоченный, содержит пары ключ: значение.
и т.д.
Литералы строк
Есть несколько способов ввода строк:
- Одиночные кавычки:
'string'
. - Двойные кавычки:
"string"
. - Многострочный ввод. Для ввода строк используется очень редко, но может. Обычно таким образом формируют докстринги.
"""multi
string
""" - Ввод многострочного текста используя свойство строки и скобок. Python не будет считать строку законченной, если в ней есть открывающая скобка, а закрывающей нет. Кроме того, расположенные рядом две строки конкатенируются. эти свойства позволяют реализовать ввод следующим образом:
str_ = ("very long"
"very long")
Оба типа кавычек нужны для того чтобы мы могли вводить кавычки другого типа внутри строки без экранирования.
# Строка, содержащая двойные кавычки.
s = 'st"ring'
Некоторые символы не могут быть введены с клавиатуры. Для этого применяется экранирование:
- ‘\n’ — перевод строки.
- ‘\r’ — возврат каретки.
- ‘\t` — горизонтальная табуляция. и т.д.
Кроме того, с помощью бэк-слеша вводятся символы по коду.
Типы строк в Python 3
- Unicode строки, задаются как описано выше.
- Бинарные строки:
b'str'
— элементами этой строки являются байты а не символы. - Строка с подавлением экранирования. Бэк-слеш как символ экранирования работать не будет.
r's\t'
. Во втором Python 2 строки по умолчанию были в кодировке ASCII, а для задания unicode строки необходимо было указывать это явно:u'unicode_str'
. - Форматированные строковые литералы. Подробнее о них в разделе форматирования.
f'str{var_name}'
.
a = 'happy python' b = """happy python""" print(a == b) print(a is b)
True True
Базовые методы работы со строками
Со строками можно произвести следующие базовые операции:
- Строку можно присвоить переменной.
s = '10'
. - Получение символа по индексу. Индексация начинается с 0.
a[0]
— первый символ. Индексы могут быть и отрицательными.-1
— последний элемент, и далее влево с уменьшением индекса. - Получение длины строки.
len(s)
. - Конкатенация(сложение) строк.
s1+s1
. - Умножение строки на число.
- Брать срезы.
Срезы
Синтаксис среза:
str_[start:end:step]
Срез(slice) возвращает подстроку, от значения start
до значения end
не включая end с шагом step
. В случае, если шаг отрицательный, start
должен быть больше end
. Индексы start
и end
могут быть отрицательными. В случае если нужно использовать значения по умолчанию — взять с начала, или до конца, или с шагом 1
, явно эти значения можно не указывать.
Методы строк
my_string.lower()
— возвращает копию строки, преобразованную к нижнему регистру.my_string.upper()
— возвращает копию строки, преобразованную к верхнему регистру.my_string.find('substr’)
— возвращает индекс первого вхождения подстроки в строку.my_string.strip([chars])
— удаление пробельных символов (или chars) в начале и конце строки.my_string.split([str])
— разбиение строки по пробельным символам (или str).my_string.replace(old, new, [maxcount])
— возвращает строку, в котрой заменены все вхождения (или maxcount) указанной строки соответствующим значением.my_string.join(iterable)
— собирает строку из элементов iterable c разделителем my_string. Элементы итерируемого объекта должны быть строками.
Встроенные функции работы со строками
ord(chr)
— возвращает код символа chr.chr(int)
— возвращает символ по коду int.
Форматирование строк
New-style formatting
"string{}{}".format(arg1, arg2)
— форматирование с позиционными аргументами, идущими по очереди."string{0}{1}".format(arg1, arg2)
— форматирование с передачей позиционных аргументов, с указанием куда какой аргумент пойдет.string{a}{b}".format(a=arg1, b=arg2)
— форматирование с передачей параметров по имени.
Old-style formatting
C-like механизм.
'string %s%d%r' % (obj, num, obj_)
— переменные подставляются вместо соответствующих операторов, начинающихся с %
. %s
— строчное представление, %d
— числа, %r
— текстовое представление в виде repr (об этом мы узнаем позже когда будет проходить классы).
В целом этот метод форматирования устарел и используется редко.
F-string
Данный тип форматирования был введен в версии Python 3.6.
var = 10
str_ = f'my val = {var}'
Производит авто подстановку значений переменных в строку по имени.
Code Snippets
# Задание строк.
str1 = 'string'
str2 = "other'string"
print(str1, str2, sep=', ')
string, other'string
# Многострочный ввод.
multi_str = """ string start
string continue
string continue
"""
print(multi_str)
string start string continue string continue
a = "asdf" "adsf"
print(a)
asdfadsf
# Более удобный способ.
str_ = ('long string'
'long string')
print(str_)
long stringlong string
# Экранированные служебные символы внутри строки.
str_ = "string\notherline\twithtab"
print(str_)
string otherline withtab
# Строки с подавлением экранирования.
str_ = r"string\notherline\twithtab"
print(str_)
string\notherline\twithtab
Базовые методы работы со строками
# Получение элемента по индексу.
str_ = 'some string'
print(str_[2], str_[-1], str_[-3])
m g i
# Строки - неизменяемые объекты! str_ = 'some string' str_[3] = '1' TypeError Traceback (most recent call last) <ipython-input-11-3bb9cfa84c81> in <module> 1 # Строки - неизменяемые объекты! 2 str_ = 'some string' ----> 3 str_[3] = '1' TypeError: 'str' object does not support item assignment
# Получение длины строки.
str_ = 'some string'
print(len(str_))
11
# Конкатенация строк.
str_ = 'some string'
other_str = 'wow'
print(str_ + other_str)
some stringwow
# Умножение строки на число.
str_ = 'wow'
print(str_ * 4, 4 * str_)
wowwowwowwow wowwowwowwow
# Сред без параметров создает копию строки.
str_ = 'some string'
other_str = str_[:]
print(other_str)
some string
# Пример среза.
str_ = 'somed string'
print(str_[2:4])
me
# Пример среза с шагом.
str_ = 'some string'
print(str_[2:9:2])
m ti
# При отрицательном шаге start должен быть больше end.
str_ = 'some string'
print(str_[2:9:-2])
# Вот так все должно работать.
str_ = 'some string'
print(str_[9:2:-2])
nrse
# Если значение не указано - будет подставлено начало или конец строки.
str_ = 'some string'
print(str_[2::2])
m tig
# Подставлять будет корректно - в зависимости от шага.
str_ = 'some string'
print(str_[::-3])
gr o
print(str_[-1 :-5 :-3])
gr
Методы строк
# Преобразование в верхний регистр. str_ = 'some string' print(str_.upper()) print(str_) # строка не поменялась! неизменяемый тип
SOME STRING some string
# Преобразование в нижний регистр.
str_ = 'SOME STRING'
print(str_.lower())
some string
# Поиск подстроки в строке.
str_ = 'some string'
print(str_.find('str'))
5
# Если подстрока отсутствует, возвращено будет -1.
str_ = 'some string'
print(str_.find('11'))
-1
# Замена. Обратите внимание - вернется новая строка! Строки - неизменяемые.
string = "11111"
str1 = string.replace("1", "2", 3)
print(str1)
22211
# Strip без параметров.
str_ = ' \n\tsome string '
print(str_)
print(str_.strip())
some string some string
# Strip если мы передаем символы.
str_ = '.,,.tsome st..ring...'
print(str_.strip(',.'))
tsome st..ring
str_ = ' \n\tsome string '
print(str_.strip(' \n\t\r'))
some string
# Split без параметров.
str_ = ' \n\tsome string '
print(str_.split())
['some', 'string']
# Split с переданным разделителем.
str_ = 'some.,.string'
print(str_.split(',.'))
['some.', 'string']
# Join. str_ = 'HELLO' print('.'.join(str_))
H.E.L.L.O
# Разделитель ставиться только между элементами.
print('.'.join('1'))
1
# Получение кода символа.
x = ord('A')
print(x, type(x))
65 <class 'int'>
# Получение символа по коду.
x = chr(23236)
print(x, type(x))
嫄 <class 'str'>
Форматирование строк
# Форматирование с позиционными аргументами.
template = "string {}{}{}"
print(template)
print(template.format(1, 2, 3))
string {}{}{} string 123
# Позиционные параметры можно выставлять в необходимом порядке.
template = "string {1}{6}{4}{8}{9}{10} other values {0}"
print(template.format(1, "value", 1, 3 ,2, 4, 5, 6, 7 , 9, 10 ))
string value527910 other values 1
# Форматирование с параметрами, переданными по имени.
template = "string {line} other values {err_code}"
err_code1 = 1
line1 = 'value'
print(template.format(err_code=err_code1,
line=line1))
string value other values 1
# Передать можно абсолютно любой объект.
template = "list value: {lst}"
print(template.format(lst=(1, 2, [1, 2])))
list value: (1, 2, [1, 2])
# Совсем любой.
template = "list value: {lst}"
print(template.format(lst=type))
list value: <class 'type'>
# Форматирование поддерживает некоторые дополнительные параметры.
print("{param:^16} was founded in {value:<4}!"
.format(param="GeeksforGeeks", value=209))
GeeksforGeeks was founded in 209 !
# Old-style форматирование. name = "Vadim" age = 28 hobbies = ["computer games", "programming", "spearfishing"] print("%s is %d years old. His hobbies are %s." % (name, age, ', '.join(hobbies)))
Vadim is 28 years old. His hobbies are computer games, programming, spearfishing.
# Использование f-строк.
my_var = 12
print(f"string {my_var} string")
string 12 string
Задачи для закрепления
- Базовые операции со строками.
Вводится строка. Удалить из нее все пробелы, после этого определить, является ли она палиндромом, т.е. одинаково пишется как с начала так и с конца.
- Базовые операции со строками.
Найти самое длинное слово в введенном предложении
- Базовые операции.
Уравнение прямой вида y = kx + b задано в виде строки. Определить координату y точки с заданной координатой x.
- Join.
Заменить все пробелы в строке на точки не используя replace.
- Срезы.
Дана строка.
- Сначала выведите третий символ этой строки.
- Во второй строке выведите предпоследний символ этой строки.
- В третьей строке выведите первые пять символов этой строки.
- В четвертой строке выведите всю строку, кроме последних двух символов.
- В пятой строке выведите все символы с четными индексами (считая, что индексация начинается с 0, поэтому символы выводятся начиная с первого).
- В шестой строке выведите все символы с нечетными индексами, то есть начиная со второго символа строки.
- В седьмой строке выведите все символы в обратном порядке.
- В восьмой строке выведите все символы строки через один в обратном порядке, начиная с последнего.
- В девятой строке выведите длину данной строки.
©http://pythoshka.ru/index.html Питошка
- Форматирование строк.
Вводится дата в формате dd.mm.yyyy
Вывести дату в формате mm\dd\yyyy
print(my_string[3:6], my_string[0:3], my_string[6:], sep='/')
str_ = "12.02.2000"
dd, mm, yy = str_.split(".")
print("{}\{}\{}".format(mm, dd, yy))
02\12\2000
print(some_string[2])
print(some_string[-2])
print(some_string[:5])
print(some_string[:-2])
print(some_string[::2])
print(some_string[1::2])
print(some_string[::-1])
print(some_string[::-2])
print(len(some_string))
str_ = «http://»
len(str_)
7
Подпишитесь на рассылку