ЛЕКЦИЯ 7
.pdf
3.1.Краткий обзор.
●Сравнение строк по шаблонам
Модуль re предоставляет инструментарий для работы с регулярными выражениями для нетривиальной обработки текста. С помощью регулярных выражений можно создавать выразительные и оптимизированные решения для поиска и обработки строк.
>>>import re
>>>re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest') ['foot', 'fell', 'fastest']
>>>re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'
Когда требуются более простые возможности, методы строковых объектов предпочтительнее, так как их легче читать и отлаживать:
>>> 'чай для двоих'.replace('для', 'на') 'чай на двоих'
3.1. Краткий обзор.
● Математические функции
Модуль math предоставляет доступ к библиотеке функций над числами с плавающей запятой:
>>>import math
>>>math.cos(math.pi / 4) 0.70710678118654757
>>>math.log(1024, 2) 10.0
С помощью модуля random можно делать случайный выбор:
>>>import random
>>>random.choice(['яблоко', 'груша', 'банан']) 'яблоко'
>>>random.sample(range(100), 10) # выборка без повторений [30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>>random.random() # случайное число с плавающей запятой
0.17970987693706186
>>>random.randrange(6) # случайное целое из диапазона range(6)
4
>>>random.sample([1, 2, 3, 4, 5], 3) # случайные три элемента из списка
[4, 1, 5]
Проект SciPy <http://scipy.org> имеет много других модулей для численных расчётов.
3.1. Краткий обзор.
● Протоколы интернет
В стандартной библиотеке имеется целый набор модулей для различных сервисов и протоколов интернет. Наиболее употребимыми можно считать urllib.request для получения данных по заданному адресу (URL) и smtplib для отправки сообщений электронной почты:
>>>from urllib.request import urlopen
>>>for line in urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
... if 'EST' in line or 'EDT' in line: # временные зоны
... print(line)
<BR>Nov. 25, 09:43:32 PM EST
>>>import smtplib
>>>server = smtplib.SMTP('localhost')
>>>server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
... """To: jcaesar@example.org
... From: soothsayer@example.org
...
... Beware the Ides of March.
... """)
>>>server.quit()
Заметьте, что второй пример требует почтового сервера на той же машине.
3.1. Краткий обзор.
● Дата и время
Модуль datetime предлагает классы для работы с датами и временем как в простых, так и сложных случаях. Кроме поддержки календарной арифметики, реализация обращает особенное внимание на эффективность вычисления составных частей для вывода и дальнейших манипуляций. Модуль также предлагает объекты с поддержкой временных зон.
#даты можно легко составлять и выводить в требуемом формате
>>> from datetime import date
>>> сейчас = date.today()
>>> сейчас datetime.date(2009, 2, 3)
>>> сейчас.strftime("%d.%m.%Y") '03.02.2009'
#даты поддерживают календарную арифметику
>>>день_рождения = date(1964, 7, 31)
>>>возраст = сейчас - день_рождения
>>>возраст.days
16258
3.1. Краткий обзор.
● Сжатие данных и архивы
Наиболее распространённые форматы сжатия и архивации напрямую поддерживаются модулями стандартной библиотеки: zlib, gzip, bz2, zipfile и tarfile.
>>>import zlib
>>>s = "Закрой замок на замок, чтобы замок не замок"
>>>len(bytes(s, "utf-8"))
78
>>>t = zlib.compress(s)
>>>len(t)
54
>>> print(str(zlib.decompress(t), "utf-8"))
Закрой замок на замок, чтобы замок не замок
>>> zlib.crc32(s) 2392363341
3.1.Краткий обзор.
●Измерение производительности
Некоторым пользователям Python интересно знать относительную производительность различных подходов к решению одной и той же проблемы. Python предлагает инструмент для немедленного ответа на эти вопросы.
Например, очень заманчиво использовать присваивание кортежей вместо традиционного подхода к замене значений переменных местами. Модуль timeit быстро продемонстрирует незначительное превосходство кортежей:
>>>from timeit import Timer
>>>Timer('a, b = b, a', 'a=1; b=2').timeit() 0.15707302093505859
>>>Timer('t=a; a=b; b=t', 'a=1; b=2').timeit() 0.19421601295471191
В отличие от высокого разрешения модуля timeit, модули profile и pstats предлагают возможность обнаружить критические по времени участки в больших фрагментах кода.
3.1. Краткий обзор.
● Контроль качества
Модуль doctest имеет средства для просмотра модуля и проверки результатов тестов, заложенных в строках документации. Написание теста для функции заключается в копировании и вставке типичного вызова функции и ее результатов в строку документации. Это улучшает документацию, предоставляя пользователю реальный пример, а модуль doctest проверяет, что код соответствует документации.
def average(values):
"""Вычисляет среднее арифметическое списка чисел.
>>> print(average([20, 30, 70])) 40.0
"""
return sum(values) / len(values) import doctest
doctest.testmod() # автоматически проверяет тесты в документации
Модуль unittest позволяет создавать более полный набор тестов, располагающийся в отдельном файле: import unittest
class TestStatisticalFunctions(unittest.TestCase): def test_average(self):
self.assertEqual(average([20, 30, 70]), 40.0) self.assertEqual(round(average([1, 5, 7]), 1), 4.3) self.assertRaises(ZeroDivisionError, average, []) self.assertRaises(TypeError, average, 20, 30, 70)
unittest.main() # Вызов из командной строки выполняет проверку всех тестов этого модуля
4.Файлы.
Объекты-файлы – это основной интерфейс между программным кодом на языке Python и внешними файлами на компьютере. Файлы являются одним из базовых типов, но они представляют собой нечто необычное, поскольку для файлов отсутствует возможность создания объектов в виде литералов. Вместо этого, чтобы создать объект файла, необходимо вызвать встроенную функцию open, передав ей имя внешнего файла и строку режима доступа к файлу.
>>>f = open(‘data.txt’, ‘w’) # Создается новый файл для вывода
>>>f.write(‘Hello\n’) # Запись строки байтов в файл
6
>>>f.write(‘world\n’) # Возвращает количество записанных байтов
6
>>>f.close() # Закрывает файл и выталкивает выходные буферы на диск
>>>f = open('data.txt') # ‘r’ – это режим доступа к файлу по умолчанию
>>>text = f.read() # Файл читается целиком в строку
>>>text
Hello world
>>> text.split() # Содержимое файла всегда является строкой [‘Hello’, ‘world’]
Добавление 'b' (binary) в строку режима означает работу с бинарными файлами.
|
4.1. Операции. |
Операция |
Интерпретация |
output = open(r’C:\spam’, ‘w’) |
Открывает файл для записи (‘a’ - запись в конец) |
input = open(‘data’, ‘r’) |
Открывает файл для чтения ('+' - чтение и запись) |
input = open(‘data’) |
Открывает файл для чтения (режим ‘r’ используется по умолчанию) |
aString = input.read() |
Чтение файла целиком в единственную строку |
aString = input.read(N) |
Чтение следующих N символов (или байтов) в строку |
aString = input.readline() |
Чтение следующей текстовой строки (включая символ конца строки) в строку |
aList = input.readlines() |
Чтение файла целиком в список строк (включая символ конца строки) |
output.write(aString) |
Запись строки символов (или байтов) в файл |
output.writelines(aList) |
Запись всех строк из списка в файл |
output.close() |
Закрытие файла вручную (выполняется по окончании работы с файлом) |
output.flush() |
Выталкивает выходные буферы на диск, файл остается открытым |
anyFile.seek(N) |
Изменяет текущую позицию в файле для следующей операции, смещая ее на N |
|
байтов от начала файла. |
for line in open(‘data’): |
Итерации по файлу, построчное чтение |
операции над line |
Файлы с текстом Юникода (строки типа str) |
open(‘f.txt’, encoding=’latin-1’) |
|
open(‘f.bin’, ‘rb’) |
Файлы с двоичными данными (строки типа bytes) |
4.2.Примеры.
●Если необходимо вывести содержимое файла, обеспечив правильную интерпретацию символов конца строки, его следует прочитать в строку целиком, с помощью метода read, и вывести:
>>>open(‘myfile.txt’).read() # Прочитать файл целиком в строку
‘hello text file\ngoodbye text file\n’
>>>print(open(‘myfile.txt’).read()) # Более дружественная форма отображения hello text file
goodbye text file
● Если необходимо просмотреть содержимое файла строку за строкой, лучшим выбором будет итератор файла:
for line in open(‘myfile’): print(line, end=’’)
...
hello text file goodbye text file
