You can use any object as a dictionary key in Python as long as it implements the
You also should avoid using mutable objects as keys, because once the object becomes not equal to the old self, it can't be found in a dictionary anymore.
There is also one bizarre thing that might surprise you during debugging or unit testing:
In CPython
__hash__
method. This method can return any integer as long as the only requirement is met: equal objects should have equal hashes (not vice versa).You also should avoid using mutable objects as keys, because once the object becomes not equal to the old self, it can't be found in a dictionary anymore.
There is also one bizarre thing that might surprise you during debugging or unit testing:
In : class A:
...: def __init__(self, x):
...: self.x = x
...:
...: def __hash__(self):
...: return self.x
...:
In : hash(A(2))
Out: 2
In : hash(A(1))
Out: 1
In : hash(A(0))
Out: 0
In : hash(A(-1)) # sic!
Out: -2
In : hash(A(-2))
Out: -2
In CPython
-1
is internally reserved for error states, so it's implicitly converted to -2
.👍2🔥2
Forwarded from Python академия
Изучаем две мощные функции map и filter, а также затрагиваем тему анонимных lambda-функций
Эти две функции - очень мощные инструменты в Python, которые входят в тему функционального программирования. Зачастую вместе с ними используют анонимные lambda-функции.
Подробнее
Подписывайтесь на канал 👉@pythonofff
Эти две функции - очень мощные инструменты в Python, которые входят в тему функционального программирования. Зачастую вместе с ними используют анонимные lambda-функции.
Подробнее
Подписывайтесь на канал 👉@pythonofff
👍4
VR и AR есть не только за рубежом, но и в России!
Что нового происходит в сфере VR/AR в нашей стране? Как эти технологии помогают бизнесу, промышленности и образованию? Какие кейсы реализовываются и какие крупные компании уже используют виртуальную и дополненную реальность?
Первый и единственный VR/AR-дайджест новостей российского рынка — «Вестник VR»
Что нового происходит в сфере VR/AR в нашей стране? Как эти технологии помогают бизнесу, промышленности и образованию? Какие кейсы реализовываются и какие крупные компании уже используют виртуальную и дополненную реальность?
Первый и единственный VR/AR-дайджест новостей российского рынка — «Вестник VR»
👍6
Как работать с числами с плавающей точкой в Python
Числа с плавающей точкой — быстрый и эффективный способ хранения чисел и работы с ними. Но он связан с рядом трудностей для начинающих и опытных программистов! Вот классический пример:
>>> 0.1 + 0.2 == 0.3
False
Впервые увидев такое, можно растеряться. Такое поведение корректно! Поговорим о том, почему ошибки при операциях над числами с плавающей точкой так распространены, почему они возникают и как с ними справиться в Python.
Числа с плавающей точкой — быстрый и эффективный способ хранения чисел и работы с ними. Но он связан с рядом трудностей для начинающих и опытных программистов! Вот классический пример:
>>> 0.1 + 0.2 == 0.3
False
Впервые увидев такое, можно растеряться. Такое поведение корректно! Поговорим о том, почему ошибки при операциях над числами с плавающей точкой так распространены, почему они возникают и как с ними справиться в Python.
👍5
PEP 424 allows generators and other iterable objects that don't have the exact predefined size to expose a length hint. For example, the following generator will likely return ~50 elements:
If you write an iterable and want to add the hint, define the
If you use an iterable and want to know its expected length, use
(x for x in range(100) if random() > 0.5)
If you write an iterable and want to add the hint, define the
__length_hint__
method. If the length is known for sure, use __len__
instead.If you use an iterable and want to know its expected length, use
operator.length_hint
.👍5
Forwarded from Python академия
Асинхронное программирование
Обычно мы пишем синхронный код - выполняется по порядку один за другим. Но иногда требуется, чтобы выполнялось несколько задач одновременно. К примеру, пока копируются файлы можно было поиграть в игру. Это возможно благодаря нескольким ядрам и потокам. ВАЖНО! Асинхронность не обязательно делает код быстрее, но может повысить его эффективность. В момент простаивания процессор будет переключаться на другие задачи.
На картинке программа, где повар готовит сразу несколько блюд. По другому бы нам пришлось по-очереди готовить каждое блюдо, но мы можем вернуться к другим, если поставили блюдо на огонь.
Подписывайтесь на канал 👉@pythonofff
Обычно мы пишем синхронный код - выполняется по порядку один за другим. Но иногда требуется, чтобы выполнялось несколько задач одновременно. К примеру, пока копируются файлы можно было поиграть в игру. Это возможно благодаря нескольким ядрам и потокам. ВАЖНО! Асинхронность не обязательно делает код быстрее, но может повысить его эффективность. В момент простаивания процессор будет переключаться на другие задачи.
На картинке программа, где повар готовит сразу несколько блюд. По другому бы нам пришлось по-очереди готовить каждое блюдо, но мы можем вернуться к другим, если поставили блюдо на огонь.
Подписывайтесь на канал 👉@pythonofff
👍7
Учимся читать код, изучая стандартную библиотеку Python
Итак, вы уже продвинутый новичок — вы изучили основы Python и способны решать реальные задачи.
Вы уже отходите от просмотра туториалов и чтения блогов; наверно, уже ощущаете, что в них излагаются одномерные решения простых придуманных задач; вероятно, вместо решения этой конкретной задачи вы хотите совершенствоваться в решении задач в целом.
Подробнее
Статья на Eng
Итак, вы уже продвинутый новичок — вы изучили основы Python и способны решать реальные задачи.
Вы уже отходите от просмотра туториалов и чтения блогов; наверно, уже ощущаете, что в них излагаются одномерные решения простых придуманных задач; вероятно, вместо решения этой конкретной задачи вы хотите совершенствоваться в решении задач в целом.
Подробнее
Статья на Eng
👍5🔥1
Создание интерактивного графика с помощью matplotlib и ipywidgets
https://swdevnotes.com/python/2021/interactive-charts-with-ipywidgets-matplotlib/
https://swdevnotes.com/python/2021/interactive-charts-with-ipywidgets-matplotlib/
Что такое *args и **kwargs в Python?
Функции — это жизнь. Правда? Если вы только начали осваивать Python, неважно — первый ли это ваш язык программирования, или вы пришли в Python из другого языка, то вы уже знаете о том, что количество параметров в объявлении функции соответствует количеству аргументов, которые передают функции при вызове.
Подробнее
Функции — это жизнь. Правда? Если вы только начали осваивать Python, неважно — первый ли это ваш язык программирования, или вы пришли в Python из другого языка, то вы уже знаете о том, что количество параметров в объявлении функции соответствует количеству аргументов, которые передают функции при вызове.
Подробнее
👍11👎2
Forwarded from Python академия
infinity
Самая типичная проблема при написании некоторых сортировок — назначение самой большой переменной. Часто она решается простым вводом большого числа или возведением в степень. Это, конечно, не стареющая классика, но метод максимально не надежный, а главное есть более удачные способы
Не работает с int, требуется использовать именно float.
Подписывайтесь на канал 👉@pythonofff
Самая типичная проблема при написании некоторых сортировок — назначение самой большой переменной. Часто она решается простым вводом большого числа или возведением в степень. Это, конечно, не стареющая классика, но метод максимально не надежный, а главное есть более удачные способы
float('infinity')
или float('inf')
для получения максимально возможного числаfloat('-infinity')
или float('-inf')
для получения минимально возможного числа.Не работает с int, требуется использовать именно float.
Подписывайтесь на канал 👉@pythonofff
👍9🔥1
Unit-tests you write may require some temporary files or directories. The
Since temporary stuff usually should be removed after use,
tempfile
module can help you to achieve that.Since temporary stuff usually should be removed after use,
tempfile
provides context manager as well as plain functions:with tempfile.TemporaryDirectory() as dir_path:
open(os.path.join(dir_path, 'a'), 'w').close()
open(os.path.join(dir_path, 'b'), 'w').close()
open(os.path.join(dir_path, 'c'), 'w').close()
assert files_of(dir_path) == ['a', 'b', 'c']
👍5
👍2
Native Python float values use your computer hardware directly, so any value is represented internally as a binary fraction.
That means that you usually work with approximations, not exact values:
The
That's still can be not enough:
For perfect computations, you can use
The obvious limitation is you still have to use approximations to irrational numbers (such as π).
That means that you usually work with approximations, not exact values:
In : format(0.1, '.17f')
Out: '0.10000000000000001'
The
decimal
module lets you use decimal floating point arithmetic with arbitrary precision:In : Decimal(1) / Decimal(3)
Out: Decimal('0.3333333333333333333333333333')
That's still can be not enough:
In [61]: Decimal(1) / Decimal(3) * Decimal(3) == Decimal(1)
Out[61]: False
For perfect computations, you can use
fractions
, that stores any number as a rational one:In : Fraction(1) / Fraction(3) * Fraction(3) == Fraction(1)
Out: True
The obvious limitation is you still have to use approximations to irrational numbers (such as π).
👍3
Изучаем словари в Python
Словари в Python — это фундаментальный тип данных , представленный в виде пары ключ-значение. Они описываются как объект сопоставления, который сопоставляет хэшируемые значения с произвольными объектами.
Ключи словаря должны быть неизменными, то есть они не могут изменяться. При добавлении в словарь пары ключ-значение он запоминает, в каком порядке они были добавлены. Подробнее.
Словари в Python — это фундаментальный тип данных , представленный в виде пары ключ-значение. Они описываются как объект сопоставления, который сопоставляет хэшируемые значения с произвольными объектами.
Ключи словаря должны быть неизменными, то есть они не могут изменяться. При добавлении в словарь пары ключ-значение он запоминает, в каком порядке они были добавлены. Подробнее.
👍8
Подборка каналов для IT специалистов 🎯
Вакансии 📌
https://t.me/progjob Вакансии для программистов
Системное администрирование 📌
https://t.me/i_DevOps Все для DevOps
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
Разработка игр 📌
https://t.me/game_devv GameDev: разработка игр
Программирование, Биг дата, книги 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/coddy_academy Академия кода
Шутки программистов 📌
https://t.me/itumor ITumor | программисты шутят
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
Вакансии 📌
https://t.me/progjob Вакансии для программистов
Системное администрирование 📌
https://t.me/i_DevOps Все для DevOps
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
Разработка игр 📌
https://t.me/game_devv GameDev: разработка игр
Программирование, Биг дата, книги 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/coddy_academy Академия кода
Шутки программистов 📌
https://t.me/itumor ITumor | программисты шутят
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
👍2
If you want to pass some information down the call chain, you usually use the most straightforward way possible: you pass it as functions arguments.
However, in some cases, it may be highly inconvenient to modify all functions in the chain to propagate some new piece of data. Instead, you may want to set up some kind of context to be used by all functions down the chain. How can this context be technically done?
The simplest solution is a global variable. In Python, use also may use modules and classes as context holders since they, strictly speaking, are global variables too. You probably do it on a daily basis for things like loggers.
If your application is multi-threaded, a bare global variable won't work for you since they are not thread-safe. You may have more than one call chain running at the same time, and each of them needs its own context. The
Still, both of that approaches are concurrency-unsafe meaning they won't work for coroutine call-chain where functions are not only called but can be awaited too. Once a coroutine does
You can fix that by having the loop set and restore the context every time it resumes some coroutine. The
However, in some cases, it may be highly inconvenient to modify all functions in the chain to propagate some new piece of data. Instead, you may want to set up some kind of context to be used by all functions down the chain. How can this context be technically done?
The simplest solution is a global variable. In Python, use also may use modules and classes as context holders since they, strictly speaking, are global variables too. You probably do it on a daily basis for things like loggers.
If your application is multi-threaded, a bare global variable won't work for you since they are not thread-safe. You may have more than one call chain running at the same time, and each of them needs its own context. The
threading
module gets you covered, it provides the threading.local()
object that is thread-safe. Store there any data by simply accessing attributes: threading.local().symbol = '@'
.Still, both of that approaches are concurrency-unsafe meaning they won't work for coroutine call-chain where functions are not only called but can be awaited too. Once a coroutine does
await
, an event loop may run a completely different coroutine from a completely different chain. That won't work:import asyncio
import sys
global_symbol = '.'
async def indication(timeout):
while True:
print(global_symbol, end='')
sys.stdout.flush()
await asyncio.sleep(timeout)
async def sleep(t, indication_t, symbol='.'):
loop = asyncio.get_event_loop()
global global_symbol
global_symbol = symbol
loop.create_task(indication(indication_t))
await asyncio.sleep(t)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(
sleep(1, 0.1, '0'),
sleep(1, 0.1, 'a'),
sleep(1, 0.1, 'b'),
sleep(1, 0.1, 'c'),
))
You can fix that by having the loop set and restore the context every time it resumes some coroutine. The
aiotask_context
module does exactly this by changing the way how tasks are created with loop.set_task_factory
. This works:import asyncio
import sys
import aiotask_context as context
async def indication(timeout):
while True:
print(context.get('symbol'), end='')
sys.stdout.flush()
await asyncio.sleep(timeout)
async def sleep(t, indication_t, symbol='.'):
loop = asyncio.get_event_loop()
context.set(key='symbol', value=symbol)
loop.create_task(indication(indication_t))
await asyncio.sleep(t)
loop = asyncio.get_event_loop()
loop.set_task_factory(context.task_factory)
loop.run_until_complete(asyncio.gather(
sleep(1, 0.1, '0'),
sleep(1, 0.1, 'a'),
sleep(1, 0.1, 'b'),
sleep(1, 0.1, 'c'),
))
👍6
Forwarded from Python академия
Важные методы в Python, которые должен знать каждый python разработчик.
Подписывайтесь на канал 👉@pythonofff
abs()
- возвращает модуль переданного параметра.all()
- функция возвращает значение True, если все элементы в итерируемом объекте - истинны. В противном случае, она возвращает значение False.any()
- функция возвращает True, если какой-либо (любой) элемент в итерируемом объекте является истинным True. В противном случае, any() возвращает значение False.ascii()
- возвращает строку, содержащую печатное представление объекта, и экранирует символы, отличные от ASCII, в строке с помощью экранирования \ x, \ u или \ U.bin()
- функция преобразует целое число в двоичную строку с префиксом 0b. Подписывайтесь на канал 👉@pythonofff
👍5
Media is too big
VIEW IN TELEGRAM
Intro to FastAPI - The Best Way to Create APIs in Python?
Get the code: https://prettyprinted.com/l/xW8
Get the code: https://prettyprinted.com/l/xW8
👍5