Python. Пять уловок, которые нужно знать, уже сегодня

Будь вы старшим инженером AI или студентом первого курса биологии — рано или поздно вы столкнётесь с языком программирования Python. После релиза, в 1991 году, Python быстро стал любимым языком программистов и технологов. Согласно рейтингу Stack Overflow, основанному на проявлении интереса к языкам, в развитых странах, Python быстро набирает популярность.

Python — высокоуровневый, интерпретируемый язык с относительно простым синтаксисом, идеально подойдет даже тем, кто ранее не программировал. Популярные библиотеки Python, хорошо интегрированы и используются в различных областях, например в биоинформатике (biopython), науке о данных (pandas), машинном обучении (keras/tensorflow) и даже в астрономии (astropy). После изучения C и Java, в качестве моих первых языков программирования, на освоение Python мне понадобилось несколько недель, достаточно было погуглить. Код выполняется гораздо медленнее, чем в Java и других языках, тем не менее Python на самом деле повышает продуктивность, благодаря хорошо налаженной интеграции процессов.


Уловка №1: Сила «однострочников» (One-Liners)

Вы устали пробираться между строк кода и теряться в условных конструкциях? Тогда, однострочники Python — это то, что вам нужно. Например, такая конструкция:

>>> if alpha > 7:
>>>    beta = 999
>>> elif alpha == 7:
>>>    beta = 99
>>> else:
>>>    beta = 0

может быть упрощена:

>>> beta = 999 if alpha > 7 else (beta == 99 if alpha == 7 else 0)

До смешного просто! Если уделять больше внимания коду, который вы пишите, всегда найдется место, где можно упростить его однострочником. Кроме условных конструкций, упрощать можно и циклы for. Например, удвоение списка целочисленных, в четырех строках:

lst = [1, 3, 5]
doubled = []
for num in lst:
    doubled.append(num*2)

можно упростить до одной строки:

doubled = [num * 2 for num in lst]

Конечно, если всюду использовать однострочники, это будет выглядеть неопрятно. Старайтесь не переусердствовать с сокращениями в своём коде, кто-то даже скажет, что широкое применение такого подхода — не канон.

>>> import pprint; pprint.pprint(zip(('Byte', 'KByte', 'MByte', 'GByte', 'TByte'), (1 << 10*i for i in xrange(5))))

Уловка №2: Быстрые действия со строками

Манипуляции со строками порой вызывают сложности, но в Python есть сокращения, которые облегчат вашу жизнь. Чтобы сделать реверс строки, просто добавьте ::-1 в качестве списка индексов.

>>> a =  "ilovepython"
>>> print a[::-1]
nohtypevoli

Такую уловку можно применить и к списку с числами. Манипулировать строками в Python, чрезвычайно просто. Например, вам нужно вывести предложение, используя предопределённые переменные: str1str2 и lst3

>>> str1 = "Totally"
>>> str2 = "Awesome"
>>> lst3 = ["Omg", "You", "Are"]

Просто используйте метод .join() и арифметические операторы, чтобы создать нужное предложение.

>>> print ' '.join(lst3)
Omg You Are
>>> print ' '.join(lst3)+' '+str1+' '+str2
Omg You Are Totally Awesome

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


Уловка №3 Комбинации вложенных списков

Пожалуй, одна из моих любимых библиотек в Python — это itertools.Чтобы преобразить код, содержащий десятки списков, в глубоко вложенный список, достаточно нескольких манипуляций. itertools именно то, что вам нужно, чтобы решить эту задачу.

>>> import itertools
>>> flatten = lambda x: list(itertools.chain.from_iterable(x))
>>> s = [['"', 'An', 'investment'], ['in'], ['knowledge'], ['pays'], ['the', 'best'], ['interest."', '--'], ['Benjamin'], ['Franklin']]
>>> print(' '.join(flatten(s)))
" An investment in knowledge pays the best interest." -- Benjamin Franklin

Из приведенного выше примера видно, как мы можем объединить вложенные списки и строки с помощью .join() и itertools. Метод .combinations()из библиотеки itertools, мощный инструмент, для возврата длины последовательностей элементов, из входных итераций. Нажмите здесь, чтобы узнать больше об itertools.


Уловка №4 Простые структуры данных

Возвращаясь к пункту №1. Однострочником, также очень просто вызвать инициализацию структур данных в Python. Гарольд Купер, реализовал однострочную древовидную структуру, используя следующий код:

>>> def tree(): return defaultdict(tree)

Приведенный выше код просто определяет древо, которое является словарём, со значением по умолчанию tree. Другие однострочные функции, как например генератор простых чисел:

>>> reduce( (lambda r,x: r-set(range(x**2,N,x)) if (x in r) else r),
        range(2,N), set(range(2,N)))

можно найти на Github и Stack Overflow. Также в Python есть мощная библиотека Collections, которая поможет решить множество насущных проблем, без написания длинного кода.

>>> from collections import Counter
>>> myList = [1,1,2,3,4,5,3,2,3,4,2,1,2,3]
>>> print(Counter(myList))
Counter({2: 4, 3: 4, 1: 3, 4: 2, 5: 1})

Уловка №5 Упрощенный вывод данных

Хотел бы я узнать раньше об этом трюке. Он позволяет вывести строчный массив одной строкой, с разделением запятыми. Нам не нужно использовать .join() и циклы.

>>> row = ["1", "bob", "developer", "python"]
>>> print(','.join(str(x) for x in row))
1,bob,developer,python

Можно использовать однострочник:

>>> print(*row, sep=',')
1,bob,developer,python

Еще один элегантный способ вывода, использовать enumerate . Эта встроенная в Python функция невероятно полезна. Так, вместо четырёх строк кода:

iterable = ['a','b','c']
c = 0
for item in iterable:
    print c, item
    c+= 1
0 a
1 b
2 c

тоже самое, можно записать двумя:

for c, item in enumerate(iterable):
    print c, item

В Python, есть еще сотни тысяч подобных уловок, например pprint для форматирования кода.