Ещё 10 фишек Python, которые поднимут ваш скилл на новый уровень

Отредактировано

Рассказываем о 10 функциях в Python, использование которых прокачает ваш скилл программирования и уровень вашего кода.

11К открытий14К показов

Фишек в Python никогда не бывает много. Чем больше таких вы освоите, тем выше шанс на практике оперативно справиться с каким-нибудь очередным затыком. Да и на техническом собеседовании покажете себя с лучшей стороны. В статье Елена Капаца – Data Analyst компании Инфостарт – рассказывает, какие еще трюки круто помогают новичку (и не только) прокачаться.

С первой статьей цикла вы можете познакомиться по ссылке.

1. Форматирование многострочного вывода

Если вы хотите, чтобы вывод напоминал табличку с одинаковым отступом, то при использовании F-строк добавьте интерполируемой переменной двоеточие и число, одинаковое для всех print(), например, 10. Это «резервирует» пространство из 10 символов:

			name1 = 'Владимир'
name2 = 'Илья'
print(f'{name1:10}: тимлид')
print(f'{name2:10}: фулстэк-разработчик')
		

Вывод будет приятным и опрятным:

			Владимир  : тимлид
Илья      : фулстэк-разработчик
		

2. Частичное совпадение пользовательского ввода

Эта замечательная фича позволяет справляться с ситуациями, когда пользователь вводит не все, что от него ожидается. Фишка работает в версиях Python не ниже 3.10:

			>>> def do_this():
>>>    print('Пойди туда -- не знаю куда')
>>> 
>>> 
>>> def do_that():
>>>    print('Принеси то - не знаю что')
>>> 
>>> 
>>> match input('Что сделать? '):
>>>    case 'пойди':
>>>       do_this()
>>>    case 'принеси':
>>>       do_that()
>>>    case _:
>>>       print('Неверный ввод. Попробуйте еще раз.')
... Что сделать? пойди
... Пойди туда -- не знаю куда

[Повторный запуск программы]
Что сделать? поспи
... Неверный ввод. Попробуйте еще раз.
		

3. Выборка простых чисел в списке любого размера

Выбирать простые числа приходилось мне на практике разве что во время учёбы, так что найти этому коду реальное применение непросто. Однако его легко переиначить для поиска любых других типов чисел – чётных / нечётных / делимых на определенное число:

			>>> nums=range (1,1000)
>>> 
>>> def is_prime (num) :
>>>    for x in range (2, num) :
>>>       if (num%x) == 0:
>>>          return False
>>>    return True
>>> 
>>> primes=list(filter (is_prime, nums))
>>> print(primes)... [1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]
		

4. Словарное включение

Многим из нас знакомо списковое включение (List Comprehension), которое позволяет за одну строку кода сгенерировать список:

			>>> names = [
>>>     'Daniel',
>>>     'Mike',
>>>     'William'
>>> ]>>> >>> newNames = [x for x in names if "a" in x] # Выберет имена, где есть “а”
		

Оказывается, Python поддерживает аналогичный функционал для словарей! Код ниже генерирует словарь, где у каждого имени определяется длина в символах:

			>>> length = {name:len(name) for name in names} # Создаст словарь “имя – длина”
>>> print(length)

... {'Daniel': 6, 'Mike': 4, 'William': 7}
		

5. Резервирование символов

С помощью операторов > / < / ^ вы можете добавлять выходному значению символы, к примеру, облегчающие поиск среди других выходных значений:

			>>> text = 'Это эпично'
>>> print(f'{text}')
>>> print(f'{text:#<20}')
>>> print(f'{text:_>20}')
>>> print(f'{text:^20}')

... Это эпично
... Это эпично##########
... __________Это эпично
...      Это эпично
		

Как видно в сниппете выше, < добавит символы после, > – до, а ^ – окружит с двух сторон.

6. Splat-оператор

Splat (одна звездочка) расширяет коллекцию до позиционных аргументов, а splatty-splat (две звездочки) — словарь до именованных аргументов:

Этот код:

			args = (1, 2)
kwargs = {'x': 3, 'y': 4, 'z': 5}
func(*args, **kwargs)
		

Равнозначен этому:

			func(1, 2, x=3, y=4, z=5)
		

7. Фильтрация списка без цикла

Здесь неожиданно выделился модуль itertools. Если у нас есть два списка с именами и идентификаторами:

			>>> import itertools
>>> leaders = ['Иван', 'Андрей', 'Александра', 'Артем', 'Инна']
>>> selector = [1, 1, 0, 0, 0]
		

То вы можете выбрать из списка leaders только те, где значения selector равны единице:

			>>> print(list(itertools.compress(leaders, selector)))

... ['Иван', 'Андрей']
		

8. Подсчёт числа элементов в списке

Помимо способности collections.Counter() понимать, что именно в строке нужно подсчитать:

			>>> from collections import Counter
>>> print(Counter("Ростов-на-Дону").most_common(3)) # Выделит три самых частовстречающихся символа... [('о', 3), ('-', 2), ('н', 2)]
		

В случае со списком слов модуль автоматически рассчитывает, как часто встречается то или иное слово:

			>>> party_list = ["Алиса", "Федор", "Алиса", "Евгения", "Андрей", "Евгения", "Алексей"]
>>> print(Counter(party_list))

... Counter({'Алиса': 2, 'Евгения': 2, 'Федор': 1, 'Андрей': 1, 'Алексей': 1})
		

9. Поиск отличий в списках

Допустим, у нас есть две длинные строки, и мы хотим найти отличия. seq1 и seq2 в сниппете ниже – это последовательности генов:

			>>> seq1 = 'atgcttcggcaagactcaaaaaata'
>>> seq2 = 'atscttcsscaagactaaaaaaata'
>>> >>> zip_seqs = zip(seq1, seq2)
>>> 
>>> enum_seqs = enumerate(zip_seqs)
>>> 
>>> for i, (a, b) in enum_seqs:
>>>     if a != b:
>>>         print(f'index: {i}')
		

Можно использовать комбинацию zip() и enumerate(). Первая сопоставит символы с одинаковыми индексами, а вторая – присвоит каждой паре символов порядковый номер (всего 24). Чтобы найти отличающиеся символы, достаточно сравнить символы попарно в цикле for:

			... index: 2
... index: 7
... index: 8
... index: 16
		

10. Перегонка кортежа в словарь

Допустим, у нас есть кортеж, где каждое значение – строка из двух символов:

			>>> values = ('a1', 'b2', 'c3')
		

Если «навесить» функцию dict(), то в результате мы получим словарь с разделенными на ключ – значение парами:

			>>> print(dict(values))
... {'a': '1', 'b': '2', 'c': '3'}
		

Заключение

Лаконичный неочевидный код, в одну строку делающий то, что у новичка бы заняло пять, сродни задачам по комбинаторике в школе, – понятно не всем и не сразу. Так что не злитесь на себя, если такое забывается. Просто сохраняйте в закладки. И джуны, и сеньоры – все мы гуглим такое.

Дайте знать в комментариях, интересно ли вам получить регулярное продолжение этой рубрики.
Следите за новыми постами
Следите за новыми постами по любимым темам
11К открытий14К показов