Подробный анализ и десять различных способов изменения строки и их характеристик производительности.
http://eddmann.com/posts/ten-ways-to-reverse-a-string- in-javascript /
Эффективность этих реализаций:
Лучшая реализация (-ы) для каждого браузера
Здесь эти реализации:
Реализация 1:
function reverse(s) {
var o = '';
for (var i = s.length - 1; i >= 0; i--)
o += s[i];
return o;
}
Реализация 2:
function reverse(s) {
var o = [];
for (var i = s.length - 1, j = 0; i >= 0; i--, j++)
o[j] = s[i];
return o.join('');
}
Реализация 3:
function reverse(s) {
var o = [];
for (var i = 0, len = s.length; i <= len; i++)
o.push(s.charAt(len - i));
return o.join('');
}
Реализация 4:
function reverse(s) {
return s.split('').reverse().join('');
}
Реализация 5:
function reverse(s) {
var i = s.length,
o = '';
while (i > 0) {
o += s.substring(i - 1, i);
i--;
}
return o;
}
Реализация 6:
function reverse(s) {
for (var i = s.length - 1, o = ''; i >= 0; o += s[i--]) { }
return o;
}
Реализация 7:
function reverse(s) {
return (s === '') ? '' : reverse(s.substr(1)) + s.charAt(0);
}
Реализация 8:
function reverse(s) {
function rev(s, len, o) {
return (len === 0) ? o : rev(s, --len, (o += s[len]));
};
return rev(s, s.length, '');
}
Реализация 9:
function reverse(s) {
s = s.split('');
var len = s.length,
halfIndex = Math.floor(len / 2) - 1,
tmp;
for (var i = 0; i <= halfIndex; i++) {
tmp = s[len - i - 1];
s[len - i - 1] = s[i];
s[i] = tmp;
}
return s.join('');
}
Реализация 10
function reverse(s) {
if (s.length < 2)
return s;
var halfIndex = Math.ceil(s.length / 2);
return reverse(s.substr(halfIndex)) +
reverse(s.substr(0, halfIndex));
}
В Python тело класса выполняется в своем собственном пространстве имен до создания класса (после чего члены этого пространства имен становятся членами класса). Поэтому, когда интерпретатор достигает y = x + 1, класс B еще не существует в этой точке и, следовательно, не имеет родителя.
Для получения дополнительной информации см. http: //docs.python .org / ссылка / compound_stmts.html # класс-определение
Правила панорамирования Python для barenames очень просты и понятны: сначала локальное пространство имен, затем (если есть) внешние функции, в которых текущий вложен, затем глобальные, наконец, встроенные. Это все, что когда-либо случается, когда открывается barename, и нет необходимости запоминать или применять какие-либо сложные правила (и нет никакой необходимости, чтобы компилятор Python применял более сложные правила).
Каждый раз, когда вы хотите другой поиск, вы будете использовать квалифицированное имя, а не простое имя. Квалифицированные имена значительно более мощные, потому что поиск всегда может быть делегирован объектам, чьи атрибуты могут быть запрошены, и этот объект может реализовать любые правила поиска, в которых они нуждаются. В частности, в методе экземпляра внутри класса self.x
есть способ запросить объект self
для поиска имени атрибута 'x'
- и в этом поиске он может делегировать классы , включая реализацию концепции наследования (и множественного наследования, порядка разрешения метода и т. д.).
Тело класса (в отличие от тел методы, определенные в классе) выполняется как часть оператора class
, прежде чем объект класса будет создан или его имя привязано (в частности, прежде чем любая из баз будет определена как основание), хотя эта последняя деталь никогда не может
Итак, в вашем примере, в классе B
, barename x
просматривается с помощью универсальных правил - это имя связано локально? Если нет, то он связан в любой внешней функции, в которой этот объем вложен? Если нет, то он связан как глобальный или встроенный? Если ни одно из вышеперечисленных вопросов, использующее указанное имя barename, не вызывает исключения из-за ошибки имени.
Поскольку вы хотите, чтобы другая последовательность поиска, чем правила поиска в barename, универсально соблюдались, тогда, очевидно, вам нужно использовать квалифицированный имя, а не barename; и мгновенное отражение ясно покажет, что «один очевидный выбор» для квалифицированного имени, используемого для вашей цели, должен быть A.x
- так как вы хотите , чтобы он был поднят ( базы не были записаны нигде еще в этой точке, в конце концов ... это будет метакласс, обычно type
, который будет делать привязки баз как часть своей работы, когда он получает после выполняется тело класса! -).
Некоторые люди так остро привязаны к другим «магическим» правилам поиска барменов, которые они просто не могут выдержать этот аспект Python (изначально вдохновленный, по-моему, Modula-3, малоизвестный язык, который очень хорошо рассмотрен в кругах теоретиков ;-) - нужно написать self.x
в методе, чтобы указать, что x
должно быть посмотрел на self
, вместо того, чтобы использовать универсальные правила barename, например, диски таких людей, батты.
Мне нравится простота и универсальность правил поиска barename, и мне нравится использовать квалифицированный nam es вместо barenames в любое время, когда я хочу любой другой формы поиска ... но тогда не секрет, что я безумно люблю Python (у меня есть свои собственные ворчания - например, global x
, поскольку инструкция всегда заставляет сканирование моего сайта, где я бы скорее написал global.x
, т. е. global
было встроенным именем для «текущего исполняемого модуля» ... Мне нравятся квалифицированные имена! -), это? -)
class B(super=A): y = super.x + 1
. (Я знаю о магической силе функции super
, я в ужасе от нее.)
– Alexey
23 February 2018 в 20:41