Використання стандартних функцій у поєднанні з виразами-генераторами. Функції sum(), sorted(), map(), all(), any(), min(), max(), filter(), zip(), enumerate()
Перед вивченням даної теми рекомендується ознайомитись з наступною темою:
Зміст
- 1. Функція sum(). Обчислення суми елементів послідовності
- 2. Функція sorted(). Сортування елементів послідовності
- 3. Функція all(). Визначення, чи всі елементи послідовності задовільняють заданій умові
- 4. Функція any(). Визначення, чи хоча б один елемент послідовності задовільняє заданій умові
- 5. Функції min(), max(). Визначення максимального та мінімального значення послідовності
- 6. Функція map(). Виконання функції над кожним елементом послідовності
- 7. Функція filter(). На основі заданої послідовності отримати ітерований об’єкт за деяким критерієм
- 8. Функція zip(). Об’єднання елементів декількох послідовностей у кортежі
- 9. Функція 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')]
⇑
Споріднені теми
- Генератори списків. Загальні поняття
- Генератори списків для матричних операцій. Приклади
- Функції-генератори. Інструкція yield. Методи next(), iter(), send()
- Вирази-генератори. Відмінність між виразом-генератором та генератором списків
- Генератори множин. Генератори словників. Множини та вирази-генератори. Словники та вирази-генератори. Приклади
- Використання вкладених конструкцій if та for в генераторах списків, множин та словників
⇑