На сайте с официальной документацией по contextlib размещен пример создания менеджера контекста с помощью декоратора @contextmanager. Вы не обозначили возмонжости, которые он предоставляет.
from contextlib import contextmanager
@contextmanager
def tag(some_val):
print(some_val)
try:
yield 2
except:
print("was exception!")
finally:
print("end")
with tag("test") as val:
print(val)
a = 2 / 0
Действительно, при входе в блок with выполняется код до оператора yield. Но вы не обозначили, что с помощью yield можно вернуть объект на который можно сослаться с помощью оператора as внутри блока with.
Также, необходимо обернуть оператор yield в блок try/except/finally. finally является аналогом метода __exit__ и гарантирует нам, что при любом выходе из блока with выполнится завершающий код (например, закрытие db). Блок except необходим для обработки исключений возникших внутри блока with.
Понятно. Получается HAL находится между аппаратным уровнем и программным. Но мы не можем получить доступ к нему без запуска модуля (в нашем случае камеры)?
Почему нужно запускать модуль камеры, чтобы получить информацию о её возможностях (в каком нибудь общем виде для всех камер)? Разве нельзя это хранить где-то в устройстве в виде публичной информации и по API стучаться именно к этой информации?
Данное сравнение времени и памяти совершенно неверное.
В случае с функцией вы выполняете вычисление квадратов и сохраняете их в список. В случае же с генератором вы просто создали объект типа генератор, не вызывая в этом случае вычисления. Поэтому сравнивать время и память в данном случае будет неправильно.
Генераторы будут эффективны только в том случае, если нам не нужны все значения сразу (либо не все значения вообще будут задействованы). Если же нам нужно работать со всеми значениями вычисленными в теле функции (генератора) сразу, то в этом случае функция может оказаться даже более эффективной по времени выполнения.
Information
Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Действительно, при входе в блок with выполняется код до оператора yield. Но вы не обозначили, что с помощью yield можно вернуть объект на который можно сослаться с помощью оператора as внутри блока with.
Также, необходимо обернуть оператор yield в блок try/except/finally. finally является аналогом метода __exit__ и гарантирует нам, что при любом выходе из блока with выполнится завершающий код (например, закрытие db). Блок except необходим для обработки исключений возникших внутри блока with.
Ещё не всё. В январе только прекратят работать над последним релизом, а в апреле хотят выложить этот релиз (2.7.18, если я не ошибаюсь).
P.S.: Я за Python 3 :)
В случае с функцией вы выполняете вычисление квадратов и сохраняете их в список. В случае же с генератором вы просто создали объект типа генератор, не вызывая в этом случае вычисления. Поэтому сравнивать время и память в данном случае будет неправильно.
Генераторы будут эффективны только в том случае, если нам не нужны все значения сразу (либо не все значения вообще будут задействованы). Если же нам нужно работать со всеми значениями вычисленными в теле функции (генератора) сразу, то в этом случае функция может оказаться даже более эффективной по времени выполнения.