>>>> 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?'),