Обновить
41
0.9
Николай Меркин @nickolaym

Пользователь

Отправить сообщение

https://gcc.godbolt.org/z/1bh4d616d

Что-то с лямбдами неправда написана. array-to-pointer conversion выполняется только в случае [arr=arr]

#include <iostream>

int main() {
    int a[] = {1,2,3,4,5,6,7,8,9,10};

    [=]() { std::cout << sizeof(a) << std::endl; } ();    // 40
    [&]() { std::cout << sizeof(a) << std::endl; } ();    // 40
    [a]() { std::cout << sizeof(a) << std::endl; } ();    // 40
    [a=a]() { std::cout << sizeof(a) << std::endl; } ();  //  8
}

(На этом месте мне надоело ревьювить статью).

Резюме: написано юниором для юниоров, где-то правильно, где-то чушь, бессистемно и поверхностно с прорехами.

Ну или написано мидлом, который попробовал себя в роли препода-стажёра.

20. Что такое слайс(slice)?

Совсем банальный вопрос, но ладно.

Совсем не банальный. Слайс (срез) - это разновидность ключа.

Для контейнеров с индексированным доступом (list, str, всякие рукодельные) обычный ключ - это целое число. Но можно указать ключ "слайс".

В питоне есть особый синтаксис для этого (вообще, в питоне дофига синтаксического сахара): `the_container [from:to]` и `the_container [from:to:step]`

Но можно и по-честному: `the_container [ slice(from,to) ]` и `the_container [ slice(from,to,step) ]`

Результатом такого запроса будет... а уж это как контейнер устроен.

Строки и списки - "жадные", они тупо возвращают строку/список с выбранными элементами.

Какая-нибудь таблица БД или разреженная матрица в хорошей библиотеке линейной алгебры - сконструирует ленивый объект-курсор, который умеет скакать по срезу по нужным элементам.

ДЕТИ! НЕ ИГРАЙТЕ С ПИТОНОМ С ГИГАНТСКИМИ МАССИВАМИ!

Особенно весело, если вам хочется идиоматически проверить строку на палиндром:

def is_palindrome_GREEDY_AND_DUMMY(s):
  return s == s[::1]  # красиво, но с копированием

def is_palindrome_LAZY_BUT_TWICE_LONG(s):
  return all(c == r for c,r in zip(s, reversed(s)))

def is_palindrome_LAZY_AND_PRETTY(s):
  return all(s[i] == s[-i-1] for i in range(len(s)//2))

18 В чём разница между пакетами и модулями?

Разница в том, что пакет - это предмет для установки. А модуль - предмет для импортирования.

Пакет состоит из модулей. Как минимум, из модуля "вот прямо этот самый пакет", который физически представлен файлом __init__.py в корневом каталоге пакета.

А внутри может быть этажерка модулей какой угодно глубины. Обычно один файл - один модуль. Но это необязательно.

Также, если вы попытаетесь добавить два ключа в словарь с одинаковым хеш-кодом, то второй ключ перезапишет первый:

Неправда. Хеши определяют только "слабую эквивалентность", попадание ключей в одну корзину. А вот внутри корзины ключи различаются по свойству именно "настоящей" эквивалентности.

Естественно, есть аксиома о том, что из эквивалентности следует равенство хешей. Если эту аксиому сломать, то словарь будет работать неправильно.

class K:
  def __init__(self, v, h):
    self.v, self.h = v, h
  def __hash__(self):
    return self.h
  def __eq__(self, other):
    return self.v == other.v
  def __repr__(self):
    return repr((id(self), self.v, self.h))

x, y = K(1, 100), K(2, 100)
z = K(1, 300)  # ломаный ключ

hash(x), hash(y), hash(z)
> 100, 100, 200

x == x, x == y, x == z
> True, False, True

d = {x:10, y:20}
d
> {(1111111, 1, 100): 10,
   (2222222, 2, 100): 20}

d[x], d[y]  # коллизия хешей - не проблема
> 10, 20
d[z]  # ломаный хеш - проблема
> KeyError

{x:10, y:20, z:30}
> {(1111111, 1, 100): 10,
   (2222222, 2, 100): 20,
   (3333333, 1, 300): 30}

А то, что значения (и следовательно, хеши тоже) у bool, int и float совпадают - это не баг, а фича.

Внезапно, bool может работать как индекс, то есть, как целое число. И участвовать в арифметике.

ny = ["no", "yes"]
ny[False], ny[True]
> "no", "yes"

1-True, bool(1-True)
> 0, False

16. Что такое декоратор? Как написать собственный?

Как приучать человека к хорошему? Импортировать functools и задействовать там декоратор декораторов functools.wraps

Это - если по-быстрому.

А по-медленному - надо объяснить, что ещё делает декоратор, помимо того, что это такая функция высшего порядка.

А она, между прочим, умеет тырить атрибуты своего аргумента - функции или класса. Чтобы результат обладал схожими атрибутами: таким же именем, например.

8. Чем отличаются многопоточное и многопроцессорное приложение?

МногоПРОЦЕССное и многоПРОЦЕССОРНОЕ - это разные вещи.

Несколько процессов могут быть спроектированы так, чтобы жить исключительно на одном процессоре, пользоваться общей памятью, в некоторых случаях даже закладываться на одноядерность.

Многопроцессность в таком случае - это всего лишь вопросы изоляции адресных пространств, управления ресурсами системы и живучести (изолированный процесс можно убить без травмирования остальных, тогда как неизолированный поток убивать опасно).

Распределённые приложения - это и более эффективное управление ресурсами процессоров, и более медленный обмен данными.

За эллипсис спасибо, кстати, не знал. Прикольная фишка.

Ну прямо начиная с первого вопроса. И с ответа на него.

Строк как минимум две - str и bytes. Забыли тип function (хотя лямбда идёт сразу вторым вопросом). Забыли тип object. Забыли тип type, ахаха!

И вообще вся систематика тут высосана непойми откуда. Если перечислять все встроенные типы, доступные из коробки прямо в builtins, так их там заметно больше!

types = [
    n
    for n in dir(__builtins__)
    if isinstance(getattr(__builtins__, n), type)
]

len(types)

> 93

types

> [
 'ArithmeticError',
 'AssertionError',
 'AttributeError',
 'BaseException',
 'BlockingIOError',
 'BrokenPipeError',
 'BufferError',
 'BytesWarning',
 'ChildProcessError',
 'ConnectionAbortedError',
 'ConnectionError',
 'ConnectionRefusedError',
 'ConnectionResetError',
 'DeprecationWarning',
 'EOFError',
 'EnvironmentError',
 'Exception',
 'FileExistsError',
 'FileNotFoundError',
 'FloatingPointError',
 'FutureWarning',
 'GeneratorExit',
 'IOError',
 'ImportError',
 'ImportWarning',
 'IndentationError',
 'IndexError',
 'InterruptedError',
 'IsADirectoryError',
 'KeyError',
 'KeyboardInterrupt',
 'LookupError',
 'MemoryError',
 'ModuleNotFoundError',
 'NameError',
 'NotADirectoryError',
 'NotImplementedError',
 'OSError',
 'OverflowError',
 'PendingDeprecationWarning',
 'PermissionError',
 'ProcessLookupError',
 'RecursionError',
 'ReferenceError',
 'ResourceWarning',
 'RuntimeError',
 'RuntimeWarning',
 'StopAsyncIteration',
 'StopIteration',
 'SyntaxError',
 'SyntaxWarning',
 'SystemError',
 'SystemExit',
 'TabError',
 'TimeoutError',
 'TypeError',
 'UnboundLocalError',
 'UnicodeDecodeError',
 'UnicodeEncodeError',
 'UnicodeError',
 'UnicodeTranslateError',
 'UnicodeWarning',
 'UserWarning',
 'ValueError',
 'Warning',
 'ZeroDivisionError',
 '__loader__',
 'bool',
 'bytearray',
 'bytes',
 'classmethod',
 'complex',
 'dict',
 'enumerate',
 'filter',
 'float',
 'frozenset',
 'int',
 'list',
 'map',
 'memoryview',
 'object',
 'property',
 'range',
 'reversed',
 'set',
 'slice',
 'staticmethod',
 'str',
 'super',
 'tuple',
 'type',
 'zip']

Итак, что мы тут видим?

  • базовые типы (object и type)

  • исключения (Exception и его наследники)

  • скаляры (bool, complex, float, int) и сюда же можно добавить особенный служебный скаляр slice

  • массивы байтов (bytearray, bytes, str)

  • универсальные контейнеры (dict, frozenset, list, set, tuple)

  • итераторы / функции высшего порядка, исторически лежащие в builtins и оформленные как классы с конструктором (enumerate, map, reversed, zip)

  • даже не знаю, куда отнести range - фейковый контейнер чисел

  • декораторы, также исторически оформленные как классы с конструктором (classmethod, property, staticmethod)

  • адаптер класса super

При этом мы не видим кое-какие типы, у которых нет конструкторов: function, NoneType и т.п. "(_|_) есть, а слова нет", сказали бы хаскельщики.

Три задачки элементарные и одна головоломная.

Допустим, фермер хочет переместить более 2000 яблок на небольшое расстояние N. Он делает 5 ходок: везёт 1000 туда, N обратно, 1000 туда, N обратно, оставшиеся туда - и съедает 5N по дороге.

Допустим, фермер делает это в несколько приёмов - на расстояния N1, N2, ... в сумме дающие N. Что так, что этак, он всё равно съест 5N1 + 5N2 + ... = 5(N1+N2+...) = 5N.

Поэтому максимальное расстояние, куда он может переместить изначальные 3000 яблок по такой схеме - это когда он съест 1000. То есть, N = 200.

Аналогично, чтобы переместить более 1000 яблок на расстояние M, надо сделать три ходки. M = 1000/3 = 333 и попугайное крылышко. Проще всего одно яблоко выбросить на 200-м километре, чем бегать за ним.

Теперь на отметке 200+333 = 533 у фермера ровно 1000 яблок, и впереди 467 километров. Которые он преодолеет за одну ходку.

И тогда останется 533 яблока.

Стих про грядущую блокаду Ленинграда. Куда как раз и шёл кондратий. (((

Про биекцию непонятно. Это что-то плохое, или это что-то недостижимое, или что автор хотел сказать? Фраза построена... странно.

Выглядит, как тупой рекламный обзор. Ключевое слово - тупой. Потому что никакой изюминки, просто вывалили портянку технических характеристик с нескольких магазинных карточек, и всё.

Ничего и так не всё (говорил поэт Басё).

Адмирал достиг своей вершины компетентности (или некомпетентности, если принять теорию Паркинсона). А вот сержант как раз находится в локальном экстремуме Данинга-Крюгера.

Эффект сержанта уверенности.

Проблема не в том, что люди не знают, чего они не знают, а в том, что они это тоже не знают. (Хотя Сократ, например, знал).

Как говорится, "что мы знаем о лисе? - ничего! и то - не все!"

Кто вы, мастер упёртости или пофигист? Отвечайте честно.

Кликать на КАЖДУЮ засеренную строчку опросника - мотивирует вас, "вы узнаете что-то новое" или заставляет думать о личности автора?

Как бы не получился комикс "брошу яваскрипт и стану проституткой". С вот этим вот преобразованием чисел в строки (или строк в числа). Потому что тут рядом тусуются проблемы локалей.

Кажется, что вопрос не по теме поста. Как это соотносится с бимапами?

И, собственно, в чём проблема? В мемоизации функции f? Зачем нужен словарь, на что должна влиять монотонность и, тем более, линейность? Какой прикладной смысл этого всего?

Информация

В рейтинге
1 804-й
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Зарегистрирован
Активность