Я иногда использую getattr(..)
для ленивого инициализации атрибутов вторичной важности непосредственно перед тем, как они используются в коде.
Сравните следующее:
class Graph(object):
def __init__(self):
self.n_calls_to_plot = 0
#...
#A lot of code here
#...
def plot(self):
self.n_calls_to_plot += 1
К этому:
class Graph(object):
def plot(self):
self.n_calls_to_plot = 1 + getattr(self, "n_calls_to_plot", 0)
Преимущество второго способа заключается в том, что n_calls_to_plot
появляется только вокруг места в коде, где он используется. Это полезно для читаемости, потому что (1) вы можете сразу увидеть, какое значение оно начинает при чтении, как оно используется, (2) оно не вводит отвлечение в метод __init__(..)
, который в идеале должен быть о концептуальном состоянии класса, а не некоторый счетчик коммунальных услуг, который используется только одним из методов функции по техническим причинам, таким как оптимизация, и не имеет ничего общего со значением объекта.
fid = fopen(filename,'rb');
y = fread(fid,'uint8=>double');
Эта функция открывает файл в режиме чтения (двоичный), затем читает файл, как будто он содержит данные uint8
, и делает его похожим на данные double
.
y = y-127.5;
Для каждого из данных в массиве уменьшите значение на 127.5.
y = y(1:2:end) + i*y(2:2:end);
Теперь возьмем каждые два числа после числа в массиве и сделаем их сложным значением, например:
y = [1, 2, 3, 4, 5, 6]
y = y(1:2:end) + i*y(2:2:end);
% Result: y = [1 + 2i, 3 + 4i, 5 + 6i]