1. Оператор with

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

with open(‘/tmp/file.txt’) as f:
data = f.read()

В этом коде оператор with гарантирует, что дескриптор файла f будет автоматически закрыт после завершения блока кода. Это эквивалентно следующей записи:

f = open(‘/tmp/file.txt’)
try:
data = f.read()
finally:
f.close()

Оператор with особенно полезен при работе с ресурсами, доступность которых не гарантирована, например с сетевыми соединениями.

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

with closing(MySQLdb.connect(host=’localhost’, user=’root’, passwd=’secret’)) as conn:
 cur = conn.cursor()
 cur.execute(“USE mydatabase”)
 …

----
Приведенный выше код открывает соединение с базой данных MySQL и создает курсор. Затем курсор используется для выполнения оператора SQL, который возвращает некоторые данные. Наконец, соединение закрывается.

2. Оператор yield

Оператор yield в Python является мощным инструментом для создания итераторов. При вызове функции, содержащей yield, возвращается итератор, который можно использовать для итерации по значениям функции yield. Для примера рассмотрим следующий код:

def my_range(start, end):
 while start <= end:
 yield start
 start += 1

for i in my_range(1, 10):
 print(i)

Этот код определяет функцию my_range, которая возвращает итератор по диапазону значений. Затем в цикле for выполняется итерация по значениям, возвращаемым итератором.

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

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

import random

def rand_stream():
 while True:
 yield random.random()

3. Функции lambda

Lambda-функции в Python  —  это анонимные функции, которые определяются в одной строке кода. Они часто используются в качестве функций обратного вызова и аргументов для других функций.

Например, следующий код сортирует список строк по их длине:

strings = [‘foo’, ‘bar’, ‘baz’]
strings.sort(key=lambda s: len(s))

В этом коде функция lambda s: len(s) передается в качестве аргумента key методу sort. Эта функция используется для определения порядка сортировки строк в списке.

4. Функции iter и next

Функции iter и next в Python используются для работы с итераторами. Функция iter возвращает итератор для объекта, а next  —  следующее значение из итератора. Для примера рассмотрим следующий код:

l = [1, 2, 3]
it = iter(l)

print(next(it))
print(next(it))
print(next(it))

Этот код создает список l и итератор it для этого списка. Затем функция next используется для получения значений из итератора. Этот код выводит следующее:

5. Функция enumerate

Функция enumerate используется в Python для итерации по последовательности значений и возврата кортежа вида (index, value) для каждого значения в последовательности. Для примера рассмотрим следующий код:

l = [‘a’, ‘b’, ‘c’]
for index, value in enumerate(l):
 print(index, value)

Этот код выполняет итерацию по списку l и выводит следующее:

6. Функции any и all

Функции any и all в Python используются для проверки истинности всех (all) или любого (any) значения в последовательности (соответственно). Для примера рассмотрим следующий код:

l = [True, True, False]
if any(l):
 print(“At least one value is true”)/(“Хотя бы одно значение истинно”)
if all(l):
 print(“All values are true”)/(“Все значения истинны”)

Этот код выводит следующее:

Хотя бы одно значение истинно.

7. Декораторы

Декораторы в Python  —  это отличный способ расширить поведение функции без изменения ее кода.

Декораторы применяются к функции путем добавления символа @ к имени функции. Для примера рассмотрим следующий код:

@log_calls
def f():
print(“f called”)

Этот код определяет декоратор log_calls, который регистрирует каждый вызов функции f. Декоратор @log_calls применяется к функции f, добавляясь к имени функции.

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

@log_calls
@cache_results
def f():
print(“f called”)

В этом коде функция f декорирована двумя декораторами: log_calls и cache_results. Это эквивалентно написанию следующего кода:

f = log_calls(cache_results(f))

Цепочка декораторов  —  это удобный способ применения нескольких декораторов к функции без необходимости изменять код функции.

Теперь в вашем Python-арсенале будут семь наиболее полезных расширенных возможностей этого языка. Эти мощные инструменты помогут писать более качественный код на Python.

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

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Alain Saamego: 7 Advanced Python Features You Should Know About

Предыдущая статья6 проверенных методов повышения безопасности Node.js
Следующая статьяОсновы разработки приложений: уровень клиента