Если мы намерены использовать функции intersect и union в качестве универсальных инструментов, то полезным расширением будет поддержка нескольких аргументов (то есть больше двух). Функции, представленные в примере 18.9, используют возможность использования списков аргументов переменной длины, чтобы вычислить пересечение и объединение произвольного количества операндов.
Пример 18.9. PP4E\Dstruct\Basic\inter2.py
"операции множеств над несколькими последовательностями"
def intersect(*args):
res = []
for x in args[0]: # просмотр первого списка
for other in args[1:]: # для всех остальных аргументов
if x not in other: break # этот элемент во всех последов.?
else:
res.append(x) # добавить общие элементы в конец
return res
def union(*args):
res = []
for seq in args: # для всех аргументов-последовательностей
for x in seq: # для всех элементов в аргументах
if not x in res:
res.append(x) # добавить новые элементы в результат
return res
Функции с несколькими операндами действуют над последовательностями так же, как исходные функции, но поддерживают три и более операндов. Обратите внимание на использование предложения else в цикле for в функции intersect для определения общих элементов. Заметьте также, что последние два примера в следующем листинге сеанса оперируют списками, содержащими составные аргументы: проверки in в функциях intersect и union для определения результатов сравнения с совокупностью рекурсивно применяют проверку равенства к узлам последовательностей на необходимую глубину:
C:\…\PP4E\Dstruct\Basic> python
> >> from inter2 import *
> >> s1, s2, s3 = ‘SPAM’, ‘SLAM’, ‘SCAM’
> >> intersect(s1, s2)
[‘S’, ‘A’, ‘M’]
> >> intersect(s1, s2, s3)
[‘S’, ‘A’, ‘M’]
> >> intersect(s1, s2, s3, ‘HAM’)
[‘A’, ‘M’]
> >> union(s1, s2), union(s1, s2, s3)
([‘S’, ‘P’, ‘A’, ‘M’, ‘L’], [‘S’, ‘P’, ‘A’, ‘M’, ‘L’, ‘C’])
> >> intersect([1, 2, 3], (1, 4), range(5)) # 3.X: использ. range допустимо [1]
> >> s1 = (9, (3.14, 1), "bye", [1, 2], "mello")
> >> s2 = [[1, 2], "hello", (3.14, 0), 9]
> >> intersect(s1, s2)
[9, [1, 2]]
> >> union(s1, s2)
[9, (3.14, 1), ‘bye’, [1, 2], ‘mello’, ‘hello’, (3.14, 0)]
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011