5 корисних фіч Python, про які знають не всі

  • 7 января, 13:00
  • 4767
  • 0

Python - один з найпопулярніших і потужних мов програмування, що приховує масу корисних фіч. П'ять з них ми висвітлимо в статті.

5 корисних фіч Python, про які знають не всі

List comprehensions - компактний код

Багато назвали б lambda, map і filter "трюками" Python, яким повинен навчитися кожен новачок. 

Лямбда - це метод складання функції в один рядок для одноразового використання. Якщо він викликається кілька разів, страждає продуктивність. З іншого боку, map застосовує функцію до всіх елементів списку, в той час як filter отримує підмножину елементів в наборі, що задовольняє призначену для користувача умову.

add_func = lambda z: z ** 2 is_odd = lambda z: z%2 == 1 multiply = lambda x,y: x*y aList = list(range(10)) print(aList) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

List comprehensions - це лаконічний метод для створення списків з інших списків з гнучкими виразами і умовами. Він виділяється квадратними дужками, в яких визначено вираз чи функцію. Коли елемент задовільняє умову, тільки в цьому випадку дія застосовується до кожного елементу списку. Метод також може обробляти вкладені списки продуктивніше, ніж використання  map і filter.

# Syntax of list comprehension [ expression(x) for x in aList if optional_condition(x) ]    

print(list(map(add_func, aList))) print([x ** 2 for x in aList]) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] print(list(filter(is_odd, aList))) print([x for x in aList if x%2 == 1]) # [1, 3, 5, 7, 9] # [1, 3, 5, 7, 9]

Маніпуляції зі списками - циклічні списки

Python підтримує негативну індексацію, де aList[-1] == aList[len(aList)-1]. Виходячи з цього, можна отримати другий останній елемент в списку - aList[-2] і так далі.

Також можна нарізати списки за допомогою запису aList[start:end: step], де початковий елемент вказано, а кінцевий - ні. Тому виклик aList[2:5] поверне [2, 3, 4], а викликавши aList[:: -1], ти зможеш переставити елементи в списку в зворотному порядку - дуже елегантна техніка.

А ще списки можуть бути розпаковані в окремі елементи або зливати елементи, які не влізли в ліміт перемінних, в підсписок, використовуючи зірочку.

a, b, c, d = aList[0:4] print(f'a = {a}, b = {b}, c = {c}, d = {d}') # a = 0, b = 1, c = 2, d = 3 a, *b, c, d = aList print(f'a = {a}, b = {b}, c = {c}, d = {d}') # a = 0, b = [1, 2, 3, 4, 5, 6, 7], c = 8, d = 9

zip, enumerate і for-loops

Функція zip створює ітератор, який агрегує елементи з декількох списків. Він дозволяє виконувати паралельний обхід списків в циклі for і паралельне сортування. Зворотна дія ( unzip) відбувається за допомогою зірочки.

numList = [0, 1, 2] engList = ['zero', 'one', 'two'] espList = ['cero', 'uno', 'dos'] print(list(zip(numList, engList, espList))) # [(0, 'zero', 'cero'), (1, 'one', 'uno'), (2, 'two', 'dos')] for num, eng, esp in zip(numList, engList, espList):     print(f'{num} is {eng} in English and {esp} in Spanish.') # 0 is zero in English and cero in Spanish. # 1 is one in English and uno in Spanish. # 2 is two in English and dos in Spanish.              Eng = list(zip(engList, espList, numList)) Eng.sort() # sort by engList a, b, c = zip(*Eng) print(a) print(b) print(c) # ('one', 'two', 'zero') # ('uno', 'dos', 'cero') # (1, 2, 0)

enumerate може здатися складним, але цю функцію зручно застосовувати в багатьох ситуаціях. Найбільш популярний варіант - автоматичний лічильник для циклу for: більше немає необхідності створювати і форматувати змінну лічильника за допомогою counter = 0 і counter += 1. enumerate і zip - це два найпотужніших інструменту при побудові циклу for.

upperCase = ['A', 'B', 'C', 'D', 'E', 'F'] lowerCase = ['a', 'b', 'c', 'd', 'e', 'f'] for i, (upper, lower) in enumerate(zip(upperCase, lowerCase), 1):     print(f'{i}: {upper} and {lower}.') # 1: A and a. # 2: B and b. # 3: C and c. # 4: D and d. # 5: E and e. # 6: F and f.

Генератор - ефективність використання пам'яті

Генератори використовуються, коли потрібно обчислити великий набір результатів, але необхідно уникнути одночасного виділення пам'яті під всі результати. Іншими словами, вони генерують значення на льоту і не зберігають попередні значення в пам'яті, тому їх можна ітерувати тільки раз.

Вони часто використовуються при читанні великих файлів або створенні бескінченної послідовності за допомогою ключового слова yield.

def gen(n):    # an infinite sequence generator that generates integers >= n     while True:         yield n         n += 1 G = gen(3)     # starts at 3 print(next(G)) # 3 print(next(G)) # 4 print(next(G)) # 5 print(next(G)) # 6

Віртуальне середовище - ізоляція

Найцікавіша і захоплююча штука з добірки.

Додатки Python часто використовують безліч пакетів від різних розробників зі складними залежностями. Різні додатки створюються з використанням певних наборів бібліотек, в яких вихідні дані не можуть бути використані іншими версіями бібліотеки. Не існує єдиної установки, яка задовольняла б вимоги всіх додатків.

conda create -n venv pip python=3.7  # select python version source activate venv ... source deactivate

Тому вкрай важливо створити окремі автономні віртуальні середовища venv для кожної програми, що і можна зробити за допомогою pip або conda .

Джерело перекладу


0 комментариев
Сортировка:
Добавить комментарий

IT Новости

Смотреть все