Как и прежде, начнем с основанного на функциях менеджера множеств. Но на этот раз вместо управления совместно используемым объектом множества в модуле определим функции, реализующие операции множеств над передаваемыми им последовательностями Python (пример 18.8).
Пример 18.8. PP4E\Dstruct\Basic\inter.py
"операции множеств над двумя последовательностями"
def intersect(seq1, seq2):
res = [] for x in seq1: if x in seq2: res.append(x) return res |
# начать с пустого списка |
||
# # |
просмотр первой последовательности |
||
добавить общие элементы в |
конец |
||
def union(seq1, seq2): res = list(seq1) |
# |
создать копию seq1 |
|
for x in seq2: if not x in res: res.append(x) return res |
# |
добавить новые элементы в |
seq2 |
Эти функции работают с последовательностями любого типа — списками, строками, кортежами и другими итерируемыми объектами, удовлетворяющими протоколам, предполагаемым этими функциями (циклы for, проверки принадлежности in). На самом деле их можно использовать даже с объектами разных типов: последние две команды в следующем фрагменте вычисляют пересечение и объединение списка и кортежа. Как обычно в Python, значение имеет ин тер фейс объекта, а не конкретный тип:
C:\…\PP4E\Dstruct\Basic> python
> >> from inter import *
> >> s1 = "SPAM"
> >> s2 = "SCAM"
> >> intersect(s1, s2), union(s1, s2)
([‘S’, ‘A’, ‘M’], [‘S’, ‘P’, ‘A’, ‘M’, ‘C’])
> >> intersect([1,2,3], (1,4))
[1]
> >> union([1,2,3], (1,4))
[1, 2, 3, 4]
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011