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')]

 


Споріднені теми