Совсем не банальный. Слайс (срез) - это разновидность ключа.
Для контейнеров с индексированным доступом (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))
Разница в том, что пакет - это предмет для установки. А модуль - предмет для импортирования.
Пакет состоит из модулей. Как минимум, из модуля "вот прямо этот самый пакет", который физически представлен файлом __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 может работать как индекс, то есть, как целое число. И участвовать в арифметике.
16. Что такое декоратор? Как написать собственный?
Как приучать человека к хорошему? Импортировать functools и задействовать там декоратор декораторов functools.wraps
Это - если по-быстрому.
А по-медленному - надо объяснить, что ещё делает декоратор, помимо того, что это такая функция высшего порядка.
А она, между прочим, умеет тырить атрибуты своего аргумента - функции или класса. Чтобы результат обладал схожими атрибутами: таким же именем, например.
8. Чем отличаются многопоточное и многопроцессорное приложение?
МногоПРОЦЕССное и многоПРОЦЕССОРНОЕ - это разные вещи.
Несколько процессов могут быть спроектированы так, чтобы жить исключительно на одном процессоре, пользоваться общей памятью, в некоторых случаях даже закладываться на одноядерность.
Многопроцессность в таком случае - это всего лишь вопросы изоляции адресных пространств, управления ресурсами системы и живучести (изолированный процесс можно убить без травмирования остальных, тогда как неизолированный поток убивать опасно).
Распределённые приложения - это и более эффективное управление ресурсами процессоров, и более медленный обмен данными.
Ну прямо начиная с первого вопроса. И с ответа на него.
Строк как минимум две - str и bytes. Забыли тип function (хотя лямбда идёт сразу вторым вопросом). Забыли тип object. Забыли тип type, ахаха!
И вообще вся систематика тут высосана непойми откуда. Если перечислять все встроенные типы, доступные из коробки прямо в builtins, так их там заметно больше!
Допустим, фермер хочет переместить более 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 километров. Которые он преодолеет за одну ходку.
Выглядит, как тупой рекламный обзор. Ключевое слово - тупой. Потому что никакой изюминки, просто вывалили портянку технических характеристик с нескольких магазинных карточек, и всё.
Адмирал достиг своей вершины компетентности (или некомпетентности, если принять теорию Паркинсона). А вот сержант как раз находится в локальном экстремуме Данинга-Крюгера.
Как бы не получился комикс "брошу яваскрипт и стану проституткой". С вот этим вот преобразованием чисел в строки (или строк в числа). Потому что тут рядом тусуются проблемы локалей.
Кажется, что вопрос не по теме поста. Как это соотносится с бимапами?
И, собственно, в чём проблема? В мемоизации функции f? Зачем нужен словарь, на что должна влиять монотонность и, тем более, линейность? Какой прикладной смысл этого всего?
https://gcc.godbolt.org/z/1bh4d616d
Что-то с лямбдами неправда написана. array-to-pointer conversion выполняется только в случае
[arr=arr](На этом месте мне надоело ревьювить статью).
Резюме: написано юниором для юниоров, где-то правильно, где-то чушь, бессистемно и поверхностно с прорехами.
Ну или написано мидлом, который попробовал себя в роли препода-стажёра.
Совсем не банальный. Слайс (срез) - это разновидность ключа.
Для контейнеров с индексированным доступом (list, str, всякие рукодельные) обычный ключ - это целое число. Но можно указать ключ "слайс".
В питоне есть особый синтаксис для этого (вообще, в питоне дофига синтаксического сахара): `the_container [from:to]` и `the_container [from:to:step]`
Но можно и по-честному: `the_container [ slice(from,to) ]` и `the_container [ slice(from,to,step) ]`
Результатом такого запроса будет... а уж это как контейнер устроен.
Строки и списки - "жадные", они тупо возвращают строку/список с выбранными элементами.
Какая-нибудь таблица БД или разреженная матрица в хорошей библиотеке линейной алгебры - сконструирует ленивый объект-курсор, который умеет скакать по срезу по нужным элементам.
ДЕТИ! НЕ ИГРАЙТЕ С ПИТОНОМ С ГИГАНТСКИМИ МАССИВАМИ!
Особенно весело, если вам хочется идиоматически проверить строку на палиндром:
Разница в том, что пакет - это предмет для установки. А модуль - предмет для импортирования.
Пакет состоит из модулей. Как минимум, из модуля "вот прямо этот самый пакет", который физически представлен файлом
__init__.pyв корневом каталоге пакета.А внутри может быть этажерка модулей какой угодно глубины. Обычно один файл - один модуль. Но это необязательно.
Неправда. Хеши определяют только "слабую эквивалентность", попадание ключей в одну корзину. А вот внутри корзины ключи различаются по свойству именно "настоящей" эквивалентности.
Естественно, есть аксиома о том, что из эквивалентности следует равенство хешей. Если эту аксиому сломать, то словарь будет работать неправильно.
А то, что значения (и следовательно, хеши тоже) у bool, int и float совпадают - это не баг, а фича.
Внезапно, bool может работать как индекс, то есть, как целое число. И участвовать в арифметике.
Как приучать человека к хорошему? Импортировать functools и задействовать там декоратор декораторов functools.wraps
Это - если по-быстрому.
А по-медленному - надо объяснить, что ещё делает декоратор, помимо того, что это такая функция высшего порядка.
А она, между прочим, умеет тырить атрибуты своего аргумента - функции или класса. Чтобы результат обладал схожими атрибутами: таким же именем, например.
МногоПРОЦЕССное и многоПРОЦЕССОРНОЕ - это разные вещи.
Несколько процессов могут быть спроектированы так, чтобы жить исключительно на одном процессоре, пользоваться общей памятью, в некоторых случаях даже закладываться на одноядерность.
Многопроцессность в таком случае - это всего лишь вопросы изоляции адресных пространств, управления ресурсами системы и живучести (изолированный процесс можно убить без травмирования остальных, тогда как неизолированный поток убивать опасно).
Распределённые приложения - это и более эффективное управление ресурсами процессоров, и более медленный обмен данными.
За эллипсис спасибо, кстати, не знал. Прикольная фишка.
Ну прямо начиная с первого вопроса. И с ответа на него.
Строк как минимум две - str и bytes. Забыли тип function (хотя лямбда идёт сразу вторым вопросом). Забыли тип object. Забыли тип type, ахаха!
И вообще вся систематика тут высосана непойми откуда. Если перечислять все встроенные типы, доступные из коробки прямо в builtins, так их там заметно больше!
Итак, что мы тут видим?
базовые типы (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? Зачем нужен словарь, на что должна влиять монотонность и, тем более, линейность? Какой прикладной смысл этого всего?