Урок №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

Задачи для закрепления

  1. Базовые операции со строками.

Вводится строка. Удалить из нее все пробелы, после этого определить, является ли она палиндромом, т.е. одинаково пишется как с начала так и с конца.

  1. Базовые операции со строками.

Найти самое длинное слово в введенном предложении

  1. Базовые операции.

Уравнение прямой вида y = kx + b задано в виде строки. Определить координату y точки с заданной координатой x.

  1. Join.

Заменить все пробелы в строке на точки не используя replace.

  1. Срезы.

Дана строка.

  • Сначала выведите третий символ этой строки.
  • Во второй строке выведите предпоследний символ этой строки.
  • В третьей строке выведите первые пять символов этой строки.
  • В четвертой строке выведите всю строку, кроме последних двух символов.
  • В пятой строке выведите все символы с четными индексами (считая, что индексация начинается с 0, поэтому символы выводятся начиная с первого).
  • В шестой строке выведите все символы с нечетными индексами, то есть начиная со второго символа строки.
  • В седьмой строке выведите все символы в обратном порядке.
  • В восьмой строке выведите все символы строки через один в обратном порядке, начиная с последнего.
  • В девятой строке выведите длину данной строки.

©http://pythoshka.ru/index.html Питошка

  1. Форматирование строк.

Вводится дата в формате 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

Подпишитесь на рассылку

Если это было вам полезно — вы можете сказать нам спасибо!