7 расширенных возможностей Python



Книга 7 расширенных возможностей Python

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.



375   0  

Comments

    Ничего не найдено.