Фрагменты кода, которые поставят под сомнение ваши навыки 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]
- Здесь было выполнено тройное задание. В таких случаях сначала берутся крайний левый и крайний правый, а затем оставшееся присвоение. Следовательно, переменная some_list содержит значение [0,1].
- Теперь самое интересное: some_list [0] нужно присвоить [0,1]. Вы можете подумать, что он должен выдать ошибку, но поскольку переменная some_list была назначена, она не вызовет никаких ошибок.
- Но мы также знаем, что [0,1] изначально назначается как some_list.
- Это означает, что some_list [0] хочет ссылаться только на себя. Даже если самооценка присвоена, она снова будет относиться к себе.
- Это создает бесконечную привязку и называется круговой привязкой.
- 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 просмотров
Ссылки -