ru
Feedback
Библиотека Python разработчика | Книги по питону

Библиотека Python разработчика | Книги по питону

Открыть в Telegram

Погружение в CPython и архитектуру. Разбираем неочевидное поведение (GIL, Memory), Best Practices (SOLID, DDD) и тонкости Django/FastAPI. Решаем задачи с подвохом и оптимизируем алгоритмы. 🐍 По всем вопросам @evgenycarter РКН clck.ru/3Ko7Hq

Больше

📈 Аналитический обзор Telegram-канала Библиотека Python разработчика | Книги по питону

Канал Библиотека Python разработчика | Книги по питону (@bookpython) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 18 270 подписчиков, занимая 7 296 место в категории Технологии и приложения и 36 842 место в регионе Россия.

📊 Показатели аудитории и динамика

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

Согласно последним данным от 23 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -99, а за последние 24 часа — -5, при этом общий охват остаётся высоким.

  • Статус верификации: Не верифицирован
  • Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 5.72%. В первые 24 часа после публикации контент обычно набирает 2.88% реакций от общего числа подписчиков.
  • Охват публикаций: В среднем каждый пост получает 1 045 просмотров. В течение первых суток публикация набирает 527 просмотров.
  • Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 4.
  • Тематические интересы: Контент сосредоточен на ключевых темах, таких как numbers, yield, модуль, none, декоратор.

📝 Описание и контентная политика

Автор описывает ресурс как площадку для выражения субъективного мнения:
Погружение в CPython и архитектуру. Разбираем неочевидное поведение (GIL, Memory), Best Practices (SOLID, DDD) и тонкости Django/FastAPI. Решаем задачи с подвохом и оптимизируем алгоритмы. 🐍 По всем вопросам @evgenycarter РКН clck.ru/3Ko7Hq

Благодаря высокой частоте обновлений (последние данные получены 24 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.

18 270
Подписчики
-524 часа
-247 дней
-9930 день

Загрузка данных...

Привлечение подписчиков
июнь '26
июнь '26
+18
в 0 каналах
май '26
+40
в 0 каналах
Get PRO
апрель '26
+26
в 0 каналах
Get PRO
март '26
+31
в 0 каналах
Get PRO
февраль '26
+62
в 0 каналах
Get PRO
январь '26
+69
в 0 каналах
Get PRO
декабрь '25
+67
в 0 каналах
Get PRO
ноябрь '25
+97
в 31 каналах
Get PRO
октябрь '25
+64
в 1 каналах
Get PRO
сентябрь '25
+90
в 36 каналах
Get PRO
август '25
+60
в 0 каналах
Get PRO
июль '25
+89
в 27 каналах
Get PRO
июнь '25
+116
в 19 каналах
Get PRO
май '25
+119
в 44 каналах
Get PRO
апрель '25
+164
в 37 каналах
Get PRO
март '25
+147
в 38 каналах
Get PRO
февраль '25
+178
в 31 каналах
Get PRO
январь '25
+176
в 33 каналах
Get PRO
декабрь '24
+158
в 34 каналах
Get PRO
ноябрь '24
+112
в 33 каналах
Get PRO
октябрь '24
+139
в 29 каналах
Get PRO
сентябрь '24
+190
в 29 каналах
Get PRO
август '24
+68
в 17 каналах
Get PRO
июль '24
+56
в 0 каналах
Get PRO
июнь '24
+95
в 23 каналах
Get PRO
май '24
+223
в 18 каналах
Get PRO
апрель '24
+174
в 0 каналах
Get PRO
март '24
+240
в 20 каналах
Get PRO
февраль '24
+224
в 18 каналах
Get PRO
январь '24
+287
в 23 каналах
Get PRO
декабрь '23
+253
в 24 каналах
Get PRO
ноябрь '23
+282
в 16 каналах
Get PRO
октябрь '23
+319
в 18 каналах
Get PRO
сентябрь '23
+342
в 0 каналах
Get PRO
август '23
+264
в 0 каналах
Get PRO
июль '23
+292
в 0 каналах
Get PRO
июнь '23
+211
в 0 каналах
Get PRO
май '23
+284
в 0 каналах
Get PRO
апрель '23
+240
в 0 каналах
Get PRO
март '23
+419
в 0 каналах
Get PRO
февраль '23
+147
в 0 каналах
Get PRO
январь '23
+247
в 0 каналах
Get PRO
декабрь '22
+191
в 0 каналах
Get PRO
ноябрь '22
+174
в 0 каналах
Get PRO
октябрь '22
+283
в 0 каналах
Get PRO
сентябрь '22
+268
в 0 каналах
Get PRO
август '22
+287
в 0 каналах
Get PRO
июль '22
+322
в 0 каналах
Get PRO
июнь '22
+233
в 0 каналах
Get PRO
май '22
+258
в 0 каналах
Get PRO
апрель '22
+252
в 0 каналах
Get PRO
март '22
+380
в 0 каналах
Get PRO
февраль '22
+207
в 0 каналах
Get PRO
январь '22
+315
в 0 каналах
Get PRO
декабрь '21
+211
в 0 каналах
Get PRO
ноябрь '21
+269
в 0 каналах
Get PRO
октябрь '21
+326
в 0 каналах
Get PRO
сентябрь '21
+286
в 0 каналах
Get PRO
август '21
+486
в 0 каналах
Get PRO
июль '21
+420
в 0 каналах
Get PRO
июнь '21
+368
в 0 каналах
Get PRO
май '21
+350
в 0 каналах
Get PRO
апрель '21
+387
в 0 каналах
Get PRO
март '21
+568
в 0 каналах
Get PRO
февраль '21
+572
в 0 каналах
Get PRO
январь '21
+777
в 0 каналах
Get PRO
декабрь '20
+18 545
в 0 каналах
Дата
Привлечение подписчиков
Упоминания
Каналы
24 июня0
23 июня+1
22 июня+1
21 июня0
20 июня+1
19 июня0
18 июня+1
17 июня0
16 июня+2
15 июня0
14 июня+1
13 июня0
12 июня+1
11 июня+1
10 июня0
09 июня+1
08 июня+1
07 июня+3
06 июня+1
05 июня+2
04 июня+1
03 июня0
02 июня0
01 июня0
Посты канала
Генератор можно остановить. Ты можешь явно вызвать g.close(), но обычно это делает сборщик мусора. Когда вызывается close, в точке, где выполнение генератора было приостановлено, выбрасывается исключение GeneratorExit:

def gen():
    try:
        yield 1
        yield 2
    finally:
        print('END')


g = gen()
print(next(g))  # выведет '1'
g.close()       # выведет 'END'
Обрати внимание на три момента: 1. Нельзя использовать yield при обработке GeneratorExit Если в блоке finally попытаться сделать yield, возникнет ошибка RuntimeError:

def gen():
    try:
        yield 1
    finally:
        yield 3  # ошибка!


g = gen()
next(g)
g.close()  # RuntimeError
2. Исключение не выбрасывается, если генератор ещё не запускался В этом случае генератор просто переходит в состояние остановлен, но finally не выполняется:

def gen():
    try:
        yield 1
    finally:
        print('END')


g = gen()
g.close()         # ничего не выводит
print(list(g))    # выведет '[]'
3. close() ничего не делает, если генератор уже завершён Если генератор полностью отработал, close() не вызывает finally повторно и просто игнорируется:

def gen():
    try:
        yield 1
        yield 2
    finally:
        print('END')


g = gen()
print(list(g))     # ['1', '2']
print('Closing now')
g.close()

# Вывод:
# END
# [1, 2]
# Closing now
📲 Мы в MAX 👉@BookPython

2
Стандартный модуль json имеет интерфейс командной строки, который может быть полезен для форматирования JSON с помощью одного только Python. Этот модуль называется json.tool и используется следующим образом: $ echo '{"a": [], "b": "c"}' | python -m json.tool { "a": [], "b": "c" } 📲 Мы в MAX 👉@BookPython
655
3
Все объекты в Python создаются с помощью вызова метода __new__. Даже если вы определяете свой собственный __new__ для класса, вы должны вызвать super().__new__(...). Можно подумать, что object.__new__ — это базовая реализация, отвечающая за создание всех объектов. Но это не совсем так. Существует несколько таких реализаций, и они несовместимы. Например, у dict есть собственная низкоуровневая реализация __new__, и объекты типов, унаследованных от dict, нельзя создать с помощью object.__new__: In : class D(dict): ...: pass ...: In : class A: ...: pass ...: In : object.__new__(A) Out: <__main__.A at 0x7f200c8902e8> In : object.__new__(D) ... TypeError: object.__new__(D) is not safe, use D.__new__() 📲 Мы в MAX 👉@BookPython
761
4
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
643
5
Python позволяет перегружать многие разные операторы, и оператор сдвига — один из них. Вот пример того, как можно создать композицию функций с использованием этого оператора. Здесь символы, похожие на стрелки, показывают направление потока данных: from collections import deque from math import sqrt class Compose: def __init__(self): self._functions = deque() def __call__(self, *args, **kwargs): result = None for f in self._functions: result = f(*args, **kwargs) args = [result] kwargs = dict() return result def __rshift__(self, f): self._functions.append(f) return self def __lshift__(self, f): self._functions.appendleft(f) return self compose = Compose sqrt_abs = (compose() << sqrt << abs) sqrt_abs2 = (compose() >> abs >> sqrt) print(sqrt_abs(-4)) # 2.0 print(sqrt_abs2(-4)) # 2.0 Объяснение: << — добавляет функцию в начало цепочки (выполняется первой). >> — добавляет функцию в конец цепочки (выполняется последней). В примере sqrt_abs(-4) сначала берёт abs(-4) → 4, а затем sqrt(4) → 2.0. sqrt_abs2(-4) делает то же самое, но функции добавлены в другом порядке. 📲 Мы в MAX 👉@BookPython
871
6
Класс объекта доступен через атрибут __class__: >>> [1, 2].__class__ <class 'list'> Однако более привычный способ получить класс — использовать функцию type. Кроме того, это единственный способ, который работает со старыми стилями классов. >>> type([1, 2]) <class 'list'> Если вы хотите проверить, является ли объект экземпляром заданного класса, следует использовать isinstance, а не сравнение: >>> class A: ... pass ... >>> class B(A): ... pass ... >>> type(B()) <class '__main__.B'> >>> isinstance(B(), A) True 📲 Мы в MAX 👉@BookPython
928
7
В Python числа с плавающей точкой могут иметь значение NaN. Его можно получить с помощью math.nan. NaN не равен ничему, включая самого себя: >>> math.nan == math.nan False Кроме того, объект NaN не является уникальным — можно получить несколько разных объектов NaN из разных источников: >>> float('nan') nan >>> float('nan') is float('nan') False Это означает, что обычно нельзя использовать NaN в качестве ключа словаря: >>> d = {} >>> d[float('nan')] = 1 >>> d[float('nan')] = 2 >>> d {nan: 1, nan: 2} 📲 Мы в MAX 👉@BookPython
936
8
В Python None равен None, поэтому может показаться, что проверку на None можно делать через ==: ES_TAILS = ('s', 'x', 'z', 'ch', 'sh') def make_plural(word, exceptions=None): if exceptions == None: # ← ← ← exceptions = {} if word in exceptions: return exceptions[word] elif any(word.endswith(t) for t in ES_TAILS): return word + 'es' elif word.endswith('y'): return word[0:-1] + 'ies' else: return word + 's' exceptions = dict( mouse='mice', ) print(make_plural('python')) print(make_plural('bash')) print(make_plural('ruby')) print(make_plural('mouse', exceptions=exceptions)) Однако так делать неправильно. Действительно, None равен None, но не только он может быть равен None. Пользовательские объекты тоже могут вернуть True при сравнении с None через ==: class A: def __eq__(self, other): return True print(A() == None) # True print(A() is None) # False Правильный способ проверки на None — использовать is None. 📲 Мы в MAX 👉@BookPython
1 066
9
В Python разные структуры данных объединяются разными способами. Списки используют оператор +: >>> [1, 2] + [2, 3] [1, 2, 2, 3] Кортежи и строки также используют +: >>> (1, 2) + (2, 3) (1, 2, 2, 3) >>> "12" + "23" '1223' Deque (двусторонняя очередь) тоже поддерживает +: >>> deque([1, 2]) + deque([2, 3]) deque([1, 2, 2, 3]) Множества объединяются с помощью оператора |: >>> {1, 2} | {2, 3} {1, 2, 3} Словари объединяются по-другому, и порядок важен, если ключи пересекаются: >>> {**dict(a=1, b=2), **dict(b=3, c=4)} {'a': 1, 'b': 3, 'c': 4} >>> {**dict(b=3, c=4), **dict(a=1, b=2)} {'b': 2, 'c': 4, 'a': 1} Counter (счётчик) можно сложить с помощью +, при этом значения суммируются: >>> Counter(dict(a=1, b=2)) + Counter(dict(b=3, c=4)) Counter({'b': 5, 'c': 4, 'a': 1}) 📲 Мы в MAX 👉@BookPython
1 138
10
Словари, которые используются для хранения атрибутов объектов, не такие же, как те, что вы создаёте с помощью dict, хотя выглядят они абсолютно одинаково: >>> from sys import getsizeof >>> class A: ... pass ... >>> a = dict() >>> b = A().__dict__ >>> type(a) <class 'dict'> >>> type(b) <class 'dict'> >>> a {} >>> b {} >>> getsizeof(a) 240 >>> getsizeof(b) 112 Чтобы уменьшить потребление памяти, словари для __dict__ реализованы иначе. Они разделяют ключи между всеми экземплярами класса A. Однако важно понимать, что b на самом деле не меньше, чем a, - это просто особенность работы getsizeof. 📲 Мы в MAX 👉@BookPython
1 085
11
Если вы хотите измерить время между двумя событиями, следует использовать time.monotonic() вместо time.time(). time.monotonic() никогда не идёт назад, даже если системные часы были изменены: from contextlib import contextmanager import time @contextmanager def timeit(): start = time.monotonic() yield print(time.monotonic() - start) def main(): with timeit(): time.sleep(2) main() 📲 Мы в MAX 👉@BookPython
1 113
12
Декоратор создаёт новый объект (обычно функцию), используя в качестве аргумента другую единственную функцию. Однако иногда хочется задать больше, чем одну функцию. Сделать это напрямую невозможно из-за ограничений синтаксиса Python, но можно использовать небольшой трюк. Возвращаемая функция может содержать ещё один декоратор, который можно повторно применить к дополнительным функциям, добавляя новое поведение. Примерно так работает @property: @property def x(self): return self._x @x.setter def x(self, value): self._x = value Ниже приведён пример того, как можно определить функцию, которая использует дополнительные функции для особых случаев: from functools import wraps def make_case_decorator(func): def case_decorator(*case_decorator_args): def decorator(special_case_func): @wraps(func) def decorated(*args): if case_decorator_args == args: return special_case_func(*args) return func(*args) decorated.case = make_case_decorator(decorated) return decorated return decorator return case_decorator def special_cases(func): @wraps(func) def decorated(*args): return func(*args) decorated.case = make_case_decorator(decorated) return decorated @special_cases def fact(x): return x * fact(x - 1) @fact.case(0) def fact(x): return 1 @fact.case(10) def fact(x): print(f'(сработала оптимизация для {x})') return 3628800 📲 Мы в MAX 👉@BookPython
1 013
13
Ты не можешь изменять переменные замыкания простым присваиванием. Python рассматривает присваивание как определение локальной переменной внутри тела функции и вообще не делает замыкания. Работает нормально, печатает 2: def make_closure(x): def closure(): print(x) return closure make_closure(2)() Вызывает UnboundLocalError: local variable 'x' referenced before assignment: def make_closure(x): def closure(): print(x) x *= 2 print(x) return closure make_closure(2)() Чтобы это заработало, нужно использовать nonlocal. Оно явно сообщает интерпретатору, что присваивание не создает новую локальную переменную, а работает с переменной из замыкания: def make_closure(x): def closure(): nonlocal x print(x) x *= 2 print(x) return closure make_closure(2)() 📲 Мы в MAX 👉@BookPython
941
14
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
822
15
Любая выполняющаяся корутина asyncio может быть отменена с помощью метода cancel(). В корутину будет выброшено исключение CancelledError, что приведёт к её завершению, а также завершению всех оборачивающих её корутин, если только ошибка не будет перехвачена и подавлена. CancelledError является подклассом Exception, а значит, его можно случайно перехватить конструкцией try ... except Exception, которая предназначена для отлова «любых ошибок». Чтобы безопасно это обработать внутри корутины, приходится писать примерно так: try: await action() except asyncio.CancelledError: raise except Exception: logging.exception('action failed') 📲 Мы в MAX 👉@BookPython
1 090
16
Условное использование менеджеров контекста обычно доставляет неудобства: нельзя просто разместить with внутри блока if, не заключив туда весь блок with. Это часто приводит к дублированию кода: def print_whole_file( *, path: Optional[str] = None, file_obj: Optional[TextIO] = None ): assert path or file_obj if path: with open(path) as f: print(f.read(), end='') else: print(file_obj.read(), end='') Способ борьбы с этой проблемой — использовать ExitStack и вызывать enter_context внутри if: def print_whole_file( *, path: Optional[str] = None, file_obj: Optional[TextIO] = None ): assert path or file_obj with ExitStack() as stack: if path: file_obj = stack.enter_context( open(path) ) print(file_obj.read(), end='') Однако более очевидный способ достичь того же — использовать тривиальные менеджеры контекста, которые ничего не делают, когда они не нужны, вместо «настоящих». Начиная с Python 3.7, их можно получить с помощью contextlib.nullcontext: def print_whole_file( *, path: Optional[str] = None, file_obj: Optional[TextIO] = None ): assert path or file_obj if path: context = open(path) else: context = nullcontext(file_obj) with context as f: print(f.read(), end='') 📲 Мы в MAX 👉@BookPython
1 106
17
В Python функция range() определяет все целые числа в полуоткрытом интервале. То есть range(2, 10) математически означает [2, 10), или, говоря на языке Python: [2, 3, 4, 5, 6, 7, 8, 9]. Несмотря на асимметрию, это не ошибка и не случайность. В этом есть логика: такой подход позволяет "склеивать" два соседних интервала без риска ошибиться на единицу: [a, c) = [a, b) + [b, c) Для сравнения, если бы использовались закрытые интервалы, получалось бы так: [a, c] = [a, b] + [b+1, c] Эта же идея объясняет, почему индексация начинается с нуля: [0, N) содержит ровно N элементов. Эдсгер Дейкстра написал на эту тему отличную статью ещё в 1982 году. 📲 Мы в MAX 👉@BookPython
1 079
18
В списковых включениях (list comprehensions) может быть больше одного цикла for и условия if: In : [(x, y) for x in range(3) for y in range(3)] Out: [ (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2) ] In : [ (x, y) for x in range(3) for y in range(3) if x != 0 if y != 0 ] Out: [(1, 1), (1, 2), (2, 1), (2, 2)] Кроме того, любое выражение внутри for и if может использовать все переменные, которые были определены ранее: In : [ (x, y) for x in range(3) for y in range(x + 2) if x != y ] Out: [ (0, 1), (1, 0), (1, 2), (2, 0), (2, 1), (2, 3) ] Можно смешивать if и for в любом порядке: In : [ (x, y) for x in range(5) if x % 2 for y in range(x + 2) if x != y ] Out: [ (1, 0), (1, 2), (3, 0), (3, 1), (3, 2), (3, 4) ] 📲 Мы в MAX 👉@BookPython
1 059
19
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
843
20
Оператор in можно использовать с генераторами: x in g. Python будет итерироваться по g, пока не найдёт x или пока генератор не закончится. >>> def g(): ... print(1) ... yield 1 ... print(2) ... yield 2 ... print(3) ... yield 3 ... >>> 2 in g() 1 2 True Однако range() делает для вас больше. У него переопределён магический метод __contains__, который позволяет оператору in работать с O(1) сложностью: In [1]: %timeit 10**20 in range(10**30) 375 ns ± 10.7 ns per loop Имейте в виду, что это не работает для функции xrange() в Python 2. 📲 Мы в MAX 👉@BookPython
810