Как стать автором
Обновить

Комментарии 56

НЛО прилетело и опубликовало эту надпись здесь
Я видал в продакшн-коде, как htonl() был реализован через hex(), строковые манипуляции, и int(,16) :-/
НЛО прилетело и опубликовало эту надпись здесь
int.bit_count (если верить официальной документации) считает именно количество единиц:
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;


Сумеет ли компилятор свернуть это в одну инструкцию процессора — зависит и от компилятора, и от процессора.
НЛО прилетело и опубликовало эту надпись здесь
bitcount реализован через превращение числа в строку и подсчет ASCII-кодов символа '1'??? Ничего себе, вообще-то есть ассемблерная команда такая, popcnt:)
Всетаки в репозиторий добавили функцию на С, а пример с преобразованим в строку — это то как это можно сделать на чистом питоне.

А что, Питон только на x86 работает? (риторический вопрос)


В GCC, Clang есть __builtin_popcount(), который транслируется уже в то, что будет самым эффективным на данной платформе с данными опциями сборки. Если же другой компилятор, то есть масса приёмов типа такого, которые решают задачу уже независимо от возможностей процессора. (В конкретном CPython этот builtin не применили, видимо, из-за нежелания завязываться на компилятор. Для супероптимизированного кода это было бы проблемой, но для Python с его 20-100 раз потерей на динамической типизации и т.п. — точно не страшно).

Здесь видно, что с шаблонами, написанными в стиле конструкторов, можно сопоставить атрибуты класса.

по-моему, синтаксис не очень получился. Вносит сумятицу, т.к. там как будто бы конструктор, а значит предполагается потом сравнение ссылок на экземпляры. Что не должно срабатывать, а срабатывает, потому что это «не конструктор, но выглядит как конструктор».

Еще не очень понятно, а что будет, если вместо строкового литерала вписать переменную с данным значением? Скорее всего — нельзя? Тот же вопрос про переменную в "конструкторе", которой присвоится значение из аргумента match. Она не должна быть ранее определена?

Отчаянные питонисты всё еще ждут появления многопоточности с использованием всех ядер, чтоб уже наконец-то начать использовать потоки по полной…
НЛО прилетело и опубликовало эту надпись здесь
поэтому я и написал отчаянные питонисты
Чтобы высказать экспертное мнение учить язык совершенно необязательно (тем более аж целую неделю).
Досточно погуглить.
PS. s/язык/предмет экспертизы/g; s/тем более аж целую неделю/вообще/g
а где прочитать про многопоточность в питоне?
НЛО прилетело и опубликовало эту надпись здесь
>multithreading
Невижу в стандартной. threading не умеет в мультипоток, там все так же лочится, это скорее асинхронка.
>multiprocessing
Это не мультипоток.

Numba это вообще не в тему, это ближе к векторным вычислениям.

НЛО прилетело и опубликовало эту надпись здесь

После того, как я поигрался с многопоточностью в Rust'е (даже в rust'е!) мой энтузиазм сильно поугас. За пределами rayon'а (job stealing) оно настолько выносит мозг (вне зависимости от языка программирования), что легче плюнуть, чем продираться.

match вместо switch — видимо Oracle запатентовала слово switch.
Сделали бы как в других языках чтобы не было путаницы с регулярными выражениями.

Сопоставление с образцом и оператор ветвления — вещи принципиально разные, хотя второе реализует подмножество поведений первого. В других языках для этого обычно используется как раз match (например, Rust, Nemerle).

на самом деле слово switch оскорбительно
посмотрите сами
одно из значений — хлыст.


Доподлинно известно, что это слово напоминает времена угнетения и рабства, и при использовании некоторыми группами лиц может вызывать дискомфорт.


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

Баста, карапузики — времена, когда такие шутки действительно воспринимались шутками, прошли.
Своим сарказмом Вы оскорбили москhumorless-сообщество. Выгребайте.

какой юмор.
я оскорблен тем, что кто-то посчитал моё предположение шуткой.
Ничего смешного в этом нет.
Более того, с болью в сердце я вынужден признаться: мои предки так же подвергались угнетению, угонялись в рабство и подвергались внеэкономической эксплуатации.


Да, да! Османское иго никто не забыл и не собирается просто так прощать.
Да и к венграм у меня есть серьезные вопросы по поводу кое-каких событий пятивековой давности.
Мысли об этом ранят мне душу и не дают спокойно кушать.
И вообще...


только для тех, кто может от 04.04 отнять три дня

image

Как определить, что партнёр имитирует сарказм?

Написано терпимо для гуглоперевода, но как образовательному ресурсу вам следует знать, что 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: он ей и присваивает значение.
А я не понял, почему третий кейс не сработал…
Потому что из всех кейсов срабатывает как максимум один.
То есть если рассматривать не земных людей, а странных невообразимых существ, у которых существует ровно два пола (male и female), то вышеприведённый код никогда не будет выводить возраст?
Ок, ёрничанье на тему пятидесяти полов (или сколько их там сейчас насчитывается), возможно, было и лишним. Но хотелось бы всё-таки по существу вопроса получить ответ. Если работать только с данными, где поле gender может принимать лишь одно из значений «male» или «female», то правильно ли я понял, что третья ветка case никогда не будет вызвана?
Да, совершенно верно.
Спасибо.

Потому что проверка совпадений идет по порядку их объявления, оно попало под паттерн на первом кейсе.

На сколько я понимаю, это подставка новой переменной.
На других языках это было бы что то типа
match person:
   case (var name, _, "male"): 
      ...
   case (var name, var age, _):
      ...

Короче, никаких изменений

Match одобрям, двумя руками)

Что-то питон стал напоминать Свифт :)

Match невообразимо переусложнили. Нафига? Задача была — сделать простой switch, а родилось нечто, что будет непонятно 95 процентам читающих код. Я бы такой код в продакшн не пускал.

Мне кажется, дело здесь в сумбурном изложении
Никто не запрещает пользоваться «базовым» match, который просто позволит избавиться от длинных цепочек if-elif-else (в пользу столь же длинных цепочек match)
Проблемы возникнут, когда потребуется разбирать чужой код.
Нет такого языка, который бы не позволял писать тяжелочитаемый код.
Одно дело, когда программист пишет тяжелочитаемый код. Другое дело, когда сама синтаксическая конструкция языка оказывается сбивающей с толку и означающей совсем не то, что кажется на первый взгляд.
А с длиннющей цепочной if-elif-else не возникнут?
Речь не о длине, а о понятности кода. Этот «неконструкторный конструктор» очень нелогичен. Да, лично я в своём коде могу его и не использовать. Но когда буду читать чужой код, где эта конструкция используется, мне придётся постоянно помнить, что тут не инициализация объекта, а нечто совсем другое, хотя и выглядит абсолютно так же.
Python очень давно позволяет писать [a, [b, c]] = something(), и это не создание вложенных списков, а наоборот, их разворачивание. Эта конструкция вас тоже смущала?
Нет, не смущала, потому что я никогда не называл её для себя разворачиванием списков. Для меня это просто поэлементное присвоение одного набора объектов другому набору. Если бы это записывалось как SomeClass(a, b, c) = something(), то смущало бы.
В 2021-ом году не было и не могло быть задачи «сделать простой switch» (на уровне K&R C примерно 40-летней давности). Это было бы немножко… неактуально, вы не находите ли?

Всё-таки немножко актуальнее задача «сделать простой match» (на уровне Haskell 25-летней давности или Scala 17-летней).
… или ML 48-летней.

Не спорю, что это фича более новая и продвинутая, чем switch у K&R, но совсем ненамного — может на пару лет.
«Написание модуля расширения является относительно хорошо понятным процессом, где хорошо работает подход «поваренной книги». Существует несколько инструментов, которые в некоторой степени автоматизируют процесс. Хотя люди встраивают Python в другие приложения с самого начала своего существования, процесс встраивания Python менее прост, чем написание расширения.»
Там есть вот такое… хотя, может, потом и убрали.
pattern matching — сопоставление с шаблоном. В инструкции match в каждом операторе case располагается шаблон, с которым выполняется сопоставление.

Структурное сопоставление с шаблоном приблизит Python на шаг ближе к ФП))
Зарегистрируйтесь на Хабре, чтобы оставить комментарий