Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛЕКЦИЯ 7

.pdf
Скачиваний:
16
Добавлен:
26.03.2016
Размер:
1.84 Mб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]