Обновить
4
Влад Бойко@ya_boiko

Python developer

5
Подписчики
Отправить сообщение

Автору (-ам) спасибо большое за работу.

Этот процент называется относительной погрешностью и указывается именованным аргументом rel_tol функции math.isclose(), который по умолчанию равен 1e-9.

То есть если abs(a — b) меньше 0.00000001 * max(abs(a), abs(b)), то a и b считаются «близкими» друг к другу. Это гарантирует, что a и b будут приблизительно с девятью знаками после запятой.

В этом месте не досчитался нулей, либо я чего то не понимаю. Предполагаю, что должно быть 0.000_000_001 * max(abs(a), abs(b)) вместо 0.000_000_01 * max(abs(a), abs(b)) , тк по умолчаниюrel_tol = 1e-9.

Спасибо за ваш комментарий, по поводу строк - сам проводил эксперимент с большими и малыми строкам. is показывал True

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

Да, вы верно утверждаете. По-разному происходит изменение мутабельного и немутабельного объекта. Рад, что статья оказалась для вас полезной, готовлю вторую часть!

Спасибо большое за ваш комментарий. Вы указали мне на пробелы в знаниях. Я действительно в некоторых вопросах не до конца разобрался, исправляюсь. Я понял разницу между изменением и созданием нового объекта. Внес правки в статью

Посидел, разобрался, подумал. Конечно, вы правы, я соглашусь с вами

Спасибо за вопрос. Мой комментарий выше не совсем верный, я внес исправления в ответ на вопрос в статье.

Какая сложность присвоения закешированного значения я, к сожалению, точно не могу сказать. Думаю, что кэш в Python - это хеш-таблица. Поэтому, возможно, сложность O(1).

Да, нашел перевод статьи https://habr.com/ru/post/273045/. В ней как раз описывается как работает list "изнутри". Это действительно массив, я оказался прав в том споре, спасибо!

Спасибо за вашу статью! Спорил на техническом собеседование что такое list в python - массив или связанный список. Думаю, что я оказался прав - list хранится в памяти как массив. Надеюсь в 2к20 list "изнутри" не изменился)

Тоже нашел несколько примеров. Давайте разберемся. Пример со списком:

def foo(value):
  print("a in function", id(value), value)
  value[0] = 1
  print("a in function", id(value), value)
  
a = [1000]
print("a", id(a), a)
foo(a)
print("a", id(a), a)

# a 60795240 [1000]
# a in function 60795240 [1000]
# a in function 60795240 [1]
# a 60795240 [1]

Видно, что при изменение значения a[0] внутри функции, значение a[0] изменилось и вне ее. Адрес памяти один и тот же. Значит в функцию a передается по ссылке.

Другой пример уже с числом.

def foo(value):
  print("a in function", id(value), value)
  value = 1
  print("a in function", id(value), value)

a = 1000
print("a", id(a), a)
foo(a)
print("a", id(a), a)

# a 61223712 1000
# a in function 61223712 1000
# a in function 1721690624 1
# a 61223712 1000

Переменная a передается в функцию, значение аргумента внутри функции изменяется и меняется адрес памяти, а вне функции остается тот же адрес памяти и то же значение, что и при объявлении.

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

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

Да, действительно. Круто, что вы нашли такой яркий пример, спасибо!

Спасибо! Да, действительно. Исправляю недочет

print(type(None))
# <class 'NoneType'>

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

Под поиском я понимаю поиск конкретного значения, по таблице из документации вижу, что есть две операции - get item и x in s. Правильнее будет вместо одной операции "поиск" указать эти две операции, как считаете?

Спасибо, это важное для меня замечание. Я попробую и приведу свой пример

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

В приведенном примере неслучайно используется изменяемый тип данных. Для неизменяемых типов переменные с одинаковым значением будут иметь одинаковый адрес памяти.

a = 3.14
b = 3.14
print(id(a), id(b), a == b, a is b)
# 170944  170944  True  True

Предложение-комментарий, которое я приведу сразу ниже, относится к предыдущему блока кода, где указан пример со списками:

В приведенном примере неслучайно используется изменяемый тип данных.

А следующее предложение-комментарий относится к следующему блоку кода, где используется тип float, неизменяемый.

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

Да, здесь у меня небольшая опечатка, исправил
Спасибо!

От автора:
Код в некоторых местах отображается с неправильными отступами, это не ошибка автора

Информация

В рейтинге
Не участвует
Откуда
Краснодар, Краснодарский край, Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Бэкенд разработчик
Младший
Git
Python
Django
ООП
PHP
Docker
SOLID
Алгоритмы и структуры данных