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.
Читайте также:
- Сравниваем целочисленное и линейное программирование в Python
- Работа с панелью индикаторов. Руководство программиста Python. Часть 3
- Разворачиваем декораторы. Часть 2
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Alain Saamego: 7 Advanced Python Features You Should Know About