Простой Python. Современный стиль программирования (Любанович) - страница 82

>>>> def palindrome(word):

>…·····from collections import deque

>…·····dq = deque(word)

>…·····while len(dq) > 1:

>…········if dq.popleft()!= dq.pop():

>…············return False

>…·····return True

>…

>…

>>>> palindrome('a')

>True

>>>> palindrome('racecar')

>True

>>>> palindrome('')

>True

>>>> palindrome('radar')

>True

>>>> palindrome('halibut')

>False

Я воспользовался этим примером, чтобы было проще проиллюстрировать работу deque. Если вы действительно хотите создать программу, которая определяет палиндромы, гораздо проще было бы сравнивать строку с ее копией, вывернутой наизнанку. В Python строковой функции reverse() не существует, но можно обратить строку с помощью разбиения, как показано здесь:

>>>> def another_palindrome(word):

>…·····return word == word[::-1]

>…

>>>> another_palindrome('radar')

>True

>>>> another_palindrome('halibut')

>False

Итерируем по структурам кода с помощью itertools

itertools содержит особые функции итератора. Каждая из них возвращает один элемент при каждом вызове из цикла for … in и запоминает свое состояние между вызовами.

Функция chain() проходит по своим аргументам, как если бы они были единым итерабельным объектом:

>>>> import itertools

>>>> for item in itertools.chain([1, 2], ['a', 'b']):

>…·····print(item)

>…

>1

>2

>a

>b

Функция cycle() является бесконечным итератором, проходящим в цикле по своим аргументам:

>>>> import itertools

>>>> for item in itertools.cycle([1, 2]):

>…·····print(item)

>…

>1

>2

>1

>2

>.

>.

>.

…и т. д.

Функция accumulate() подсчитывает накопленные значения. По умолчанию она высчитывает сумму:

>>>> import itertools

>>>> for item in itertools.accumulate([1, 2, 3, 4]):

>…·····print(item)

>…

>1

>3

>6

>10

В качестве второго аргумента функции accumulate() вы можете передать функцию, и она будет использована вместо сложения. Функция должна принимать два аргумента и возвращать одно значение. В этом примере высчитывается произведение:

>>>> import itertools

>>>> def multiply(a, b):

>…·····return a * b

>…

>>>> for item in itertools.accumulate([1, 2, 3, 4], multiply):

>…·····print(item)

>…

>1

>2

>6

>24

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

Выводим данные на экран красиво с помощью функции pprint()

Все наши примеры использовали функцию print() (или просто имя переменной в интерактивном интерпретаторе), чтобы выводить информацию на экран. Иногда результаты было трудно прочитать. Нам нужен pretty printer (красивый принтер) вроде pprint():

>>>> from pprint import pprint

>>>> quotes = OrderedDict([

>…·····('Moe', 'A wise guy, huh?'),