Comments 56
htonl()
был реализован через hex()
, строковые манипуляции, и int(,16)
:-/The int type has a new method int.bit_count(), returning the number of ones in the binary expansion of a given integer, also known as the population count. (Contributed by Niklas Fiekas in bpo-29882.)
Фактически используемый код:
u -= (u >> 1) & 0x55555555;
u = (u & 0x33333333) + ((u >> 2) & 0x33333333);
u = (u + (u >> 4)) & 0x0f0f0f0f;
return (u * 0x01010101) >> 24;
Сумеет ли компилятор свернуть это в одну инструкцию процессора — зависит и от компилятора, и от процессора.
Сделать это можно выполнив эти команды:А лучше воспользоваться pyenv.
ЗЫ. Паттерн матчинг из Scala, yay!!!
А что, Питон только на x86 работает? (риторический вопрос)
В GCC, Clang есть __builtin_popcount(), который транслируется уже в то, что будет самым эффективным на данной платформе с данными опциями сборки. Если же другой компилятор, то есть масса приёмов типа такого, которые решают задачу уже независимо от возможностей процессора. (В конкретном CPython этот builtin не применили, видимо, из-за нежелания завязываться на компилятор. Для супероптимизированного кода это было бы проблемой, но для Python с его 20-100 раз потерей на динамической типизации и т.п. — точно не страшно).
Здесь видно, что с шаблонами, написанными в стиле конструкторов, можно сопоставить атрибуты класса.
по-моему, синтаксис не очень получился. Вносит сумятицу, т.к. там как будто бы конструктор, а значит предполагается потом сравнение ссылок на экземпляры. Что не должно срабатывать, а срабатывает, потому что это «не конструктор, но выглядит как конструктор».
Досточно погуглить.
PS. s/язык/предмет экспертизы/g; s/тем более аж целую неделю/вообще/g
После того, как я поигрался с многопоточностью в Rust'е (даже в rust'е!) мой энтузиазм сильно поугас. За пределами rayon'а (job stealing) оно настолько выносит мозг (вне зависимости от языка программирования), что легче плюнуть, чем продираться.
Сделали бы как в других языках чтобы не было путаницы с регулярными выражениями.
Сопоставление с образцом и оператор ветвления — вещи принципиально разные, хотя второе реализует подмножество поведений первого. В других языках для этого обычно используется как раз match
(например, Rust, Nemerle).
на самом деле слово switch
оскорбительно
посмотрите сами
одно из значений — хлыст.
Доподлинно известно, что это слово напоминает времена угнетения и рабства, и при использовании некоторыми группами лиц может вызывать дискомфорт.
К сожалению, я смог написать об этом только сейчас, хотя передать всю глубину моего возмущения тем фактом, что этот термин до сих пор используется в программировании, я смог-бы три дня назад.
Своим сарказмом Вы оскорбили
какой юмор.
я оскорблен тем, что кто-то посчитал моё предположение шуткой.
Ничего смешного в этом нет.
Более того, с болью в сердце я вынужден признаться: мои предки так же подвергались угнетению, угонялись в рабство и подвергались внеэкономической эксплуатации.
Да, да! Османское иго никто не забыл и не собирается просто так прощать.
Да и к венграм у меня есть серьезные вопросы по поводу кое-каких событий пятивековой давности.
Мысли об этом ранят мне душу и не дают спокойно кушать.
И вообще...
Написано терпимо для гуглоперевода, но как образовательному ресурсу вам следует знать, что pattern matching по-русски называется "сопоставление с образцом".
Однако, начиная с Python 3.10, синтаксис определения псевдонимов типов будет изменён:Серьёзно? Добавление подсказки типа переменной (точнее, самого типа для этой подсказки) автор называет изменением синтаксиса?
FileName: TypeAlias = str
def func(person): # person = (name, age, gender) match person: case (name, _, "male"): print(f"{name} is man.") case (name, _, "female"): print(f"{name} is woman.") case (name, age, gender): print(f"{name} is {age} old.") func(("John", 25, "male")) # John is man.
Не понял, откуда здесь взялись переменные name и _
Не понял, откуда здесь взялись переменные name и _
Из оператора
match
: он ей и присваивает значение.Потому что проверка совпадений идет по порядку их объявления, оно попало под паттерн на первом кейсе.
На других языках это было бы что то типа
match person:
case (var name, _, "male"):
...
case (var name, var age, _):
...
Короче, никаких изменений
Что-то питон стал напоминать Свифт :)
Match невообразимо переусложнили. Нафига? Задача была — сделать простой switch, а родилось нечто, что будет непонятно 95 процентам читающих код. Я бы такой код в продакшн не пускал.
Никто не запрещает пользоваться «базовым» match, который просто позволит избавиться от длинных цепочек if-elif-else (в пользу столь же длинных цепочек match)
[a, [b, c]] = something()
, и это не создание вложенных списков, а наоборот, их разворачивание. Эта конструкция вас тоже смущала?Всё-таки немножко актуальнее задача «сделать простой match» (на уровне Haskell 25-летней давности или Scala 17-летней).
Там есть вот такое… хотя, может, потом и убрали.
Структурное сопоставление с шаблоном приблизит Python на шаг ближе к ФП))
Все важные фичи и изменения в Python 3.10