Операции с текстовыми строками str в python
Содержание:
- Содержание:
- Разновидности жучков
- Строки байтов — bytes и bytearray
- Полная программа
- Differences between f-string and str.format expressions
- Как изменить или удалить строку?
- Triple Quotes
- What is String in Python?
- Как выбрать хороший навигатор для автомобиля?
- Разделение строки при помощи последовательно идущих разделителей
- Методы для работы со строками
- Как активировать режим разработчика на телефоне андроид
- Почему Вам нужно обратиться именно к нам?
- Скорость
- #3 Интерполяция строк / f-Строки (Python 3.6+)
- Нарезка строк
- Python F-Строки: Детали
- Произвольные выражения
- Форматирование строк
- Postmypost
- String Special Operators
Содержание:
Помните Дзен Python, где должен быть “один очевидный способ сделать что-то в Python”? Можете почесать голову перед тем, как понять, что зачастую есть целых 4 эффективных способа выполнить в Python.
Давайте приступим к делу, работы много! Чтобы иметь в распоряжении простой пример для эксперимента, представим, что у вас есть следующие переменные (или константы, не важно) для работы:
Python
errno = 50159747054
name = ‘Bob’
1 |
errno=50159747054 name=’Bob’ |
Основываясь на этих переменных, вы хотите создать строку вывода, содержащую простое уведомление об ошибке:
Python
‘Hey Bob, there is a 0xbadc0ffee error!’
1 | ‘Hey Bob, there is a 0xbadc0ffee error!’ |
Эта ошибка может немного подпортить понедельник вашему разрабу… Но мы здесь за тем, чтобы обсудить форматирование строк. Так что приступим к делу.
Разновидности жучков
Мало того, что жуки плодовиты и маскируют свои яйца, так у них еще и множество разновидностей. И пищевые предпочтения у насекомых разные, и условия обитания, и скорость размножения. Соответственно, и методы борьбы с ними тоже отличаются. Что же, истребить их совсем сложно? Разберемся по порядку, как называются и чем интересны разные виды жучков. Смотрите фото и ищите знакомцев.
Хлебный точильщик
Это рыжий жучок, который селится в булках, крупах и чае. Хороший летун, но квартиру по своей воле не покинет, так что борьба с ним обещает быть долгой.
Долгоносик
Черное насекомое с длинным хоботком, непритязательное к пище и среде обитания. Летает плохо, но перемещаться это ему не мешает. Долгоносик долгое время способен жить без еды, поэтому голодом морить его бесполезно.
Суринамский мукоед
Маленький рыжий жучок, который обитает в испорченных крупах и не прочь полакомиться сладостями. Очень плодовит, но не выносит испытания голодом и непривычными условиями.
Мучной жучок живет в овсянке, манке и муке
Наверняка знаком многим – это длинное (до 4 мм) темно-коричневое создание, портящее овсяную и манную крупы и муку. Его яйца тоже похожи на белые крупинки, а потому обнаружить их нелегко.
Строки байтов — bytes и bytearray
Определение которое мы дале в самом начале можно считать верным только для строк типа str. Но в Python имеется еще два дугих типа строк: bytes – неизменяемое строковое представление двоичных данных и bytearray – тоже что и bytes, только допускает непосредственное изменение.
Основное отличие типа str от bytes и bytearray заключается в том, что str всегда пытается превратить последовательность байтов в текст указанной кодировки. По умолчанию этой кодировкой является utf-8, но это очень большая кодировка и другие кодировки, например ASCII, Latin-1 и другие являются ее подмножествами
Одни символы кодируются одним байтом, другие двумя, а некоторые тремя и функция при декодировании последовательности байтов принимает это во внимание. А вот функциям и до этого нет дела, для них абсолютно все данные состоят только из последовательности одиночных байтов.
Такое поведение bytes и bytearray очень удобно, если вы работаете с изображениями, аудиофайлами или сетевым трафиком. В этом случае, вам следует знать, что ничего магического в этих типах нет, они поддерживоют все теже строковые методы, операции индексирования, а так же операторы и функции для работы с последовательностями. Единственное, что следует держать в уме, так это то, что вы имеете дело с последовательностью байтов, т.е. последовательностью чисел из интервала в шестнадцатеричном представлении, и что байтовые строки отличаются от обычных символом (реже) предваряющим все литералы обычных строк.
Например, что бы создать строку типа bytes или bytearray достаточно передать соответствующим функциям последовательности целых чисел:
Учитывая то, что для кодирования некоторых символов (например ASCII) достаточно всего одного байта, данные типы пытаются представить последовательности в виде символов если это возможно. Например, строка будет выведена как :
А это значит, что байтовые данные могут вполне обоснованно интерпретированться как ASCII символы и наоборот. Т.е. строки байтов могут быть созданы и так:
Но, следует помнить что это все-таки байты, в чем легко убедиться, если мы обратимся к какому-нибудь символу по его индексу в строке:
Так как строковые методы не изменяют сам объект, а создают новый, то при работе с очень длинными строками (а в мире двоичных данных это далеко не редкость) это может привести к большому расходу памяти. Собственно, по этой причине и существует тип bytearray, который позволяет менять байты прямо внутри строки:
Полная программа
Differences between f-string and str.format expressions
There is one small difference between the limited expressions allowed
in str.format() and the full expressions allowed inside
f-strings. The difference is in how index lookups are performed. In
str.format(), index values that do not look like numbers are
converted to strings:
>>> d = {'a': 10, 'b': 20} >>> 'a={d}'.format(d=d) 'a=10'
Notice that the index value is converted to the string 'a' when it
is looked up in the dict.
However, in f-strings, you would need to use a literal for the value
of 'a':
>>> f'a={d}' 'a=10'
This difference is required because otherwise you would not be able to
use variables as index values:
>>> a = 'b' >>> f'a={d}' 'a=20'
See for a further discussion. It was this observation that led to
full Python expressions being supported in f-strings.
Furthermore, the limited expressions that str.format() understands
need not be valid Python expressions. For example:
>>> '{i}'.format(i={'";':4}) '4'
Как изменить или удалить строку?
Строки относятся к неизменяемым типам данных (immutable type). Это означает, что элементы строки не могут быть изменены после того, как она была создана. Мы можем просто переназначить разные строки одному и тому же имени.
>>> my_string = 'programfiles' >>> my_string = 'a' ... TypeError: 'str' object does not support item assignment >>> my_string = 'Python' >>> my_string ‘Python'
Мы не можем удалять символы из строки. Но полностью удалить строку можно с помощью ключевого слова del.
>>> del my_string ... TypeError: 'str' object doesn't support item deletion >>> del my_string >>> my_string ... NameError: name 'my_string' is not defined
Triple Quotes
Python’s triple quotes comes to the rescue by allowing strings to span multiple lines, including verbatim NEWLINEs, TABs, and any other special characters.
The syntax for triple quotes consists of three consecutive single or double quotes.
#!/usr/bin/python para_str = """this is a long string that is made up of several lines and non-printable characters such as TAB ( \t ) and they will show up that way when displayed. NEWLINEs within the string, whether explicitly given like this within the brackets , or just a NEWLINE within the variable assignment will also show up. """ print para_str
When the above code is executed, it produces the following result. Note how every single special character has been converted to its printed form, right down to the last NEWLINE at the end of the string between the «up.» and closing triple quotes. Also note that NEWLINEs occur either with an explicit carriage return at the end of a line or its escape code (\n) −
this is a long string that is made up of several lines and non-printable characters such as TAB ( ) and they will show up that way when displayed. NEWLINEs within the string, whether explicitly given like this within the brackets , or just a NEWLINE within the variable assignment will also show up.
Raw strings do not treat the backslash as a special character at all. Every character you put into a raw string stays the way you wrote it −
#!/usr/bin/python print 'C:\\nowhere'
When the above code is executed, it produces the following result −
C:\nowhere
Now let’s make use of raw string. We would put expression in r’expression’ as follows −
#!/usr/bin/python print r'C:\\nowhere'
When the above code is executed, it produces the following result −
C:\\nowhere
What is String in Python?
A string is a sequence of characters.
A character is simply a symbol. For example, the English language has 26 characters.
Computers do not deal with characters, they deal with numbers (binary). Even though you may see characters on your screen, internally it is stored and manipulated as a combination of 0s and 1s.
This conversion of character to a number is called encoding, and the reverse process is decoding. ASCII and Unicode are some of the popular encodings used.
In Python, a string is a sequence of Unicode characters. Unicode was introduced to include every character in all languages and bring uniformity in encoding. You can learn about Unicode from Python Unicode.
Как выбрать хороший навигатор для автомобиля?
Разделение строки при помощи последовательно идущих разделителей
Если вы для разделения строки используете метод и не указываете разделитель, то разделителем считается пробел. При этом последовательно идущие пробелы трактуются как один разделитель.
Но если вы указываете определенный разделитель, ситуация меняется. При работе метода будет считаться, что последовательно идущие разделители разделяют пустые строки. Например, .
Если вам нужно, чтобы последовательно
идущие разделители все-таки трактовались
как один разделитель, нужно воспользоваться
регулярными выражениями. Разницу можно
видеть в примере:
import re print('Hello1111World'.split('1')) print(re.split('1+', 'Hello1111World' ))
Результат:
Методы для работы со строками
Кроме функций, для работы со строками есть немало методов:
- – возвращает индекс первого вхождения подстроки в s или -1 при отсутствии. Поиск идет в границах от до ;
- – аналогично, но возвращает индекс последнего вхождения;
- – меняет последовательность символов на новую подстроку ;
- – разбивает строку на подстроки при помощи выбранного разделителя x;
- – соединяет строки в одну при помощи выбранного разделителя x;
- – убирает пробелы с обеих сторон;
- – убирает пробелы только слева или справа;
- – перевод всех символов в нижний регистр;
- – перевод всех символов в верхний регистр;
- – перевод первой буквы в верхний регистр, остальных – в нижний.
Примеры использования:
Как активировать режим разработчика на телефоне андроид
Почему Вам нужно обратиться именно к нам?
Скорость
Буква f в f-strings может также означать и “fast”. Наши f-строки заметно быстрее чем % и () форматирования. Как мы уже видели, f-строки являются выражениями, которые оцениваются по мере выполнения, а не постоянные значения. Вот выдержка из документации:
Во время выполнения, выражение внутри фигурных скобок оценивается в собственной области видимости Python и затем сопоставляется со строковой литеральной частью f-строки. После этого возвращается итоговая строка. В целом, это все.
Рассмотрим сравнение скорости:
Python
>>> import timeit
>>> timeit.timeit(«»»name = «Eric»
… age = 74
… ‘%s is %s.’ % (name, age)»»», number = 10000)
0.003324444866599663
1 |
>>>importtimeit >>>timeit.timeit(«»»name = «Eric» … age = 74 … ‘%s is %s.’ % (name, age)»»»,number=10000) |
Python
>>> timeit.timeit(«»»name = «Eric»
… age = 74
… ‘{} is {}.’.format(name, age)»»», number = 10000)
0.004242089427570761
1 |
>>>timeit.timeit(«»»name = «Eric» … age = 74 … ‘{} is {}.’.format(name, age)»»»,number=10000) |
Python
>>> timeit.timeit(«»»name = «Eric»
… age = 74
… f'{name} is {age}.'»»», number = 10000)
0.0024820892040722242
1 |
>>>timeit.timeit(«»»name = «Eric» … age = 74 … f'{name} is {age}.'»»»,number=10000) |
Как вы видите, f-строки являются самыми быстрыми.
Однако, суть не всегда в этом. После того, как они реализуются первыми, у них есть определенные проблемы со скоростью и их нужно сделать быстрее, чем str.format(). Для этого был предоставлен специальный опкод BUILD_STRING.
#3 Интерполяция строк / f-Строки (Python 3.6+)
Python 3.6 Добавил новый подход форматирования строк под названием форматированные строчные литералы, или “f-строки”. Этот новый способ форматирования строк позволяет вам использовать встроенные выражения Python внутрь строковых констант. Вот простой, наглядный пример:
Python
name = ‘Bob’
print(f’Hello, {name}!’)
# Вывод: ‘Hello, Bob!’
1 |
name=’Bob’ print(f’Hello, {name}!’) |
Как вы видите, это добавляет префикс к константе строки с буквой “f” — следовательно, названием становится “f-strings”. Этот новый синтаксис форматирования — очень мощный. Так как вы можете вставлять произвольные выражения Python, вы можете даже проводить встроенную арифметику. Посмотрим на пример:
Python
a = 5
b = 10
print(f’Five plus ten is {a + b} and not {2 * (a + b)}.’)
# Вывод: ‘Five plus ten is 15 and not 30.’
1 |
a=5 b=10 print(f’Five plus ten is {a + b} and not {2 * (a + b)}.’) |
Форматированные строчные литералы — это особенность парсера Python, которая конвертирует в серию строчных констант и выражений. Затем, они соединяются и составляют итоговую строку.
Представьте, что у вас есть следующая функция greet(), которая содержит :
Python
def greet(name, question):
return f»Hello, {name}! How’s it {question}?»
print(greet(‘Bob’, ‘going’))
# Вывод: «Hello, Bob! How’s it going?»
1 |
defgreet(name,question) returnf»Hello, {name}! How’s it {question}?» print(greet(‘Bob’,’going’)) |
Когда вы разбираете функцию, и смотрите, что происходит за кулисами, вы увидите, что f-строка в функции трансформируется в нечто, похожее на следующее:
Python
def greet(name, question):
return «Hello, » + name + «! How’s it » + question + «?»
1 |
defgreet(name,question) return»Hello, «+name+»! How’s it «+question+»?» |
Python
>>> import dis
>>> dis.dis(greet)
2 0 LOAD_CONST 1 (‘Hello, ‘)
2 LOAD_FAST 0 (name)
4 FORMAT_VALUE 0
6 LOAD_CONST 2 («! How’s it «)
8 LOAD_FAST 1 (question)
10 FORMAT_VALUE 0
12 LOAD_CONST 3 (‘?’)
14 BUILD_STRING 5
16 RETURN_VALUE
1 |
>>>importdis >>>dis.dis(greet) 2LOAD_CONST1(‘Hello, ‘) 2LOAD_FAST(name) 4FORMAT_VALUE 6LOAD_CONST2(«! How’s it «) 8LOAD_FAST1(question) 10FORMAT_VALUE 12LOAD_CONST3(‘?’) 14BUILD_STRING5 16RETURN_VALUE |
Строчные литералы также поддерживают существующий синтаксис формата строк метода str.format(). Это позволяет вам решать те же проблемы с форматированием, которые мы рассматривали в двух предыдущих разделах:
Python
print(f»Hey {name}, there’s a {errno:#x} error!»)
# Вывод: «Hey Bob, there’s a 0xbadc0ffee error!»
1 |
print(f»Hey {name}, there’s a {errno:#x} error!») |
Новые форматированные строчные литералы аналогичны шаблонным литералам (Template Literals) в JavaScript, которые были добавлены в ES2015. Я думаю это достаточно хорошее нововведение в Python, и я бы с радостью пользовался ими на каждодневной основе (в Python 3). Вы можете узнать больше о форматированных строчных литералах в интернете.
Нарезка строк
Одной из тем, которую вы часто будете делать на практике, является нарезка строк. Помню, меня удивило то, как часто мне нужно было узнать, как это делается в повседневной работе. Давайте посмотрим, как нарезка сработает в следующей строке:
Python
my_string = «I like Python!»
1 | my_string=»I like Python!» |
Каждый символ в строке может стать доступным при помощи слайсинга (нарезки). Например, если вам нужно взять только первый символ, вы можете сделать это следующим образом:
Python
print( my_string ) # I
1 | print(my_string1)# I |
Таким образом, мы берем первый символ в строке до второго символа, но, не включая его. Да, в Python отсчет ведется с нуля. Это проще понять, если мы определим позицию каждого символа в таблице:
Python
0 1 2 3 4 5 6 7 8 9 10 11 12 13 — I l i k e P y t h o n !
1 | 12345678910111213-IlikePython! |
Таким образом, у нас есть строка длиной в 14 символов, начиная с нуля и до тринадцати. Давайте приведем несколько примеров, чтобы понять это лучше.
Python
my_string # ‘I’
my_string # ‘I like Pytho’
my_string # ‘I like Python’
my_string # ‘I like Python!’
my_string # ‘I like Py’
my_string # ‘I like Python!’
my_string # ‘like Python!’
1 |
my_string1# ‘I’ my_string12# ‘I like Pytho’ my_string13# ‘I like Python’ my_string14# ‘I like Python!’ my_string-5# ‘I like Py’ my_string# ‘I like Python!’ my_string2# ‘like Python!’ |
Как видно в данных примерах, мы можем назначить срез, лишь указав его начало (другими словами, my_string), конец среза (my_string), или оба (my_string). Мы можем даже использовать отрицательные значения, которые начинаются с конца строки. Так что в примере, где мы указали my_string, начало ведется с нуля и заканчивается 5 символами, перед концом строки. Вы можете задаться вопросом «Зачем мне это и где это можно применить?». Лично я использовал это для разбора записей с фиксированной шириной в файлах, или ситуативно для парсинга сложных названий файлов, с очень специфическими наименованиями. Также я использовал это для парсинга значений в бинарных файлах. Любая работа, которая включает в себя обработку текстовых файлов, может быть намного проще, если вы понимаете, как работает нарезка и как эффективно использовать данный инструмент. Вы также можете получить доступ к отдельным символам в строке с помощью индексации. Например:
Python
print(my_string) # I
1 | print(my_string)# I |
Данный код выдаст первый символ в строке.
Python F-Строки: Детали
На данный момент мы узнали почему f-строки так хороши, так что вам уже может быть интересно их попробовать в работе. Рассмотрим несколько деталей, которые нужно учитывать:
Кавычки
Вы можете использовать несколько типов кавычек внутри выражений. Убедитесь в том, что вы не используете один и тот же тип кавычек внутри и снаружи f-строки.
Этот код будет работать:
Python
print(f»{‘Eric Idle’}»)
# Вывод: ‘Eric Idle’
1 |
print(f»{‘Eric Idle’}») # Вывод: ‘Eric Idle’ |
И этот тоже:
Python
print(f'{«Eric Idle»}’)
# Вывод: ‘Eric Idle’
1 |
print(f'{«Eric Idle»}’) # Вывод: ‘Eric Idle’ |
Вы также можете использовать тройные кавычки:
Python
print(f»»»Eric Idle»»»)
# Вывод: ‘Eric Idle’
1 |
print(f»»»Eric Idle»»») # Вывод: ‘Eric Idle’ |
Python
print(f»’Eric Idle»’)
# Вывод: ‘Eric Idle’
1 |
print(f»’Eric Idle»’) # Вывод: ‘Eric Idle’ |
Если вам понадобиться использовать один и тот же тип кавычек внутри и снаружи строки, вам может помочь :
Python
print(f»The \»comedian\» is {name}, aged {age}.»)
# Вывод: ‘The «comedian» is Eric Idle, aged 74.’
1 |
print(f»The \»comedian\» is {name}, aged {age}.») # Вывод: ‘The «comedian» is Eric Idle, aged 74.’ |
Словари
Говоря о кавычках, будьте внимательны при работе со . Вы можете вставить значение словаря по его ключу, но сам ключ нужно вставлять в одиночные кавычки внутри f-строки. Сама же f-строка должна иметь двойные кавычки.
Вот так:
Python
comedian = {‘name’: ‘Eric Idle’, ‘age’: 74}
print(f»The comedian is {comedian}, aged {comedian}.»)
# Вывод: The comedian is Eric Idle, aged 74.
1 |
comedian={‘name»Eric Idle’,’age’74} print(f»The comedian is {comedian}, aged {comedian}.») # Вывод: The comedian is Eric Idle, aged 74. |
Обратите внимание на количество возможных проблем, если допустить ошибку в синтаксисе SyntaxError:
Python
>>> comedian = {‘name’: ‘Eric Idle’, ‘age’: 74}
>>> f’The comedian is {comedian}, aged {comedian}.’
File «<stdin>», line 1
f’The comedian is {comedian}, aged {comedian}.’
^
SyntaxError: invalid syntax
1 |
>>>comedian={‘name»Eric Idle’,’age’74} >>>f’The comedian is {comedian}, aged {comedian}.’ File»<stdin>»,line1 f’The comedian is {comedian}, aged {comedian}.’ ^ SyntaxErrorinvalid syntax |
Если вы используете одиночные кавычки в ключах словаря и снаружи f-строк, тогда кавычка в начале ключа словаря будет интерпретирован как конец строки.
Скобки
Чтобы скобки появились в вашей строке, вам нужно использовать двойные скобки:
Python
print(f»`74`»)
# Вывод: ‘{ 74 }’
1 |
print(f»`74`») |
Обратите внимание на то, что использование тройных скобок приведет к тому, что в строке будут только одинарные:
Python
print( f»{`74`}» )
# Вывод: ‘{ 74 }’
1 |
print(f»{`74`}») |
Однако, вы можете получить больше отображаемых скобок, если вы используете больше, чем три скобки:
Python
print(f»{{`74`}}»)
# Вывод: ‘`74`’
1 |
print(f»{{`74`}}») |
Бэкслеши
Как вы видели ранее, вы можете использовать бэкслеши в части строки f-string. Однако, вы не можете использовать бэкслеши в части выражения f-string:
Python
>>> f»{\»Eric Idle\»}»
File «<stdin>», line 1
f»{\»Eric Idle\»}»
^
SyntaxError: f-string expression part cannot include a backslash
1 |
>>>f»{\»Eric Idle\»}» File»<stdin>»,line1 f»{\»Eric Idle\»}» ^ SyntaxErrorf-stringexpression part cannot includeabackslash |
Вы можете проработать это, оценивая выражение заранее и используя результат в f-строк:
Python
name = «Eric Idle»
print(f»{name}»)
# Вывод: ‘Eric Idle’
1 |
name=»Eric Idle» print(f»{name}») |
Междустрочные комментарии
Выражения не должны включать комментарии с использованием символа #. В противном случае, у вас будет ошибка синтаксиса SyntaxError:
Python
>>> f»Eric is {2 * 37 #Oh my!}.»
File «<stdin>», line 1
f»Eric is {2 * 37 #Oh my!}.»
^
SyntaxError: f-string expression part cannot include ‘#’
1 |
>>>f»Eric is {2 * 37 #Oh my!}.» File»<stdin>»,line1 f»Eric is {2 * 37 #Oh my!}.» ^ SyntaxErrorf-stringexpression part cannot include’#’ |
Произвольные выражения
Так как f-строки оцениваются по мере выражения, вы можете внести любую или все доступные выражения Python в них. Это позволит вам делать интересные вещи, например следующее:
Python
print(f»{2 * 37}»)
# Вывод: ’74’
1 |
print(f»{2 * 37}») # Вывод: ’74’ |
Также вы можете вызывать функции. Пример:
Python
def to_lowercase(input):
return input.lower()
name = «Eric Idle»
print(f»{to_lowercase(name)} is funny.»)
# Вывод: ‘eric idle is funny.’
1 |
defto_lowercase(input) returninput.lower() name=»Eric Idle» print(f»{to_lowercase(name)} is funny.») # Вывод: ‘eric idle is funny.’ |
Также вы можете вызывать метод напрямую:
Python
print(f»{name.lower()} is funny.»)
# Вывод: ‘eric idle is funny.’
1 |
print(f»{name.lower()} is funny.») # Вывод: ‘eric idle is funny.’ |
Вы даже можете использовать объекты, созданные из классов при помощи f-строки. Представим, что у вас есть следующий класс:
Python
class Comedian:
def __init__(self, first_name, last_name, age):
self.first_name = first_name
self.last_name = last_name
self.age = age
def __str__(self):
return f»{self.first_name} {self.last_name} is {self.age}.»
def __repr__(self):
return f»{self.first_name} {self.last_name} is {self.age}. Surprise!»
1 |
classComedian def__init__(self,first_name,last_name,age) self.first_name=first_name self.last_name=last_name self.age=age def__str__(self) returnf»{self.first_name} {self.last_name} is {self.age}.» def__repr__(self) returnf»{self.first_name} {self.last_name} is {self.age}. Surprise!» |
Вы могли бы сделать следующее:
Python
new_comedian = Comedian(«Eric», «Idle», «74»)
print(f»{new_comedian}»)
# Вывод: ‘Eric Idle is 74.’
1 |
new_comedian=Comedian(«Eric»,»Idle»,»74″) print(f»{new_comedian}») # Вывод: ‘Eric Idle is 74.’ |
Методы __str__() и __repr__() работают с тем, как объекты отображаются в качестве строк, так что вам нужно убедиться в том, что вы используете один из этих методов в вашем определении класса. Если вы хотите выбрать один, попробуйте __repr__(), так как его можно использовать вместо __str__().
Строка, которая возвращается __str__() является неформальным строковым представлением объекта и должна быть читаемой. Строка, которую вернул __str__() — это официальное выражение и должно быть однозначным. При вызове str() и repr(), предпочтительнее использовать __str__() и __repr__() напрямую.
По умолчанию, f-строки будут использовать __str__(), но вы должны убедиться в том, что они используют __repr__(), если вы включаете флаг преобразования !r:
Python
print(f»{new_comedian}»)
# Вывод: ‘Eric Idle is 74.’
print(f»{new_comedian!r}»)
# Вывод: ‘Eric Idle is 74. Surprise!’
1 |
print(f»{new_comedian}») # Вывод: ‘Eric Idle is 74.’ print(f»{new_comedian!r}») # Вывод: ‘Eric Idle is 74. Surprise!’ |
Если вы хотите прочитать часть обсуждения, в результате которого f-strings поддерживают полные выражения Python, вы можете сделать это здесь.
Форматирование строк
Форматирование строк (также известно как замещение) – это замещение значений в базовой строке. Большую часть времени вы будете вставлять строки внутри строк, однако, вам также понадобиться вставлять целые числа и числа с запятыми в строки весьма часто. Существует два способа достичь этой цели. Начнем с старого способа, после чего перейдем к новому:
Python
# -*- coding: utf-8 -*-
my_string = «Я люблю %s» % «Python»
print(my_string) # Я люблю Python
var = «яблоки»
newString = «Я ем %s» % var
print(newString) # Я ем яблоки
another_string = «Я люблю %s и %s» % («Python», var)
print(another_string) # Я люблю Python и яблоки
1 |
# -*- coding: utf-8 -*- my_string=»Я люблю %s»%»Python» print(my_string)# Я люблю Python var=»яблоки» newString=»Я ем %s»%var print(newString)# Я ем яблоки another_string=»Я люблю %s и %s»%(«Python»,var) print(another_string)# Я люблю Python и яблоки |
Как вы могли догадаться, % — это очень важная часть вышеописанного кода. Этот символ указывает Python, что вы скоро вставите текст на его место. Если вы будете следовать за строкой со знаком процента и другой строкой или переменной, тогда Python попытается вставить ее в строку. Вы можете вставить несколько строк, добавив несколько знаков процента в свою строку. Это видно в последнем примере
Обратите внимание на то, что когда вы добавляете больше одной строки, вам нужно закрыть эти строки в круглые скобки. Теперь взглянем на то, что случится, если мы вставим недостаточное количество строк:
Python
another_string = «Я люблю %s и %s» % «Python»
Traceback (most recent call last):
File «<string>», line 1, in <fragment>
TypeError: not enough arguments for format string
1 |
another_string=»Я люблю %s и %s»%»Python» Traceback(most recent call last) File»<string>»,line1,in<fragment> TypeErrornotenough arguments forformatstring |
О-па. Мы не передали необходимое количество аргументов для форматирования строки. Если вы внимательно взгляните на пример, вы увидите, что у нас есть два экземпляра %, но для того, чтобы вставить строки, вам нужно передать столько же %, сколько у нас строк. Теперь вы готовы к тому, чтобы узнать больше о вставке целых чисел, и чисел с запятыми. Давайте взглянем.
Python
my_string = «%i + %i = %i» % (1,2,3)
print(my_string) # ‘1 + 2 = 3’
float_string = «%f» % (1.23)
print(float_string) # ‘1.230000’
float_string2 = «%.2f» % (1.23)
print(float_string2) # ‘1.23’
float_string3 = «%.2f» % (1.237)
print(float_string3) # ‘1.24’
1 |
my_string=»%i + %i = %i»%(1,2,3) print(my_string)# ‘1 + 2 = 3’ float_string=»%f»%(1.23) print(float_string)# ‘1.230000’ float_string2=»%.2f»%(1.23) print(float_string2)# ‘1.23’ float_string3=»%.2f»%(1.237) print(float_string3)# ‘1.24’ |
Первый пример достаточно простой. Мы создали строку, которая принимает три аргумента, и мы передаем их. В случае, если вы еще не поняли, Python не делает никаких дополнений в первом примере. Во втором примере, мы передаем число с запятой
Обратите внимание на то, что результат включает множество дополнительных нулей (1.230000). Нам это не нужно, так что мы указываем Python ограничить выдачу до двух десятичных значений в третьем примере (“%.2f”)
Последний пример показывает, что Python округлит числа для вас, если вы передадите ему дробь, что лучше, чем два десятичных значения. Давайте взглянем на то, что произойдет, если мы передадим неправильные данные:
Python
int_float_err = «%i + %f» % («1», «2.00»)
Traceback (most recent call last):
File «<string>», line 1, in <fragment>
TypeError: %d format: a number is required, not str
1 |
int_float_err=»%i + %f»%(«1″,»2.00») Traceback(most recent call last) File»<string>»,line1,in<fragment> TypeError%dformatanumber isrequired,notstr |
В данном примере мы передали две строки вместо целого числа и дроби. Это привело к ошибке TypeError, что говорит нам о том, что Python ждал от нас чисел. Это указывает на отсутствие передачи целого числа, так что мы исправим это, по крайней мере, попытаемся:
Python
int_float_err = «%i + %f» % (1, «2.00»)
Traceback (most recent call last):
File «<string>», line 1, in <fragment>
TypeError: float argument required, not str
1 |
int_float_err=»%i + %f»%(1,»2.00″) Traceback(most recent call last) File»<string>»,line1,in<fragment> TypeErrorfloatargument required,notstr |
Мы получили ту же ошибку, но под другим предлогом, в котором написано, что мы должны передать дробь. Как мы видим, Python предоставляет нам полезную информацию о том, что же пошло не так и как это исправить. Если вы исправите вложения надлежащим образом, тогда вы сможете запустить этот пример. Давайте перейдем к новому методу форматирования строк.
Postmypost
String Special Operators
Assume string variable a holds ‘Hello’ and variable b holds ‘Python’, then −
Operator | Description | Example |
---|---|---|
+ | Concatenation — Adds values on either side of the operator | a + b will give HelloPython |
* | Repetition — Creates new strings, concatenating multiple copies of the same string |
a*2 will give -HelloHello |
[] | Slice — Gives the character from the given index | a will give e |
Range Slice — Gives the characters from the given range | a will give ell | |
in | Membership — Returns true if a character exists in the given string | H in a will give 1 |
not in | Membership — Returns true if a character does not exist in the given string | M not in a will give 1 |
r/R | Raw String — Suppresses actual meaning of Escape characters. The syntax for raw strings is exactly the same as for normal strings with the exception of the raw string operator, the letter «r,» which precedes the quotation marks. The «r» can be lowercase (r) or uppercase (R) and must be placed immediately preceding the first quote mark. | print r’\n’ prints \n and print R’\n’prints \n |
% | Format — Performs String formatting | See at next section |