Python. Использование стандартных функций в сочетании с выражениями-генераторами

Использование стандартных функций в сочетании с выражениями-генераторами. Функции sum(), sorted(), map(), all(), any(), min(), max(), filter(), zip(), enumerate()

Перед изучением данной темы рекомендуется ознакомиться со следующей темой:


Содержание


Поиск на других ресурсах:

1. Функция sum(). Вычисление суммы элементов последовательности

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

IterObj = ( expression )
result = sum(IterObj)

здесь

  • expression – виражение-генератор;
  • IterObj – итерационный объект, получаемый с помощью выражения-генератора;
  • result – результирующая сумма.

При вызове функции sum() допускается непосредственно размещать выражение генератора в пределах круглых скобок. В этом случае круглые скобки, в которых объявляемое выражение-генератор можно опустить.

Пример. Демонстрируется вычисление суммы функцией sum() для разных выражений-генераторов.

# Виражения-генераторы и функция sum()

# Вычисление суммы элементов списка
L = [ 1, 3, 5, 8, 2, 4 ]
res = sum((t for t in L))
print("res = ", res)

# Вычисление суммы 2 + 4 + 6 + ... + 100
sum_2_100 = sum(i for i in range(2, 101, 2)) # скобки () можно опустить
print("2 + 4 + 6 + ... + 100 = ", sum_2_100)

# Вычисление суммы 0.1 + 0.3 + 0.5 + ... + 2.0
IterObj = (i*0.1 for i in range(1, 21, 2)) # получить объект-итератор
sum_01_20 = sum(IterObj)
print("0.1 + 0.2 + ... + 2.0 = ", sum_01_20)

Результат выполнения программы

res = 23
2 + 4 + 6 + ... + 100 = 2550
0.1 + 0.2 + ... + 2.0 = 10.000000000000002

 

2. Функция sorted(). Сортировка элементов последовательности

Функция sorted() производит сортировку набора значений. Отсортированный набор значений возвращается с помощью списка. Использование функции sorted() с выражениями-генераторами имеет следующее общее использование

IterObj = ( expression )
resIterable1 = sorted(IterObj) # сортировка по возрастанию элементов
resIterable1 = sorted(IterObj, reverse = True) # сортировка по убыванию

здесь

  • expression – виражение-генератор;
  • IterObj – объект-итератор, который поддерживает протокол итераций. Этот объект формируется на основе выражения expression;
  • resIterable1, resIterable2 – списки, которые есть результатами функции sorted().

Пример.

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

# Выражения-генераторы и функция sorted()

# 1. Сортировка элементов списка
# 1.1. Некоторый список
L = [ 1, 3, 5, 8, 2, 4 ]

# 1.2. Создать объект-итератор с помощью выражения-генератора
IterObj = ( t for t in L )

# 1.3. Отсортировать элементы по убыванию (reverse = True),
# получить результирующий список
sortedL = sorted(IterObj, reverse = True)
print("L = ", L)
print("sorted(L) = ", sortedL)

# 2. Сортировка элементов кортежа
# 2.1. Заданный кортеж
T = ( 1.4, 3.4, -2.8, 9.1, 0.7 )

# 2.2. Отсортировать элементы кортежа,
# задать непосредственно сортировку в списке по возрастанию
sortedT = sorted(( t for t in T ), reverse = False)

# 2.3. Вывести результат
print("T = ", T)
print("sotred(T) = ", sortedT)

Результат выполнения программы

L = [1, 3, 5, 8, 2, 4]
sorted(L) = [8, 5, 4, 3, 2, 1]
T = (1.4, 3.4, -2.8, 9.1, 0.7)
sotred(T) = [-2.8, 0.7, 1.4, 3.4, 9.1]

 

3. Функция all(). Определение, все ли элементы последовательности удовлетворяют заданному условию

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

IterObj = ( expression )
result = all(IterObj)

здесь

  • expression – выражение-генератор;
  • IterObj – объект-итератор, который есть результатом виражения-генератора;
  • result – значение логического типа. Если все элементы некоторого набора (списка, кортежа, множества и т.п.) удовлетворяют некоторому условию, то result = True. Иначе result=False.

Пример.

# Выражения-генераторы и функция all()

# 1. Использование со списками
# 1. Заданный список
L = [ 11, 3, 5, 10, 12, 4 ]

# 1.2. Определить, все ли числа списка больше 2
res = all( item > 2 for item in L )
print("L = ", L)
print("L(>2) = ", res)

# 1.3. Определить, все ли в списке числа парные
res2 = all( item%2 == 0 for item in L)
print("L(%2==0) = ", res2)

# 2. Использование с кортежами
# 2.1. Заданный кортеж
T = ( 'abcd', 'abcd', 'abd', 'ade' )

# 2.1. Определить, все ли строки кортежа начинаются с буквы 'a'
res3 = all( s[0] == 'a' for s in T )
print("res3 = ", res3)

 

4. Функция any(). Определение, удовлетворяет ли заданному условию хотя бы один элемент последовательности

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

IterObj = ( expression )
result = any(IterObj)

здесь

  • expression – выражение-генератор;
  • IterObj – объект-итератор, поставляющий значение в функцию;
  • result – результат, который может принимать одно из двух значений True или False. Если один элемент из набора удовлетворяет заданному условию, то result = True.
# Функция any() – определение того,
# удовлетворяет заданному условию хотя бы один элемент

# 1. Определить, содержит ли заданный список нулевые элементы
L = [ 2, 3, 8, 1, 3, 4, 2, 7 ]
res = any( item == 0 for item in L )
print(res)

# 2. В заданном списке строк определить, есть ли хотя бы одна строка
# содержащая символ '+'
LS = [ 'abc', 'cd+e', 'ab', 'a-b', 'fgh' ]
res = any( ('+' in s) for s in LS )
print(res)

Результат выполнения программы

False
True

 

5. Функции min(), max(). Определение максимального и минимального значения последовательности

Для определения максимального и минимального значения последовательности используются функции min() и max(). В сочетании с выражениями-генераторами общая форма объявления функций имеет вид.

IterObjMin = ( exprMin )
resMin = min(IterObj)

IterObjMax = ( exprMax )
resMax = max(IterObj)

здесь

  • exprMin, exprMax – выражения-генераторы;
  • IterObjMin, IterObjMax – объекты-итераторы, поставляющие значение соответственно для функций min() и max();
  • resMin, resMax – соответственно минимальное и максимальное значение в последовательности.

Пример.

# Функция min() - определить минимальное значение в последовательности

L1 = [ 12.88, 3.8, 4.22, 11.6, 3.99 ]
resMin = min( item for item in L1 )
print("L1 = ", L1)
print("min(L1) = ", resMin)

# Функция max() - определить максимальное значение последовательности
L2 = [ 5.2, 3.8, 4.1, 6.2, 4.4 ]
resMax = max( item for item in L2)
print("L2 = ", L2)
print("max(L2) = ", resMax)

Результат выполнения программы

L1 = [12.88, 3.8, 4.22, 11.6, 3.99]
min(L1) = 3.8
L2 = [5.2, 3.8, 4.1, 6.2, 4.4]
max(L2) = 6.2

 

6. Функция map(). Выполнение функции над каждым элементом последовательности

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

map( FuncName, ( expression ))

здесь

  • expression – виражение-генератор;
  • FuncName – имя функции, выполняемой над каждым элементом, поставляемым выражением-генератором expression.

Пример 1.

В примере для заданного списка строк реализуется реверсировка каждой строки путем сочетания функции map() и выражения генератора.

# Функция map() - выполнение некоторой функции над каждым элементом последовательности

# Задача. Задан список строк.
# Реализовать реверсирование каждой строки в списке.

# 1. Объявление собственной функции, выполняющей реверсирование строки
def Reverse(s):
    s_reverse = ''
    for c in s:
        s_reverse = c + s_reverse
    return s_reverse

# 2. Заданный список
LS = [ 'abcd', 'def', 'ghi', 'jkl' ]

# 3. Вызов функции map, получение результирующего списка
# Здесь используется выражение-генератор
LS2 = list(map(Reverse, ( s for s in LS )))

# 4. Вывести результат
print(LS)
print(LS2)

Результат выполнения программы

LS = ['abcd', 'def', 'ghi', 'jkl']
Reverse(LS) = ['dcba', 'fed', 'ihg', 'lkj']

Пример 2. 

Условие задачи. Задан исходный список L1 целых чисел. Образуйте новый список L2, в котором каждый элемент равен сумме цифр соответствующего элемента списка L1. Для решения использовать комбинацию функции map() и выражения-генератора.

Решение.

# Функция map() - выполнение некоторой функции над каждым элементом последовательности

# Задача. Создать новый список, в котором каждый элемент
# равен сумме цифр исходного списка

# 1. Объявление собственной функции, возвращающей сумму цифр числа number,
# например: 23489 => 26
def SumDigits(number):
    summ = 0
    i = 0
    t = number
    while t>0:
        summ += int(t%10)
        t //= 10
    return summ

# 2. Заданный список целых положительных чисел
L1 = [ 1389, 230, 77, 43409 ]

# 3. Вызов функции map, получение результирующего списка
L2 = list(map(SumDigits, ( item for item in L1 )))

# 4. Вывести результат
print("L1 = ", L1)
print("L2 = ", L2)

Результат выполнения программы

L1 = [1389, 230, 77, 43409]
L2 = [21, 5, 14, 20]

 

7. Функция filter(). На основе заданной последовательности получить итерированный объект по некоторому критерию

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

IterObj = filter( FuncName, ( expression ) )

здесь

  • expression – выражение-генератор, возвращающее итерированный объект;
  • FuncName – функция, которая будет применена к каждому элементу последовательности, сформированной выражением-генератором.

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

# Функция filter() - возвращает итератор на последовательность элементов,
# удовлетворяющих заданному условию.

# 1. Функция, определяющая есть ли число num больше числа 5
def GreateThan5(num):
    return num>5

# 2. Заданный список
L = [ 2, 15, 8, 1, 4 ]

# 3. Образовать итерированный объект на основе функции GreateThan()
IterObj = filter( GreateThan5, ( item for item in L ) )

# 4. Создать новый список на основе объекта IterObj
L2 = list(IterObj)
print(L2)

Результат выполнения программы

[15, 8]

 

8. Функция zip(). Объединение в кортеже элементов нескольких последовательностей

Функция zip() используется для объединения в кортеже элементов нескольких последовательностей. В наиболее общем случае использование функции zip() может примерно следующим

IterObj1 = ( expression1 )
IterObj2 = ( expression2 )
...
IterObjN = ( expressionN )

ResObj = zip( IterObj1, IterObj2, ..., IterObjN )

здесь

  • expression1, expression2, expresssionN – выражения-генераторы, формирующие итерированные объекты;
  • IterObj1, IterObj2, IterObjN – итерированные объекты, поставляющие значение;
  • ResObj – результирующий итерируемый объект. Этот объект содержит последовательность кортежей, каждый из которых представляет собой объединение элементов из итерированных объектов IterObj1, IterObj2, IterObjN.

Результат, полученный функцией zip(), может быть конвертирован в список, множество или кортеж. К примеру, чтобы получить результат в виде кортежа нужно вызвать следующий код

ResTuple = tuple(ResObj)

Пример.

В примере с помощью функции zip() и выражения-генератора формируется список ResList, объединяющий три списка L1, L2, L3.

# Функция zip() - объединение элементов разных последовательностей в кортеже

# 1. Заданы 3 списка
L1 = [ 'ab', 'cd', 'ef', 'gh' ]
L2 = [ 2.88, 3.55, 4.11 ]
L3 = [ 10, 20, 30, 40, 50, 60 ]

# 2. Получить итерированные объекты с помощью выражений-генераторов
IterObj1 = ( item for item in L1 )
IterObj2 = ( item for item in L2 )
IterObj3 = ( item for item in L3 )

# 3. Вызвать функцию zip() для итерированных объектов,
#    получить результирующий объект
Res = zip(IterObj1, IterObj2, IterObj3)

# 4. Сформировать список результатов
ResList = list(Res)

# 5. Вывести результат
print("L1 = ", L1)
print("L2 = ", L2)
print("L3 = ", L3)
print("IterObj1 = ", IterObj1)
print("IterObj2 = ", IterObj2)
print("IterObj3 = ", IterObj3)
print("zip(...) = ", ResList)

Результат выполнения программы

L1 = ['ab', 'cd', 'ef', 'gh']
L2 = [2.88, 3.55, 4.11]
L3 = [10, 20, 30, 40, 50, 60]
IterObj1 = <generator object <genexpr> at 0x034D14F0>
IterObj2 = <generator object <genexpr> at 0x034D1630>
IterObj3 = <generator object <genexpr> at 0x034D19B0>
zip(...) = [('ab', 2.88, 10), ('cd', 3.55, 20), ('ef', 4.11, 30)]

 

9. Функция enumerate(). Пронумеровать элементы последовательности

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

IterObj = enumerate( expression )

здесь

  • expression – выражение-генератор;
  • IterObj – итерированный объект.

После получения итерированного объекта, который будет поставлять значение, можно сформировать результат в виде некоторой последовательности (список, кортеж, множество). Если, например, нужно сформировать множество ResSet, то вызовется следующий код

ResSet = set(IterObj)

Пример. В примере формируется список кортежей. Каждый кортеж является парой, определяющей порядковый номер и значение кортежа.

# Функция enumerate() - Разбивает последовательность на кортежи.

# 1. Заданный список
L = [ 'ab', 'cd', 'ef', 'gh' ]

# 2. Получить итерированный объект, вызвать функцию enumerate()
# в сочетании с выражением-генератором
IterObj = enumerate( item for item in L1 )

# 3. Получить список кортежей
ResList = list(IterObj)

# 4. Вывести результат
print("L = ", L)
print("IterObj = ", IterObj)
print("enumerate(L) = ", ResList)

Результат выполнения программы

L = ['ab', 'cd', 'ef', 'gh']
IterObj = <enumerate object at 0x03851558>
enumerate(L) = [(0, 'ab'), (1, 'cd'), (2, 'ef'), (3, 'gh')]

 


Связанные темы