Выбрать главу

····words = poem.read()

for word in words.split():

····word = word.strip(string.punctuation)

····data = word.encode('utf-8')

····if word.startswith(('a','e','i','o','u','A','e','i','o','u')):

········print('vowels', data)

········pub.send_multipart([b'vowels', data])

····if len(word) == 5:

········print('five', data)

········pub.send_multipart([b'five', data])

Запустите подписчика, а затем и сонного публикатора:

$ python poem_sub.py

$ python poem_pub_sleep.py

Теперь у подписчика есть время на то, чтобы получить сообщения по выбранным темам. Так выглядят первые строки выходной информации:

b'five' b'queen'

b'vowels' b'of'

b'five' b'Lying'

b'vowels' b'at'

b'vowels' b'ease'

b'vowels' b'evening'

b'five' b'flies'

b'five' b'seize'

b'vowels' b'All'

b'five' b'gaily'

b'five' b'great'

b'vowels' b'admired'

Если вы не можете добавить вызов sleep() в код публикатора, вы можете синхронизировать публикатора и подписчика с помощью сокетов REQ и REP. Примеры файлов publisher.py и subscriber.py вы можете найти на GitHub.

Приложение Е. Вспомогательные таблицы

Я обнаружил, что некоторые вещи мне приходится подсматривать слишком часто. Вот несколько таблиц, которые, надеюсь, окажутся вам полезны.

Приоритет операторов

Эта таблица — ремикс официальной документации о приоритетах для Python 3, операторы с самым высоким приоритетом находятся наверху.

Оператор Описание и примеры
[v1, …], { v1, …}, { k1: v1, …}, (…) Создание или включение списка/множества/словаря/генератора, выражение в скобках
seq [n], seq [n: m], func (args…), obj.attr Индекс, разбиение, вызов функции, ссылка на атрибут
** Экспонента
'+'x, '-'x, '~'x Знаки «плюс» и «минус», битовое НЕ
*, /, //, % Умножение, деление с плавающей точкой, целочисленное деление, напоминание
+, - Сложение, вычитание
<<, >> Битовый сдвиг вправо или влево
& Битовое И
| Битовое ИЛИ
in, not in, is, is not, <, <=, >, >=,!=, == Проверка на членство и равенство
not x Булево (логическое) НЕ
and Булево И
or Булево ИЛИ
if … else Условное выражение
lambda Лямбда-выражение

Строковые методы

Python предлагает строковые методы (могут быть использованы с любым объектом str) и модуль string, содержащий полезные определения. Воспользуемся проверочными переменными:

>>> s = "OH, my paws and whiskers!"

>>> t = "I'm late!"

Изменение регистра

>>> s.capitalize()

'Oh, my paws and whiskers!'

>>> s.lower()

'oh, my paws and whiskers!'

>>> s.swapcase()

'oh, MY PAWS AND WHISKERS!'

>>> s.title()

'Oh, My Paws And Whiskers!'

>>> s.upper()

'OH, MY PAWS AND WHISKERS!'

Поиск

>>> s.count('w')

2

>>> s.find('w')

9

>>> s.index('w')

9

>>> s.rfind('w')

16

>>> s.rindex('w')

16

>>> s.startswith('OH')

True

Изменение

>>> ''.join(s)

'OH, my paws and whiskers!'

>>> ' '.join(s)

'O H,···m y···p a w s···a n d···w h i s k e r s!'

>>> ' '.join((s, t))

"OH, my paws and whiskers! I'm late!"

>>> s.lstrip('HO')

', my paws and whiskers!'

>>> s.replace('H', 'MG')

'OMG, my paws and whiskers!'

>>> s.rsplit()

['OH,', 'my', 'paws', 'and', 'whiskers!']