Фрагменты кода, которые поставят под сомнение ваши навыки Python

Все мы любим Python! После долгого использования этого языка, если вы углубитесь в концепции, вы будете поражены модульностью этого языка. По моему опыту, мне легко реализовать большую часть моей работы по анализу данных, используя комбинацию Python, немного PowerBI и SQL поверх него.

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

Работают ли операторы увеличения / уменьшения в Python?

В языках программирования, таких как C / C ++ / Java / Go, у нас есть операторы инкремента (++) и декремента (- -), которые обновляют значение переменной на 1. Они обычно используются при итерациях в цикле.

Если вы попытаетесь использовать эти операторы в Python, вы получите следующее:

>>> a = 10
>>> print(++a)
>>> 10
>>> print(--a)
>>> 10
>>> print(a++)
>>> SyntaxError: invalid syntax
>>> print(a--)
>>> SyntaxError: invalid syntax

Постинкремент / декремент возвращает синтаксическую ошибку, поскольку этот тип синтаксиса не определен в грамматике Python. Но как насчет операторов предварительного увеличения / уменьшения? Как мы можем получить результаты для этих операторов, даже если они возвращают концептуально неверные ответы?

Фактически, двойной плюс (++) обрабатывается как + (+ a), который анализируется обратно до (a) и поэтому не вызывает никаких ошибок. Вместо этого он вернул исходное значение «а». То же самое объяснение справедливо для (- -a).

Правильно ли вы используете функцию round ()?

Попробуйте оценить следующее, не используя Python IDE:

>>> print(round(12.5) - round(11.5))

Вероятно, вы бы округлили значение 12,5 до 13, 11,5 до 12 и окончательный ответ как 1. Этот ответ неверен в Python 3.x!

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

Это означает, что 12,5 будет округлено только до 12, поскольку это ближайшее четное число, а 11,5 также будет округлено до 12, в результате чего окончательный ответ будет равен 0. Так что используйте круглую функцию, имея в виду этот случай!

Поведение оператора моржа

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

Все возможные случаи обсуждаются в официальном релизе, и вы можете найти его на PEP 572. Один из интересных вариантов использования, который я нашел в Интернете, обсуждается ниже, где я вводю числа, пока ввод не станет -1.

В общем случае код будет выглядеть так:

Но, используя оператор моржа, он будет уменьшен до:

Если вы попытаетесь использовать оператор моржа в качестве оператора присваивания в программе, вы получите синтаксическую ошибку:

>>> a := func(x)
>>> SyntaxError: invalid syntax

Это потому, что морж «невыраженное выражение присваивания» ограничен верхним уровнем. Можно по-прежнему использовать присвоение оператора моржа, заключив выражение в круглые скобки. Это будет допустимое выражение, но не рекомендуется.

>>> (a := func(45))

Циркулярная ссылка

Эта концепция действительно поразила меня, и я не знал, существует ли такая вещь в языке Python!

Предположим, вы объявили список как:

>>> some_list = some_list[0] = [0, 1]
  1. Здесь было выполнено тройное задание. В таких случаях сначала берутся крайний левый и крайний правый, а затем оставшееся присвоение. Следовательно, переменная some_list содержит значение [0,1].
  2. Теперь самое интересное: some_list [0] нужно присвоить [0,1]. Вы можете подумать, что он должен выдать ошибку, но поскольку переменная some_list была назначена, она не вызовет никаких ошибок.
  3. Но мы также знаем, что [0,1] изначально назначается как some_list.
  4. Это означает, что some_list [0] хочет ссылаться только на себя. Даже если самооценка присвоена, она снова будет относиться к себе.
  5. Это создает бесконечную привязку и называется круговой привязкой.
  6. Python обрабатывает это, присваивая этому бесконечному значению ссылки как многоточие (…). Да! если вы распечатаете переменную some_list, вы увидите это значение.
>>> [[...], 1]

Даже если вы попытаетесь напечатать some_list [0] в нашем случае, вы получите такое же значение, как показано выше. Значение останется неизменным для любого количества уровней! Вы можете попробовать еще один сложный пример, который довольно известен:

>>> a, b = a[b] = {}, 5
>>> print(a)

Здесь также изначально a и b присвоены соответствующие значения как {} и b. Для a [b] он назначает значение 5 b как ключ для словаря, но значение указывает на словарь a, который обновляется. Следовательно, ключ 5 будет содержать кортеж из многоточия и значения 5.

{5: ({…}, 5)}

Заключение

В Python есть на что обратить внимание. Некоторые из них разработаны, чтобы происходить определенным образом, а другие - просто пасхалки, обнаруженные сообществом. Такие вещи, как интернирование строк, ограничения GIL, хеширование ключей словаря на основе эквивалентности, использование оператора is и этот список можно продолжить! Вы можете ознакомиться со всем списком, посетив этот репозиторий GitHub, который является основным источником всего, что обсуждается в этой статье.

Я надеюсь, что вам понравилась эта статья, и, если да, не забудьте показать свою поддержку. В случае каких-либо сомнений, запросов или потенциальных возможностей вы можете связаться со мной через LinkedIn, Twitter или GitHub.

Популярные статьи -

  • Клуб 100 000 просмотров


  • Клуб 50K просмотров




Ссылки -

  1. Https://github.com/satwikkansal/wtfpython
  2. Https://www.python.org/dev/peps/pep-0572/