5 удивительных скрытых возможностей Python. Часть 1

Ссылка на вторую часть.


Python  —  замечательный язык программирования. В опросе разработчиков Stack Overflow 2022 года он занял первое место среди самых популярных языков.

Python подходит для начинающих. Его синтаксис прост и понятен, что значительно облегчает процесс обучения.

Python универсален. Благодаря большому и активному сообществу он снабжен надежными пакетами и фреймворками, позволяющими решать практически любые задачи разработки.

Хотите написать API? Используйте Python.

Хотите создать игру? Python поможет вам в этом.

Хотите работать с данными и обучать модели машинного обучения? В Python наверняка найдутся все необходимые инструменты!

У Python также есть множество малоизвестных лайфхаков. Я не перестаю восхищаться однострочниками Python, отлично справляющимися со сложными задачами!

В этой статье мы рассмотрим 5 приемов в Python, которые вы сможете использовать, чтобы поразить своих коллег.


Секрет 1. ELSE в циклах FOR и WHILE

Первое, что мы изучаем, когда начинаем программировать,  —  это условные операторы (т.е. блоки, if-else). Они позволяют изменять поток кода в зависимости от значения определенной переменной. В блоке if проверяется логическое условие. Если это логическое условие не соблюдается, выполняется код, определенный в блоке else. Это все общеизвестно.

Но также можно использовать ключевое слово else в любом цикле for и while. Функциональность else в этом случае сводится к выполнению кода только при успешном завершении цикла без вклинивания оператора break.

Как это может пригодиться?

Предположим, у нас есть список чисел. Мы хотим написать логику, определяющую, является ли любое отдельное число в кортеже четным.

Следуя традиции, можем написать что-то вроде:

# определяем список чисел
numbers: list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# также определяем переменную-флаг, которая укажет, было ли найдено четное число
found_even: bool = False

for num in numbers:
# если остаток после деления на 2 равен 0, то число четное
if num % 2 == 0:
print(f"{num} is even")
# устанавливаем флаг в True, потому что нашли четное число
found_even = True
# мы можем остановить выполнение, потому что нашли четное число
break

# если значение флага False, то четных чисел не найдено
if not found_even:
print("No even numbers found")

Эта логика относительно проста. Применяем флаг (в данном случае переменная found_even) для обозначения того, найдено ли четное число или нет. Если в процессе итерации находится четное число, используем ключевое слово break, чтобы остановить выполнение цикла.

Вышеприведенное можно записать следующим образом:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for num in numbers:
if num % 2 == 0:
print(f"{num} is even")
break
else:
print("No even numbers found")

Теперь переменная-флаг found_even больше не требуется. Мы можем использовать ключевое слово else, чтобы вывести “Четные числа не найдены” только в том случае, если ключевое слово break так и не будет задействовано в процессе итерации цикла.

Секрет 2. Оператор walrus

Оператор walrus (:=) был введен в версию Python 3.8. Он используется для назначения переменных со значениями в качестве выражений.

Рассмотрим следующий пример. Нам необходимо реализовать логику, которая генерирует последовательность случайных чисел до тех пор, пока не будет сгенерировано определенное число.

Предположим, нам нужно получить 10. Обычно пишем что-то вроде:

import random

rand = None
while True:
# генерация случайного числа от 1 до 100
rand = random.randint(1, 100)
# если случайное число равно 10, прервать выполнение
if rand != 10:
print(rand)
else:
break

# это будет выполнено только в том случае, если мы получим 10 и прервем цикл
print("We got a 10!")

Генерируем в цикле случайное число и сохраняем его в переменной rand. Количество итераций зависит от значения переменной rand. Чем быстрее rand станет равным 10, тем быстрее прервем цикл.

Теперь с помощью оператора walrus получим ту же функциональность, используя приведенный ниже код:

import random

while (rand := random.randint(1, 100)) != 10:
print(rand)

print("We got a 10!")

Здесь сообщаем Python, что хотим, чтобы цикл while выполнялся до тех пор, пока значение rand не станет равно 10. Кроме того, сообщаем ему, что rand будет получать свое значение из random.randint(1, 100) с каждой новой итерацией.

Секрет 3. Многоточие

Многоточие (...)  —  интересное ключевое слово и довольно полезное на ранних стадиях разработки. При оперировании сложной логикой лучшей стратегией является “разделяй и властвуй”  —  разбиение сложной логики на более мелкие и легко реализуемые составляющие. Обычно требуется реализовать сначала более мелкие функции, а затем связать все вместе.

Однако иногда (по разным причинам) нам нужно определить функцию, но написать ее код позже. Именно для этого и нужно многоточие!

Посмотрим, как это сделать.

def some_function(x, y, z):
# какие-либо действия с x, y, z
...

# можем использовать это где угодно
some_list = [1, 2, 3, ...]

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

Секрет 4. Атрибуты функций

В Python любая функция хранится как объект. Любой объект может иметь атрибуты. Поэтому в Python функции также могут иметь атрибуты.

Можно использовать атрибуты функций для определения дополнительной информации о функции и других метаданных. Предположим, что нужно отследить, сколько раз была вызвана определенная функция. Можно установить атрибут counter, который будет увеличиваться после каждого вызова.

def my_function(x):
return x * 2

my_function.counter = 0
my_function.counter += 1
print(my_function.counter)

Еще один интересный случай использования атрибутов функций  —  установка атрибута is_verbose для переключения между выводом дополнительной информации или отсутствием такого функционала. Часто это делается путем передачи дополнительного параметра в функцию. Использование атрибутов функции позволяет пренебречь дополнительным параметром.

Другой хороший пример  —  отображение строки документации (docstring) функции.

def my_function(x):
"""This is a docstring for my_function."""
return x * 2

print(my_function.__name__)
print(my_function.__doc__)

Вызывая атрибут __name__, мы даем указание Python вывести имя функции. Атрибут __doc__, в свою очередь, выводит строку документации функции.

Секрет 5. Тернарный оператор

Тернарный оператор в Python  —  это способ определить оператор if-else как однострочник.

Рассмотрим следующий пример:

x = 5
y = 10

if x > y:
result: str = "x is greater than y"
else:
result: str = "y is greater than or equal to x"

print(result)

Можно получить ту же функциональность, используя синтаксис тернарного оператора следующим образом:

x = 5
y = 10

result = "x is greater than y" if x > y else "y is greater than or equal to x"

print(result)

Заключение

Мы рассмотрели 5 возможностей Python, которые не считаются общеизвестными. Назначение этих скрытых возможностей не только в том, чтобы лишний раз прокачать свои навыки. Они помогут сэкономить драгоценное время разработки, улучшить читаемость кода и повысить его эффективность.

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи David Farrugia: 5 Awesome Python Hidden Features — Part 1

Предыдущая статьяКак компьютер выполняет математические вычисления
Следующая статьяReact Native: полное руководство по созданию виджета для домашнего экрана для iOS и Android