питон. Получаем длину строки с помощью функции len. Получаем длину строки с помощью функции len() Функция len()
Скачать 26.37 Kb.
|
Получаем длину строки с помощью функции len() Функция len() подсчитывает символы в строке: >>> len(letters) 26 >>> empty = "" >>> len(empty) poem = '''There was a young lady named Bright, ... Whose speed was far faster than light; ... She started one day ... In a relative way, ... And returned on the previous night.''' >>> len(poem) 150 Объединяем строки с помощью функции join() >>> crypto_list = ['Yeti', 'Bigfoot', 'Loch Ness Monster'] >>> crypto_string = ', '.join(crypto_list) >>> print('Found and signing book deals:', crypto_string) Found and signing book deals: Yeti, Bigfoot, Loch Ness Monster Разделяем строку с помощью функции split() В отличие от функции len() некоторые функции характерны только для строк. Для того чтобы использовать строковую функцию, введите имя строки, точку, имя функции и аргументы, которые нужны функции: строка. функция(аргументы). Вы можете использовать встроенную функцию split(), чтобы разбить строку на список небольших строк, основываясь на разделителе. Список — это последовательность значений, разделенных запятыми и окруженных квадратными скобками: >>> todos = 'get gloves,get mask,give cat vitamins,call ambulance' >>> todos.split(',') ['get gloves', 'get mask', 'give cat vitamins', 'call ambulance'] В предыдущем примере строка имела имя todos, а строковая функция называлась split() и получала один аргумент ','. Если вы не укажете разделитель, функция split() будет использовать любую последовательность пробелов, а также символы новой строки и табуляцию: >>> todos.split() ['get', 'gloves,get', 'mask,give', 'cat', 'vitamins,call', 'ambulance'] 66 Глава 2. Ингредиенты Python: числа, строки и переменные Если вы вызываете функцию split без аргументов, вам все равно нужно добавлять круглые скобки — именно так Python узнает, что вы вызываете функцию. Развлекаемся со строками Python содержит большой набор функций для работы со строками. Рассмотрим принцип работы самых распространенных из них. Объектом для тестов станет следующая строка, содержащая текст бессмертного стихотворения What Is Liquid? Маргарет Кэвендиш (Margaret Cavendish), графини Ньюкасл: >>> poem = '''All that doth flow we cannot liquid name Or else would fire and water be the same; But that is liquid which is moist and wet Fire that property can never get. Then 'tis not cold that doth the fire put out But 'tis the wet that makes it die, no doubt.''' Для начала получим первые 13 символов (их смещения лежат в диапазоне от 0 до 12): >>> poem[:13] 'All that doth' Сколько символов содержит это стихотворение? (Пробелы и символы новой строки учитываются.) >>> len(poem) 250 Начинается ли стихотворение с буквосочетания All? >>> poem.startswith('All') True Строки 67 Заканчивается ли оно буквосочетанием That's all, folks!? >>> poem.endswith('That\'s all, folks!') False Найдем смещение первого включения слова the: >>> word = 'the' >>> poem.find(word) 73 А теперь — последнего: >>> poem.rfind(word) 214 Сколько раз встречается трехбуквенное сочетание the? >>> poem.count(word) 3 Являются ли все символы стихотворения буквами или цифрами? >>> poem.isalnum() False Нет, в стихотворении имеются еще и знаки препинания В качестве подопытной выберем следующую строку: >>> setup = 'a duck goes into a bar...'Удалим символ «.» с обоих концов строки: >>> setup.strip('.') 'a duck goes into a bar' Заменяем символы с помощью функции replace() Вы можете использовать функцию replace() для того, чтобы заменить одну подстроку другой. Вы передаете в эту функцию старую подстроку, новую подстроку и количество включений старой подстроки, которое нужно заменить. Если вы опустите последний аргумент, будут заменены все включения. В этом примере совпадает с заданным значением и заменяется следующая строка: >>> setup.replace('duck', 'marmoset') 'a marmoset goes into a bar...' Заменим максимум 100 включений: >>> setup.replace('a ', 'a famous ', 100) 'a famous duck goes into a famous bar...' Создание списков с помощью оператора [] или метода list() Список можно создать из нуля или более элементов, разделенных запятыми и заключенных в квадратные скобки: >>> empty_list = [ ] >>> weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] >>> big_birds = ['emu', 'ostrich', 'cassowary'] >>> first_names = ['Graham', 'John', 'Terry', 'Terry', 'Michael'] Кроме того, с помощью функции list() можно создать пустой список: >>> another_empty_list = list() >>> another_empty_list Преобразование других типов данных в списки с помощью функции list() Функция list() преобразует другие типы данных в списки. В следующем примере строка преобразуется в список, состоящий из односимвольных строк: >>> list('cat') ['c', 'a', 't'] Синтаксис создания кортежей несколько необычен, как мы увидим в следующих примерах. Начнем с создания пустого кортежа с помощью оператора (): >>> empty_tuple = () >>> empty_tuple () Чтобы создать кортеж, содержащий один элемент или более, ставьте после каждого элемента запятую. Это вариант для кортежей с одним элементом: >>> one_marx = 'Groucho', >>> one_marx ('Groucho',) Если в вашем кортеже более одного элемента, ставьте запятую после каждого из них, кроме последнего: >>> marx_tuple = 'Groucho', 'Chico', 'Harpo' >>> marx_tuple ('Groucho', 'Chico', 'Harpo') При отображении кортежа Python Создание словаря с помощью {} Чтобы создать словарь, вам нужно обернуть в фигурные скобки ({}) разделенные запятыми пары ключ : значение. Самым простым словарем является пустой словарь, не содержащий ни ключей, ни значений: >>> empty_dict = {} >>> empty_dict {} Создадим небольшой словарь, включающий цитаты из «Словаря сатаны» Амброза Бирса: >>> bierce = { ... "day": "A period of twenty-four hours, mostly misspent", ... "positive": "Mistaken at the top of one's voice", ... "misfortune": "The kind of fortune that never misses", ... } >>> Ввод имени словаря в интерактивный интерпретатор выведет все его ключи и значения: >>> bierce {'misfortune': 'The kind of fortune that never misses', 'positive': "Mistaken at the top of one's voice", 'day': 'A period of twenty-four hours, mostly misspent'} Преобразование других типов данных с помощью функции set() Вы можете создать множество из списка, строки, кортежа или словаря, потеряв все повторяющиеся значения. Для начала взглянем на строку, которая содержит более чем одно включение некоторых букв: >>> set('letters') {'l', 'e', 't', 'r', 's'} Обратите внимание на то, что множество содержит только одно включение букв «e» или «t», несмотря на то, что в слове letters по два включения каждой из них. Создадим множество из списка: >>> set(['Dasher', 'Dancer', 'Prancer', 'Mason-Dixon']) {'Dancer', 'Dasher', 'Prancer', 'Mason-Dixon'} А теперь из кортежа: >>> set(('Ummagumma', 'Echoes', 'Atom Heart Mother')) {'Ummagumma', 'Atom Heart Mother', 'Echoes'} Проверяем на наличие значения с помощью ключевого слова in Такое использование множеств самое распространенное. Мы создадим словарь, который называется drinks. Каждый ключ будет названием коктейля, а соответствующие значения — множествами ингредиентов: >>> drinks = { ... 'martini': {'vodka', 'vermouth'}, ... 'black russian': {'vodka', 'kahlua'}, ... 'white russian': {'cream', 'kahlua', 'vodka'}, ... 'manhattan': {'rye', 'vermouth', 'bitters'}, ... 'screwdriver': {'orange juice', 'vodka'} ... } Несмотря на то что и словарь, и множества окружены фигурными скобками ({ и }), множество — это всего лишь последовательность значений, а словарь — это набор пар «ключ — значение». Какой из коктейлей содержит в себе водку? (Обратите внимание на то, что для выполнения этих проверок я заранее демонстрирую использование ключевых слов for, if, and и or, которые будут рассмотрены только в следующей главе.) >>> for name, contents in drinks.items(): ... if 'vodka' in contents: ... print(name) ... screwdriver martini black russian white russian Мы хотим выпить коктейль с водкой, но не переносим лактозу, а вермут на вкус напоминает керосин: >>> for name, contents in drinks.items(): ... if 'vodka' in contents and not ('vermouth' in contents or ... 'cream' in contents): ... print(name) ... screwdriver black russian Перепишем этот пример чуть более сжато в следующем разделе. Комбинации и операторы Что, если вам нужно проверить наличие сразу нескольких значений множества? Предположим, вы хотите найти любой напиток, содержащий апельсиновый сок или вермут. Для этого мы используем оператор пересечения множеств (&): >>> for name, contents in drinks.items(): ... if contents & {'vermouth', 'orange juice'}: ... print(name) ... screwdriver martini manhattan Результатом работы оператора & является множество, содержащее все элементы, которые находятся в обоих сравниваемых списках. Если ни один из заданных ингредиентов не содержится в предлагаемых коктейлях, оператор & вернет пустое множество. Этот результат можно считать равным False if, elif (else) Если необходимо проверить более двух вариантов, используйте операторы if, elif (это значит else if — «иначе если») и else: >>> color = "puce" >>> if color == "red": ... print("It's a tomato") ... elif color == "green": ... print("It's a green pepper") ... elif color == "bee purple": ... print("I don't know what it is, but only bees can see it") ... else: ... print("I've never heard of the color", color) ... I've never heard of the color puce Итерирование по нескольким последовательностям с помощью функции zip() Существует еще один полезный прием — параллельное итерирование по нескольким последовательностям с помощью функции zip(): >>> days = ['Monday', 'Tuesday', 'Wednesday'] >>> fruits = ['banana', 'orange', 'peach'] >>> drinks = ['coffee', 'tea', 'beer'] >>> desserts = ['tiramisu', 'ice cream', 'pie', 'pudding'] >>> for day, fruit, drink, dessert in zip(days, fruits, drinks, desserts): ... print(day, ": drink", drink, "eat", fruit, "enjoy", dessert) ... Monday : drink coffee — eat banana — enjoy tiramisu Tuesday : drink tea — eat orange — enjoy ice cream Wednesday : drink beer — eat peach — enjoy pie Как и в случае с включениями списка, выделения словарей также имеют проверки if и несколько операторов for: >>> word = 'letters' >>> letter_counts = {letter: word.count(letter) for letter in word} >>> letter_counts {'l': 1, 'e': 2, 't': 2, 'r': 1, 's': 1} Мы запускаем цикл, проходя по каждой из семи букв в строке letters, и считаем, сколько раз появляется эта буква. Два наших вызова word.count(letter) — это лишь пустая трата времени, поскольку нам нужно подсчитать буквы «e» и «t» два раза. Но когда мы считаем буквы «e» во второй раз, то не причиняем вреда, поскольку лишь заменяем уже существующую запись в словаре; то же относится и к подсчету букв «t». Следующий способ решения задачи более характерен для Python: >>> word = 'letters' >>> letter_counts = {letter: word.count(letter) for letter in set(word)} >>> letter_counts {'t': 2, 'l': 1, 'e': 2, 'r': 1, 's': 1} Ключи словаря располагаются в ином, чем в предыдущем примере, порядке, поскольку итерирование по результату работы функции set(word) возвращает буквы в другом порядке, нежели итерирование по строке word. Функции Первый шаг к повторному использованию кода — это создание функций. Функция — это именованный фрагмент кода, отделенный от других. Она может принимает любое количество любых входных параметров и возвращать любое количество любых результатов. С функцией можно сделать две вещи: определить; вызвать. Чтобы определить функцию, вам нужно написать def, имя функции, входные параметры, заключенные в скобки, и, наконец, двоеточие (:). Имена функций подчиняются тем же правилам, что и имена переменных (они должны начинаться с буквы или _ и содержать только буквы, цифры или _). Напишем функцию, которая принимает аргумент и что-то с ним делает def commentary(color): ... if color == 'red': ... return "It's a tomato." ... elif color == "green": ... return "It's a green pepper." ... elif color == 'bee purple': ... return "I don't know what it is, but only bees can see it." ... else: ... return "I've never heard of the color " + color + "." ... >>> Вызовем функцию commentary(), передав ей в качестве аргумента строку 'blue'. >>> comment = commentary('blue') Функция сделает следующее: присвоит значение 'blue' параметру функции color; пройдет по логической цепочке if-elif-else; вернет строку; присвоит строку переменной comment. Что мы получим в результате? >>> print(comment) I've never heard of the color blue. Функция может принимать любое количество аргументов (включая нуль) любого типа. Она может возвращать любое количество результатов (также включая нуль) любого типа. Если функция не вызывает return явно, вызывающая сторона получит результат None. >>> print(do_nothing()) None Позиционные аргументы Python довольно гибко обрабатывает аргументы функций в сравнении с многими языками программирования. Наиболее распространенный тип аргументов — это позиционные аргументы, чьи значения копируются в соответствующие параметры согласно порядку следования. Эта функция создает словарь из позиционных входных аргументов и возвращает его: >>> def menu(wine, entree, dessert): ... return {'wine': wine, 'entree': entree, 'dessert': dessert} ... >>> menu('chardonnay', 'chicken', 'cake') {'dessert': 'cake', 'wine': 'chardonnay', 'entree': 'chicken'} Несмотря на распространенность аргументов такого типа, у них есть недостаток, который заключается в том, что вам нужно запоминать значение каждой позиции. Если бы мы вызвали функцию menu(), передав в качестве последнего аргумента марку вина, обед вышел бы совершенно другим: >>> menu('beef', 'bagel', 'bordeaux') {'dessert': 'bordeaux', 'wine': 'beef', 'entree': 'bagel'} range() в Python 3. В этом примере складываются все целые числа от 1 до 100: >>> sum(range(1, 101)) 5050 #как в Экселле от 1 до 100 Модули и оператор import (стр 143) Подсчитываем элементы с помощью функции Counter() Если говорить о счетчиках, то в стандартной библиотеке имеется счетчик, который решает задачу, показанную в предыдущем примере, и даже больше: >>> from collections import Counter >>> breakfast = ['spam', 'spam', 'eggs', 'spam'] >>> breakfast_counter = Counter(breakfast) >>> breakfast_counter Counter({'spam': 3, 'eggs': 1}) Простейший вариант использования оператора import выглядит как import модуль, где модуль — это имя другого файла Python без расширения .py. Симулируем работу метеостанции и выведем на экран отчет о погоде. Основная программа выведет на экран отчет, а отдельный модуль, содержащий одну функцию, вернет описание погоды, которое будет использовано в отчете. Основная программа выглядит так (назовем ее weatherman.py): import report description = report.get_description() print("Today's weather:", description) А ее модуль (report.py) — так: def get_description(): # смотрите строку документации """Return random weather, just like the pros""" 144 Глава 5. Py Boxes: модули, пакеты и программы from random import choice possibilities = ['rain', 'snow', 'sleet', 'fog', 'sun', 'who knows'] return choice(possibilities) Стандартная библиотека Python Ввод информации в файлы и ее вывод из них Перед тем как что-то записать в файл или считать из него, вам нужно открыть его: fileobj = open(filename, mode) Кратко поясню фрагменты этого вызова: fileobj — это объект файла, возвращаемый функцией open(); filename — это строка, представляющая собой имя файла; mode — это строка, указывающая на тип файла и действия, которые вы хотите над ним произвести. Первая буква строки mode указывает на операцию: r означает чтение; w означает запись. Если файла не существует, он будет создан. Если файл существует, он будет перезаписан; x означает запись, но только если файла еще не существует; a означает добавление данных в конец файла, если он существует. Вторая буква строки mode указывает на тип файла: t (или ничего) означает, что файл текстовый; b означает, что файл бинарный. После открытия файла вы вызываете функции для чтения или записи данных, они будут показаны в следующих примерах. Наконец, вам нужно закрыть файл. Создадим файл, содержащий одну строку, в одной программе и считаем его в другой. Запись в текстовый файл с помощью функции write() По какой-то причине существует не так уж много лимериков о специальной теории относительности. В качестве источника данных придется использовать всего один: >>> poem = '''There was a young lady named Bright, ... Whose speed was far faster than light; ... She started one day ... In a relative way, ... And returned on the previous night.''' >>> len(poem) 150 Данные должны куда-то попадать Следующий код записывает это стихотворение в файл 'relativity'с помощью всего одного вызова: >>> fout = open('relativity', 'wt') >>> fout.write(poem) 150 >>> fout.close() Функция write() возвращает число записанных байтов. Она не добавляет никаких пробелов или символов новой строки, как это делает функция print(). С помощью функции print() вы также можете записывать данные в текстовый файл: >>> fout = open('relativity', 'wt') print(poem, file=fout) >>> fout.close() Считываем данные из текстового файла с помощью функций read(), readline() и readlines() Вы можете вызвать функцию read() без аргументов, чтобы проглотить весь файл целиком, как показано в следующем примере. Будьте осторожны, делая это с крупными файлами, файл размером 1 Гбайт потребит 1 Гбайт памяти: >>> fin = open('relativity', 'rt' ) >>> poem = fin.read() >>> fin.close() >>> len(poem) 150 Вы можете указать максимальное количество символов, которое функция read() вернет за один вызов. Давайте считывать по 100 символов за раз и присоединять каждый фрагмент к строке poem, чтобы воссоздать оригинал: >>> poem = '' >>> fin = open('relativity', 'rt' ) >>> chunk = 100 >>> while True: ... fragment = fin.read(chunk) ... if not fragment: ... break ... poem += fragment ... >>> fin.close() >>> len(poem) 150 214 Глава 8. Данные должны куда-то попадать После того как вы считали весь файл, дальнейшие вызовы функции read() будут возвращать пустую строку (' '), которая будет оценена как False в проверке if not fragment. Это позволит выйти из цикла while True. Вы также можете считывать файл по одной строке за раз с помощью функции readline(). В следующем примере мы будем присоединять каждую строку к строке poem, чтобы воссоздать оригинал: >>> poem = '' >>> fin = open('relativity', 'rt' ) >>> while True: ... line = fin.readline() ... if not line: ... break ... poem += line ... >>> fin.close() >>> len(poem) 150 Для текстового файла даже пустая строка имеет длину, равную 1 (символ новой строки), такая строка будет считаться True. Когда весь файл будет считан, функция readline() (как и функция read()) возвратит пустую строку, которая будет считаться False. Самый простой способ считать текстовый файл — использовать итератор. Он будет возвращать по одной строке за раз. Этот пример похож на предыдущий, но кода в нем меньше: >>> poem = '' >>> fin = open('relativity', 'rt' ) >>> for line in fin: ... poem += line ... >>> fin.close() >>> len(poem) 150 Во всех предыдущих примерах в результате получалась одна строка poem. Функция readline() считывает по одной строке за раз и возвращает список этих строк: >>> fin = open('relativity', 'rt' ) >>> lines = fin.readlines() >>> fin.close() >>> print(len(lines), 'lines read') 5 lines read >>> for line in lines: ... print(line, end='') ... Ввод информации в файлы и ее вывод из них 215 There was a young lady named Bright, Whose speed was far faster than light; She started one day In a relative way, And returned on the previous night.>>> Мы указали функции print() не добавлять автоматически символы новой строки, поскольку первые четыре строки сами их имеют. В последней строке этого символа не было, что заставило интерактивное приглашение появиться сразу после последней строки. Записываем данные в бинарный файл с помощью функции write() Если вы включите символ 'b' в строку режима, файл будет открыт в бинарном режиме. В этом случае вы вместо чтения и записи строк будете работать с байтами. У нас под рукой нет бинарного стихотворения, поэтому мы просто сгенерируем 256 байтовых значений от 0 до 255: >>> bdata = bytes(range(0, 256)) >>> len(bdata) 256 Откроем файл для записи в бинарном режиме и запишем все данные сразу: >>> fout = open('bfile', 'wb') >>> fout.write(bdata) 256 >>> fout.close() И вновь функция write() возвращает количество записанных байтов. Как и в случае с текстом, вы можете записывать бинарные данные фрагментами: >>> fout = open('bfile', 'wb') >>> size = len(bdata) >>> offset = 0 >>> chunk = 100 >>> while True: ... if offset > size: ... break ... fout.write(bdata[offset:offset+chunk]) ... offset += chunk ... 100 100 56 >>> fout.close() 216 Глава 8. Данные должны куда-то попадать Читаем бинарные файлы с помощью функции read() Это просто: все, что вам нужно, — открыть файл в режиме 'rb': >>> fin = open('bfile', 'rb') >>> bdata = fin.read() >>> len(bdata) 256 >>> fin.close() Закрываем файлы автоматически с помощью ключевого слова with Если вы забудете закрыть за собой файл, его закроет Python после того, как будет удалена последняя ссылка на него. Это означает, что, если вы откроете файл и не закроете его явно, он будет закрыт автоматически по завершении функции. Но вы можете открыть файл внутри длинной функции или даже основного раздела программы. Файл должен быть закрыт, чтобы все оставшиеся операции записи были завершены. У Python имеются менеджеры контекста для очистки объектов вроде открытых файлов. Вы можете использовать конструкцию with выражение as переменная: >>> with open('relativity', 'wt') as fout: ... fout.write(poem) ... Вот и все. После того как блок кода, расположенный под менеджером контекста (в этом случае одна строка), завершится (или нормально, или путем генерации исключения), файл будет закрыт автоматически. |