6.4.1. Методы split и join
Любой разработчик, которому доводилось работать со строками, наверняка посчи-тает методы split и join бесценными. По сути они противоположны друг другу: split возвращает список подстрок, а join берет список строк и объединяет их в одну строку, вставляя исходную строку между каждой парой элементов. Обычно split
использует символы-пропуски в качестве разделителя при разбиении, но это по-ведение можно изменить при помощи необязательного аргумента. Конкатенация строк оператором + полезна, но она неэффективна для объединения большого количества строк в одну строку, потому что при каждом применении + создается новый объект строки. В предыдущем примере «Hello, World» создаются три строковых объекта, один из которых будет немедленно отброшен. Лучше вос-пользоваться функцией join :
>>> " ".join(["join", "puts", "spaces", "between", "elements"]) 'join puts spaces between elements'
Изменяя строку, используемую для вызова join , можно разместить между объ-единяемыми строками практически любые символы: >>> "::".join(["Separated", "with", "colons"])
'Separated::with::colons'
Для объединения элементов списка может использоваться даже пустая строка: >>> "".join(["Separated", "by", "nothing"])
'Separatedbynothing'
Пожалуй, на практике метод split чаще всего используется в качестве простого механизма разбора разделенных данных, хранящихся в текстовых файлах. По умол-чанию split осуществляет разбивку по пропускам, а не по одиночным пробелам, но вы также можете приказать методу разбивать текст по конкретной последователь-ности символов, которая передается в необязательном аргументе: >>> x = "You\t\t can have tabs\t\n \t and newlines \n\n " \ "mixed in"
>>> x.split()
['You', 'can', 'have', 'tabs', 'and', 'newlines', 'mixed', 'in'] >>> x = "Mississippi"
>>> x.split("ss")
['Mi', 'i', 'ippi']
Иногда бывает полезно разрешить, чтобы последнее поле объединенной строки содержало произвольный текст — возможно, даже с подстроками, которые могли бы совпасть с разделителями при чтении этих данных. Для этого можно указать, сколько разбиений должен выполнить метод split при генерировании результатов при помощи второго необязательного аргумента. Если передать в этом аргументе n , метод split будет обрабатывать входную строку, пока не проведет n разбиений (и сгенерирует список, элементами которого являются n +1 подстрок) или пока не кончится строка. Несколько примеров:
>>> x = 'a b c d'
>>> x.split(' ', 1)
['a', 'b c d']
>>> x.split(' ', 2)
['a', 'b', 'c d']
>>> x.split(' ', 9)
['a', 'b', 'c', 'd']
При использовании split со вторым необязательным аргументом необходимо за-дать первый аргумент. Чтобы метод split выполнял разбиение по пропускам и при этом использовал второй аргумент, передайте None в первом аргументе. Я очень часто использую методы split и join — чаще всего при работе с текстовыми файлами, сгенерированными другими программами. Если вы захотите генерировать более стандартные выходные файлы в своих программах, хорошими кандидатами станут модули csv и json из стандартной библиотеки Python.
БЫСТРАЯ.ПРОВЕРКА:.SPLIT.И.JOIN
Как использовать методы split и join для замены всех пропусков в строке x дефисами — например, преобразовать "this is a test" в "this-is-a-test" ?
6.4.2. Преобразование строк в числа
Функции int и foat преобразуют строки в целые числа или числа с плавающей точкой соответственно. Если функциям передается строка, которая не может интерпретироваться как число заданного типа, эти функции выдают исключение ValueError . Исключения рассматриваются в главе 14. Кроме того, int можно передать необязательный второй аргумент с основанием системы счисления, которая должна использоваться при интерпретации входной строки:
>>> float('123.456')
123.456
>>> float('xxyy')
Traceback (innermost last):
File "", line 1, in ?
ValueError: could not convert string to float: 'xxyy'
>>> int('3333')
3333
>>> int('123.456')
Целое число не может содержать точку
Traceback (innermost last):
File "", line 1, in ?
ValueError: invalid literal for int() with base 10: '123.45 >>> int('10000', 8)
10000 интерпретируется как восьмеричное число 4096
>>> int('101', 2)
5
>>> int('ff', 16)
255
>>> int('123456', 6) 123456 не может интерпретироваться как числоTraceback (innermost last):
в шестеричной системе счисленияFile "", line 1, in ?
ValueError: invalid literal for int() with base 6: '123456' А вы поняли причину последней ошибки? Я затребовала, чтобы строка интерпрети-ровалась как число в системе счисления с основанием 6, но цифра 6 в шестеричном числе присутствовать не может. Хитро!
Читать дальше