Поддержка нескольких операндов Python

Если мы намерены использовать функции 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

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий