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

  • 7 января, 15:00
  • 4010
  • 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 комментариев
Сортировка:
Добавить комментарий