Запутайте своих друзей-питонов этими вопросами

Ссылка на первую часть этой истории —



1.) В Python все является объектом! 🤨

Угадайте выход?

print(isinstance(object, type))
print(isinstance(type, object))
print(isinstance(type, type))
print(isinstance(object, object))

Ответ: Верно, верно, верно, верно

Это потому, что все является объектом в python. Все типы, такие как int, str и object, являются экземплярами класса type, который является объектом, поскольку все является объектом в python.

2.) Функция sum() 😨

Угадайте результат в этом случае?

print(sum(“”))
print(sum(“”, []))
print(sum(“”, {}))

Ответ: 0, [], {}

Чтобы понять это, давайте посмотрим, как работает sum():

sum(iterable, /, start=0)

Суммирует начало и элементы итерации слева направо и возвращает итог. Элементы итерируемого объекта обычно являются числами, а начальное значение не может быть строкой. Следовательно, во всех приведенных выше случаях "" рассматривается как пустая последовательность, поэтому sum просто возвращает аргумент start как общий результат.

3.) Python ленивый! 😪

Угадайте результат в этом случае?

class follow:
   def func(self):
      return follow()
a = follow()
follow = int
print(a.func())

Ответ: 0

Это происходит потому, что код внутри функций Python выполняется только при вызове. Это означает, что все NameErrors будут вызваны, а переменные будут связаны только тогда, когда мы действительно вызовем метод. Следовательно, в нашем случае во время определения метода Python позволяет нам ссылаться на класс, который еще не определен. Но во время выполнения Python привяжет имя follow из внешней области видимости, что означает, что метод function вернет вновь созданный экземпляр int.

Немного запутанно, верно? 😅

4.) Ошибки атрибутов? 😏

Угадайте результат в этом случае?

print(sum([a.imag
   for a in [
      0, 5, 10e9, float(‘inf’), float(‘nan’)
   ]
]))

Ответ: 0,0

Вы, должно быть, думали, что это выдаст ошибку, верно? Этого не будет. Это связано с тем, что все числовые типы в Python, такие как int, float и т. д.; наследуются от базового класса object, и все они возвращают действительную и мнимую части, включая Infinityи NaNтоже.

5.) Где математика снова не работает! 😵

Угадайте результат в этом случае?

a=(1 << 53)+1
print(a+1.0 > a)

Ответ: неверно

Теперь это объяснение будет длинным, так что потерпите меня :)

Во-первых, из-за нелогичного поведения арифметики произвольной точности (длинной арифметики). Python поддерживает очень большие целые числа с типом long, но предел точности с плавающей запятой в Python ограничен.

Число 2⁵³+ 1 = 9007199254740993

Во-вторых, это ограничения точности с плавающей запятой, что означает, что его нельзя полностью представить как число с плавающей запятой Python, и, следовательно, для выполнения x + 1,0 python приводит a к float, округляя его до 9007199254740992,0, которое Python может легко представить, а затем добавляя к нему 1,0. Но из-за тех же ограничений на представление он устанавливает обратно 9007199254740992.0.

В-третьих, из-за правил сравнения. В отличие от других языков, Python не выдает ошибку при сравнении float и int и не пытается привести оба операнда к одному типу. Вместо этого они сравнивают фактические числовые значения. А поскольку 9007199254740992.0 меньше, чем 9007199254740993, выводится False.

ухххххх! 😵‍💫

Последние мысли

Итак, сколько выходных данных вы угадали на этот раз? Прямо в разделе комментариев!

Если вы не читали первую часть этой статьи, пожалуйста, не ненавидьте меня, если вам не нравится питон сейчас😂. В python еще много подобных «подводных камней», но я думаю, что это здорово, потому что это поможет вам понять внутреннюю структуру языка, а также избежать таких вариантов использования в ваших проектах, которые могут привести к неожиданным ошибкам. Ссылка на часть 1 этой статьи была опубликована в начале, посмотрите ее. И поделитесь этой замечательной статьей со своими друзьями Pythoneer.😄

До встречи в моей следующей статье…