Поколение Python 🐍
50.3K subscribers
2K photos
16 videos
6 files
866 links
Серия курсов по языку Python от BEEGEEK 🐝.

Сайт: pygen.ru
Мерч: shop.pygen.ru
Чат: @pygen_ru_comments
Бот: @pygen_ru_bot
Поддержка: @pygen_ru_support

Перечень РКН: https://www.gosuslugi.ru/snet/673650d605391b3bfb5541c0
Download Telegram
Друзья, принесли вам отличную рекомендацию для просмотра на выходных! 😎

🖥 Совсем недавно вышла целая документалка про историю создания Python: от небольшого проекта из Амстердама до одного из ведущих языков программирования.

В фильме Гвидо ван Россум и другие значимые для истории Python люди рассказывают:

🤩 о развитии Python
🤩 о конфликтах, едва не разрушивших весь проект
🤩 о влиянии языка на... ну... всё

📺 Смотрим по ссылке на YouTube или по ссылке в ВК!

Ставьте реакцию:

🔥 — если знаете историю создания Python
👀 — если не интересовались этой темой

#поколениеpython #чтопосмотреть #python
Please open Telegram to view this post
VIEW IN TELEGRAM
👀113🔥3920❤10👍87🥰111
Друзья, недавно мы обсудили области видимости в Python. Сегодня поговорим об операторах global и nonlocal.

😕😫😢😒😏😫

Глобальные переменные по умолчанию доступны для чтения, но недоступны для изменения из локальной области видимости функций. При попытке изменить в теле функции значение глобальной переменной мы получим ошибку UnboundLocalError.

Оператор global позволяет изменять и создавать в теле функции глобальные переменные. Для этого нужно объявить в теле функции переменную после оператора global, а ниже присвоить ей необходимое значение или изменить текущее.

Созданная внутри функции с помощью оператора global переменная будет доступна как локально, так и глобально.

❗️ Переменные, перечисленные в инструкции global, не должны быть объявлены перед global и не должны быть аргументами функции, иначе возникнет ошибка SyntaxError.

🥺😢🥺😫😢🙂😏😫

Оператор nonlocal используется во вложенных функциях, когда необходимо из внутренней функции изменить переменную внешней функции. Для этого нужно внутри вложенной функции после оператора nonlocal объявить переменную из объемлющей области видимости, после чего можно будет изменить ее значение.

❗️Переменные, перечисленные в инструкции nonlocal, должны существовать в объемлющей области видимости, иначе возникает ошибка SyntaxError.

✏️ Используйте оператор global только в случае острой необходимости. Изменение значения глобальной переменной из функции может привести к большому количеству ошибок, так как глобальная переменная может использоваться в других частях программы.

⏰⏰⏰⏰⏰⏰⏰ Подробнее об операторах global и nonlocal расскажем в планируемом курсе для самураев. Подпишитесь на новости о курсе на нашем сайте, чтобы первым узнать о его выходе.

Ставьте реакцию:

🔥 — если уже подписались на новости о курсе для самураев
👀 — если пока проходите предыдущие курсы

#python #курсдлясамураев #полезныйматериал
Please open Telegram to view this post
VIEW IN TELEGRAM
👀49🔥238❤643👍2🤷‍♀1
Друзья, сегодня речь пойдет об операторе match-case. 😉

📌 Оператор match-case появился в Python 3.10 и используется для сопоставления структурных шаблонов.

✏️ Сопоставление структурных шаблонов — это мощный механизм, который позволяет выполнять определенный код в зависимости от соответствия определенному шаблону, что позволяет программам извлекать информацию из сложных типов данных, переходить к их структуре и выполнять определенные действия на основе различных форм данных.

⚡️ Оператор match-case состоит из одного оператора match и одного или нескольких операторов case.

🔘Аргументом оператора match является произвольное выражение Python
🔘Аргументом оператора case является шаблон, с которым сопоставляется аргумент оператора match

Самым простым примером шаблона является какое-либо произвольное значение. Например, мы можем проверить, соответствует ли переменная одному из нескольких значений.

Приведенный ниже код:
s = 'geek'

match s:
case 'bee':
print('Строка bee')
case 'geek':
print('Строка geek')


выводит:
Строка geek


В первую очередь Python вычисляет значение выражения, указанного в качестве аргумента оператора match, а затем сопоставляет это значение с каждым шаблоном. Если совпадение будет найдено, выполнится блок кода соответствующего оператора case.

Если нам необходимо выполнить какой-либо код по умолчанию в случае отсутствия совпадений со всеми шаблонами, мы можем использовать для этого оператор case с аргументом в виде шаблона _.

Приведенный ниже код:
s = 'pygen'

match s:
case 'bee':
print('Строка bee')
case 'geek':
print('Строка geek')
case _:
print('Строка, отличная от bee и geek')


выводит:
Строка, отличная от bee и geek


Шаблон _ используется для захвата значения аргумента оператора match и никогда не бывает ложным. Но его нельзя использовать в блоке кода оператора case. Если все же необходимо использовать захваченное значение, вместо _ можно использовать любое другое имя, которое является корректным для переменных Python.

Приведенный ниже код:
s = 'pygen'

match s:
case 'bee':
print('Строка bee')
case 'geek':
print('Строка geek')
case default:
print(default)


выводит:
pygen


☝️☝️☝️☝️ Шаблоны захвата всегда указываются в самом конце после всех остальных шаблонов и в единственном экземпляре, в противном случае будет возбуждено исключение SyntaxError.

Помимо строк оператор match-case также позволяет использовать в качестве шаблона объекты других базовых типов данных. Однако не с каждым из них происходит сравнение на равенство: константы True, False и None сравниваются на идентичность.

Ставьте реакцию:

🔥 — если использовали оператор match-case на практике
❤️ — если знаете об этом операторе, но не применяли его
👀 — если впервые узнали об операторе match-case

#matchcase #полезныйматериал #python
Please open Telegram to view this post
VIEW IN TELEGRAM
👀110❤82🔥48👍5432👏1
Друзья, отвечаем на вопрос с собеседований. 😎

⭐️ Синхронный код выполняется последовательно, один за другим, и блокирует выполнение других задач до его завершения. Это означает, что если у вас есть функция, которая занимает много времени на выполнение, и вы вызываете ее в основной программе, то выполнение программы заблокируется до завершения этой функции.

📌 Пример синхронного кода в Python — фрагмент с циклом for, обрабатывающим список элементов:

items = [1, 2, 3, 4, 5]
for item in items:
print(item)


Цикл for будет обрабатывать каждый элемент в списке items последовательно, один за другим, и не перейдет к следующему элементу, пока не завершится обработка текущего элемента.

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

⭐️ Асинхронный код — подход к написанию кода, который позволяет выполнять несколько задач одновременно в рамках одного процесса за счет использования асинхронных функций и корутин. В отличие от синхронного кода, асинхронный код может запустить несколько задач параллельно и организовать их выполнение с помощью итераций и вызовов коллбеков.

📌 Пример асинхронного кода — использование библиотеки asyncio для запуска нескольких задач одновременно и ожидания их завершения:

import asyncio

async def hello():
await asyncio.sleep(1)
print("Hello")

async def world():
await asyncio.sleep(2)
print("World")

async def main():
await asyncio.gather(hello(), world())

if __name__ == '__main__':
asyncio.run(main())


➡️ Мы определяем 3 асинхронные функции: hello(), world() и main(). Функции hello() и world() печатают соответствующие сообщения и ждут 1 и 2 секунды соответственно. Функция main() запускает эти две функции одновременно с помощью asyncio.gather() и ждет, пока они завершат свою работу. Затем мы запускаем функцию main() с помощью asyncio.run(). В результате мы получим сообщения "Hello" и "World", каждое через 1 и 2 секунды соответственно, при этом результаты двух задач были получены почти одновременно.

Ставьте реакцию:

🔥 — если знали ответ на этот вопрос
👀 — если было полезно почитать ответ

#собеседование #python
Please open Telegram to view this post
VIEW IN TELEGRAM
👀133🔥52❤14❤‍🔥1162🤝1🙊11
Друзья, сегодня поговорим про изменяемые и неизменяемые объекты в Python. 😎

✏️ Изменяемые (mutable) объекты — это объекты, которые можно изменять после создания. К ним относятся:

🟣 списки
🟣 множества
🟣 словари

Например, можно дополнить список новыми элементами или изменить старые:

numbers = [1, 2, 3]

# добавляем число 4 в конец списка
numbers.append(4)

# изменяем первый элемент списка на число 5
numbers[0] = 5

print(numbers) # [5, 2, 3, 4]


💎 Неизменяемые объекты (immutable) — это объекты, которые нельзя изменить после создания. К ним относятся:

🔵 числа
🔵 строки
🔵 кортежи
🔵 замороженные множества

Например, строку изменить нельзя — можно только создать новый объект:

text = 'pygen is the best.'

# создается новая строка
new_text = text.upper()

print(text) # pygen is the best!
print(new_text) # PYGEN IS THE BEST!


☝️ Важно понимать разницу между изменяемыми и неизменяемыми объектами при работе с кодом:

🟡изменяемые объекты при передаче в функцию могут быть изменены внутри нее
🟡ключами словаря или элементами множества могут быть только неизменяемые объекты
🟡изменяемые значения в качестве параметров по умолчанию в функциях могут приводить к неожиданным эффектам
🟡Python кэширует некоторые неизменяемые объекты (малые числа, строки), что экономит память и ускоряет работу программы
🟡поведение программы непредсказуемо, когда несколько переменных ссылаются на один и тот же изменяемый объект

Ставьте реакцию:

👍 — если умеете отличать изменяемые объекты от неизменяемых
🙉 — если до сих пор путаетесь

#python #полезныйматериал
Please open Telegram to view this post
VIEW IN TELEGRAM
👍130🙉35❤1977😁22👨‍💻1
Друзья, сегодня поговорим о символах и байтах в Python. 😉

‼️ В Python 3 строки представляют собой последовательности символов. Каждый символ можно разделить на три составляющие:

🌱графическое представление
🌱идентификатор
🌱байтовое представление

➡️ Графическое представление символа — это его внешний вид, то есть то, что обычно видит пользователь, например: B, e, g, k, 🐝.

➡️ Идентификатор символа — это его кодовая позиция. Она представлена числом от 0 до 1114111, которое в стандарте Unicode записывается шестнадцатеричными цифрами в количестве от 4 до 6 с префиксом U+. Например, идентификатором английской буквы B является U+0042, а смайлика 🐝 — U+1F41D.

Чтобы увидеть, какой символ представляет идентификатор, можно воспользоваться функцией chr(). Для этого мы можем передать в эту функцию не только десятичное, но и шестнадцатеричное число, которое в Python записывается с префиксом 0x.

Приведенный ниже код:
print(chr(128029))
print(chr(66))

print(chr(0x1f41d))
print(chr(0x0042))


выводит:
🐝
B
🐝
B


➡️ Байтовое представление — это последовательность байтов, из которых состоит символ. Эта последовательность определяется кодировкой — алгоритмом преобразования идентификаторов в последовательности байтов и наоборот. Например, в кодировке UTF-8 символ 🐝 представлен 4 байтами, а в кодировке UTF-16 — 5 байтами.

Каждый байт последовательности представляет собой число от 0 до 255, которое записывается двумя шестнадцатеричными цифрами с префиксом \x. Например, строка Beegeek 🐝 в байтовом представлении имеет следующий вид:
b'\x42\x65\x65\x67\x65\x65\x6b\x20\xf0\x9f\x90\x9d'

💚 В Python для работы с последовательностями байтов используются типы bytes и bytearray.

Ставьте реакцию:

🔥 — если знали, из чего состоят символы
👀 — если узнали об этом впервые

#поколениеpython #python #полезныйматериал #символы
Please open Telegram to view this post
VIEW IN TELEGRAM
👀81🔥72❤115👍332👏1
Друзья, сегодня расскажем про две полезные функции из модуля operator: itemgetter() и attrgetter(). 😎

📌 itemgetter() — используется, чтобы получить элемент из последовательности по индексу.

from operator import itemgetter

numbers = [1, 2, 3, 4, 5]

print(itemgetter(0)(numbers)) # 1
print(itemgetter(2)(numbers)) # 3


📌 attrgetter() — работает похоже, но достает атрибут объекта.

from datetime import date
from operator import attrgetter

d = date(2025, 11, 20)

print(attrgetter('day')(d)) # 20
print(attrgetter('month')(d)) # 11


⚠️ Эти функции особенно полезно использовать при сортировке данных:

from operator import itemgetter, attrgetter
from datetime import date

tuples = [(2, 3), (5, 1), (5, 8)]
dates = [date(2025, 11, 20), date(2025, 10, 7), date(2025, 12, 29)]

print(sorted(tuples, key=itemgetter(1)))
print(sorted(dates, key=attrgetter('month')))


➡️ Ту же задачу можно решить с помощью анонимных функций, но с itemgetter() и attrgetter() код получается чище, читабельнее и более pythonic.

Ставьте реакцию:

🔥 — если уже применяли функции itemgetter() и attrgetter()
❤️ — если знали о них, но не пользовались
👀 — если узнали о них впервые

#python
Please open Telegram to view this post
VIEW IN TELEGRAM
👀267❤4214🔥53👍2😈2❤‍🔥1✍1😇1
Друзья, сегодня поговорим об идентификаторе UUID и его использовании в Python.

📌 UUID — это универсальный уникальный идентификатор длиной 128 бит. Он выглядит как шестнадцатеричное число, разбитое на группы в формате 8-4-4-4-12, вот так:

77a87c71-9820-53d0-b133-5d319e9cdf76

UUID применяется в программировании, чтобы однозначно идентифицировать объекты, например, пользователей, заказы или записи в базе данных.

У каждого UUID есть:

🔵Вариант — определяет формат и интерпретацию всего UUID. Всего их 4, в подавляющем большинстве используется только вариант 1.

🔵Версия — определяет способ генерации UUID. Всего их восемь: с 1 по 8. Наиболее распространенной сегодня является версия 7.

🖥 Для генерации UUID в Python используется встроенный модуль uuid. Его функции состоят из префикса uuid и суффикса, соответствующего номеру версии, например:

🟡uuid1()
🟡uuid5()
🟡uuid7()

Ставьте реакцию:

🔥 — если знали все о версиях UUID
👀 — если узнали много нового

#python
Please open Telegram to view this post
VIEW IN TELEGRAM
👀258🔥3010✍33❤2⚡1
Друзья, сегодня поговорим про генерацию фейковых данных с помощью модуля Faker.🙃

📌 Модуль Faker используется для генерации фейковых данных, например, для тестирования приложений или создания демонстрационных сценариев.

Что может генерировать модуль Faker:

🟢 имена и фамилии
🟢 адреса и индексы
🟢 адреса электронной почты
🟢 номера телефонов
🟢 дату и время
🟢 текст: предложения и даже целые абзацы
🟢 данные о компаниях, банковских счетах
🟢 и многое другое

🔖 Модуль Faker не является встроенным. Для его установки используется команда pip install faker.

✔️ Пример использования модуля:

from faker import Faker

fake = Faker()

print(fake.name()) # случайное ФИО
print(fake.date()) # случайная дата
print(fake.address()) # случайный адрес
print(fake.email()) # случайный email


➡️ При создании экземпляра Faker можно указать необходимую локализацию, тогда данные будут генерироваться на нужном языке.

Ставьте реакцию:

🔥 — если уже сталкивались с модулем Faker
👀 — если узнали о нем впервые

#python
Please open Telegram to view this post
VIEW IN TELEGRAM
1👀404🔥68❤15👍664👾2❤‍🔥1
Друзья, сегодня обсуждаем ключевые слова в Python.

📌 Ключевые слова — это зарезервированные слова в языке программирования. Они используются в синтаксисе, поэтому Python не даст назвать ими ваши объекты.

Примеры:

🟣True — объект класса bool
🟣if — условный оператор

В Python есть модуль для работы с ключевыми словами — keyword. Он включает следующие инструменты:

1️⃣атрибут kwlist — список всех ключевых слов Python
2️⃣ функция iskeyword(s) — определяет, является ли переданная строка ключевым словом

⚡️ Начиная с Python 3.10 появились так называемые мягкие ключевые слова. Их можно использовать для имен переменных, но это не рекомендовано. Для них в модуль keyword добавили два новых инструмента:

3️⃣ атрибут softkwlist — содержит список всех мягких ключевых слов Python
4️⃣ функция issoftkeyword(s) — определяет, является ли переданная строка мягким ключевым словом

🍦 К мягким ключевым словам относятся:

🟣match
🟣case
🟣_
🟣type

Ставьте реакцию:

🔥 — если пытались назвать переменную ключевым словом
❤️ — если не проверяли, как это работает

#python #полезныйматериал
Please open Telegram to view this post
VIEW IN TELEGRAM
2❤186🔥92197👍5👾3⚡2
Друзья, сегодня рассказываем про модуль secrets в Python. 🤐

Многим известен модуль random, который генерирует псевдослучайные числа или выбирает случайный элемент коллекции.

📌 Модуль secrets делает то же самое, но используется для генерации криптографически стойких случайных чисел. Он подходит для создания паролей, токенов и других данных, связанных с безопасностью.

В модуле secrets есть готовые функции для генерации токенов:

🔵 token_bytes() — случайная байтовая строка
🔵 token_hex() — случайная строка в шестнадцатеричном формате
🔵 token_urlsafe() — случайная URL-безопасная строка

from secrets import token_bytes, token_hex, token_urlsafe

print(token_bytes())
print(token_hex())
print(token_urlsafe())


⚠️ По умолчанию создается токен длиной 32 байта — этого достаточно для защиты от брутфорс-атак. При необходимости это значение можно изменить, передав его в качестве аргумента этим функциям.

🔖 Другие функции модуля secrets:

🔵 choice() — выбор случайного элемента из коллекции
🔵 randbelow() — генерация случайного число от 1
до n - 1
🔵 secrets.randbits(k): число с k случайными битами

☝️☝️☝️☝️ Подробнее о модуле secrets расскажем в нашем планируемом курсе для самураев. Подписаться на новости о его выходе можно на нашем сайте по ссылке.

Ставьте реакцию:

🔥 — если уже слышали о модуле secrets
👀 — если узнали о нем впервые

#python
Please open Telegram to view this post
VIEW IN TELEGRAM
👀209🔥46❤21👍333✍1
Друзья, не так давно мы говорили об интроспекции и ее инструментах. Сегодня хотим рассказать еще об одном инструменте — модуле ast. 😎

📌 Модуль ast (Abstract Syntax Trees) — это встроенный модуль Python для анализа и изменения структуры исходного кода. Он позволяет превратить текст программы в дерево объектов, где каждый узел — это инструкция, функция или переменная.

Приведенный ниже код:
import ast

code = '''
def add(a=1, b=2):
return a + b'''

tree = ast.parse(code)
print(ast.dump(tree, indent=2))


выводит:
Module(
body=[
FunctionDef(
name='add',
args=arguments(
posonlyargs=[],
args=[
arg(arg='a'),
arg(arg='b')],
kwonlyargs=[],
kw_defaults=[],
defaults=[
Constant(value=1),
Constant(value=2)]),
body=[
Return(
value=BinOp(
left=Name(id='a', ctx=Load()),
op=Add(),
right=Name(id='b', ctx=Load())))],
decorator_list=[],
type_params=[])],
type_ignores=[])


В примере выше содержится полная информация о функции add(), которая записана в строке code, в виде дерева: название, параметры, значения по умолчанию, выполняемые операции и многое другое. При необходимости можно полностью обойти это дерево и выполнить необходимые действия с любой его частью.

⚠️ Основные возможности модуля ast:

🔘 парсинг кода: можно преобразовать строку с кодом в дерево AST
🔘 безопасное вычисление: можно превращать строки в объекты Python (списки, словари, числа), исключая выполнение вредоносного кода
🔘 обход дерева: классы ast.NodeVisitor и ast.NodeTransformer используются для поиска конкретных элементов в коде или их автоматической замены
🔘 анализ: с помощью модуля можно создавать линтеры (проверку стиля), инструменты для рефакторинга или генераторы документации

Модуль часто применяется в сложных проектах для статического анализа кода без его фактического запуска.

📎 Подробнее ознакомиться с модулем ast можно в официальной документации по ссылке.

Ставьте реакцию:

🔥 — если уже сталкивались с модулем ast
👀 — если узнали о нем впервые

#python
Please open Telegram to view this post
VIEW IN TELEGRAM
1👀157🔥15❤1042❤‍🔥1👍1
Друзья, сегодня поговорим о модуле os в Python. 😉

📌 Модуль os используется для взаимодействия с операционной системой. Его основные возможности:

🟣работа с файловой системой — создание, удаление, переименование каталогов и файлов
🟡навигация — получение текущего рабочего каталога и смена пути
🟣переменные окружения — чтение и изменение системных переменных
🟡управление процессами — запуск внешних программ и команд через терминал
🟣работа с путями — через подмодуль os.path можно объединять пути, проверять существование файлов и получать их размер

👀 Пример использования:

import os

# узнать текущий рабочий каталог
print(os.getcwd())

# создать новый каталог, если он отсутствует
if not os.path.exists('beegeek'):
os.mkdir('beegeek')

# получить список каталогов
print(os.listdir())


⚠️ Преимущество модуля os в том, что он не зависит от конкретной ОС. Все функции автоматически подстраиваются под нужную систему.

😉😉😉😚😉 Подробнее о модуле os рассказываем в курсе для самураев, который выходит в мае. Подпишитесь на новости о курсе на нашем сайте, чтобы первым узнать о старте предпродаж и выходе курса.

Ставьте реакцию:

🔥 — если уже пользовались модулем os
❤️ — если знали о нем, но еще не использовали
👀 — если впервые узнали об этом модуле

#курсдлясамураев #python
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥101❤56👀524👨‍💻2⚡1👻1
Друзья, привет! 👩‍❤️‍👨

😎 Мы — команда «Поколения Python», авторы курсов по программированию на платформе Stepik. В нашей линейке не только Python, но и курсы по алгоритмам и SQL.

В этом канале мы собираем сообщество людей, которые учатся программировать: мотивируем друг друга, делимся полезными материалами и объясняем сложные темы простым языком. Мы считаем, что учиться вместе продуктивнее и интереснее!

Рубрики канала:

🖥 #python #полезныйматериал — все про Python: особенности, фишки, библиотеки
🗓 #словонедели — объясняем термины простым языком
❓#ответнавопрос — автор курсов Тимур Гуев отвечает на вопросы наших студентов
🧠 #задача и #разборзадачи — тренируем логическое мышление
✅ #тесты — короткие вопросы на знание программирования с вариантами ответа
📈 #курспоалгоритмам — все об алгоритмах и структурах данных
🖥 #sql — все об SQL и базах данных
🌎 #япознаюмир — познавательные посты о технологиях и обучении
🎤#интервью — большие видео, где мы общаемся с начинающими и опытными разработчиками
🤯 #сложнонепонятно — рубрика, в которой разбираем самые сложные задачи из наших курсов
Please open Telegram to view this post
VIEW IN TELEGRAM
❤41👍11❤‍🔥1053✍2🔥2👀2🥰1🤩1🙉1
Друзья, сегодня расскажем об одном из интересных нововведений в Python 3.12. 😎

📌 В этой версии появилась иммортализация (бессмертие) объектов — часто используемых и неизменяемых (таких как None, True, False или небольшие целые числа).

🧮 Каждый объект в Python имеет счетчик ссылок. Когда ссылка появляется, счетчик увеличивается, когда исчезает — уменьшается. Если он достигает нуля, то объект удаляется.

😯 Но у бессмертных объектов все иначе: их счетчик ссылок фактически не изменяется. В CPython для них используется специальное значение счетчика ссылок — очень большое число, которое в обычной работе интерпретатора не достигается, а операции увеличения и уменьшения счетчика просто их игнорируют. Такие объекты не удаляются сборщиком мусора и существуют на протяжении всего времени жизни интерпретатора.

Постоянные изменения счетчика ссылок у часто используемых объектов создавали лишнюю нагрузку и усложняли совместное использование объектов. Появление бессмертных объектов — шаг в сторону снижения внутренних накладных расходов CPython и развитию механизмов многопоточной работы.

📕 Более подробно о бессмертных объектах можно почитать в PEP 683.

Ставьте реакцию:

🔥 — если знали о бессмертных объектах в Python
👀 — если узнали об этом впервые

#python
Please open Telegram to view this post
VIEW IN TELEGRAM
👀233🔥16❤94✍2🆒2❤‍🔥1
Друзья, сегодня разбираемся, как Python перебирает объекты в цикле for. 😵‍💫

❗️ В Python любой объект, который можно обойти с помощью цикла for, является итерируемым.

💡 Каждый раз, когда выполняется цикл for, Python сначала получает специальный объект — итератор. Для этого неявно вызывается встроенная функция iter(), в которую передается сам итерируемый объект.

🔮 Все дело в том, что у каждого итерируемого объекта есть магический метод __iter__(), который возвращает итератор. Именно этот метод вызывает функция iter().

📌 Итератор — это объект, который обеспечивает последовательный доступ к элементам коллекции. Он выдает элементы по одному и хранит текущее состояние обхода.

Дальше цикл for работает уже с итератором: на каждой итерации он запрашивает у него следующий элемент и получает их до тех пор, пока элементы не закончатся.

⚠️ При вызове функции iter() сначала проверяется, реализован ли у объекта метод __iter__(). Если да, вызывается именно он. Если же метод __iter__() отсутствует, но реализован метод __getitem__(), Python создает итератор, который извлекает элементы по индексам, начиная с 0.

Если ни один из этих методов не реализован, объект не считается итерируемым, и при попытке вызвать iter() будет возбуждено исключение TypeError: '<тип объекта>' object is not iterable.

➡️ Более подробно про итерируемые объекты и итераторы мы говорим в наших курсах для профессионалов и ООП. Напоминаем, что до конца июня курсы можно купить со скидкой 1500 рублей!

Ставьте реакцию:

🔥 — если знали, как работает цикл for
👀 — если узнали об этом впервые

#python #ооп #профи
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥100👀55❤‍🔥77❤6👍2🤷‍♂1✍1
Друзья, сегодня поговорим о Constant folding (свертке констант). 😎

📌 Constant folding — это оптимизация, при которой выражения из одних только констант вычисляются заранее, еще до запуска программы.

👀 В CPython свертка констант происходит на этапе компиляции байт-кода. Интерпретатор находит константные выражения и подменяет их уже готовым результатом, например:

def func():
return 60 * 60 * 24


Выражение 60 * 60 * 24 заменится на готовое значение 86400 еще до выполнения функции.

😞 Не во всех случаях оптимизация применяется даже для полностью константного выражения. Например, 2 ** 64 может быть свернуто, а вот 4 ** 64 — уже нет.

🔥 Оптимизация применяется не только к числам, но и к выражениям, содержащим строки и кортежи:

▫️ 'bee' * 3 → 'beebeebee'
▫️ (1, 2) * 3 → (1, 2, 1, 2, 1, 2)

📎 Строки длиннее 4096 символов и кортежи длиннее 256 элементов не сворачиваются.

Ставьте реакцию:

🔥 — если знали про constant folding
👀 — если узнали о ней впервые

#python #полезныйматериал
Please open Telegram to view this post
VIEW IN TELEGRAM
👀184🔥27❤6💯53🆒1
Друзья, в недавнем посте мы разобрали, как цикл for перебирает элементы итерируемого объекта с помощью итератора. А сегодня поговорим про сами итераторы. 😎

📌 Итератор — это объект, который обеспечивает последовательный доступ к элементам коллекции. Он выдает элементы по одному и хранит текущее состояние обхода.

У итератора есть два ключевых метода, реализующих протокол итератора:

1️⃣ __iter__() — возвращает самого себя. Нужен для того, чтобы любой итератор можно было использовать там, где ожидается итерируемый объект (например, в for). Проще говоря, итератор тоже является итерируемым объектом.
2️⃣ __next__() — возвращает очередной элемент.

С помощью функции iter() мы можем получить итератор из итерируемого объекта. После этого мы можем передавать его встроенной функции next(), которая вызывает метод __next__() у итератора и возвращает очередной элемент.

Когда элементы заканчиваются, метод __next__() возбуждает исключение StopIteration и итератор становится совершенно бесполезным. Цикл for обрабатывает это исключение автоматически и завершает выполнение.

Представить работу цикла:

for x in obj:
print(x)


можно следующим образом:

it = iter(obj)
while True:
try:
print(next(it))
except StopIteration:
break


👀 Более подробно об итераторах и о том, как можно реализовывать собственные итераторы, мы рассказываем в наших курсах для профессионалов и ООП. Напоминаем, что до 15 сентября действует скидка 2000 рублей при покупке любого нашего курса!

Ставьте реакцию:

❤️ — если уже прошли итераторы в наших курсах
🔥 — если проходите их прямо сейчас
👀 — если еще не добрались до итераторов

#полезныйматериал #python #ооп
Please open Telegram to view this post
VIEW IN TELEGRAM
❤63👀59🔥10👨‍💻5
Друзья, сегодня день релиза новой версии Python 3.15! 😍 Хотим поделиться с вами интересными нововведениями.

1⃣Замороженный словарь. В Python 3.15 будет добавлен новый тип данных frozendict — неизменяемая версия обычного словаря.

2⃣Ленивые импорты (lazy imports). Будет добавлен новый оператор lazy, который указывается перед import или from. Этот оператор сообщает интерпретатору, что импортировать объект нужно только в момент его первого использования.
lazy import math
lazy from operator import add

# модуль math и функция add() еще не импортированы
a = 1
b = 2
print(f'Вычисляем корень квадратный числа {a}')

# модуль math импортируется только здесь
# функция add() еще не импортирована
print(math.sqrt(a))

print(f'Вычисляем сумму чисел {a} и {b}')

# функция add() импортируется только здесь
print(add(a, b))


3⃣Стандартизация сигнальных объектов. Появится новый класс sentinel, экземпляры которого можно использовать в качестве значения по умолчанию в функциях и методах вместо None. Это особенно полезно там, где константа None сама по себе является валидным значением аргумента.
MISSING = sentinel('MISSING')

def foo(value=MISSING):
if value is MISSING:
raise ValueError('Значение не передано')
return value


4⃣Распаковка в comprehensions. Операторы распаковки * и ** теперь можно использовать в list, set и dict comprehensions для распаковки вложенных коллекций.
matrix = [[1, 2], [3, 4], [5, 6]]

# старый вариант
unpacked1 = [x for row in matrix for x in row]

# новый вариант
unpacked2 = [*row for row in matrix]


5⃣Умные сообщения об ошибках. Python научится лучше сообщать об ошибках, связанных с исключением AttributeError. Например, если вы работали на другом языке программирования и привыкли к методу push() для добавления элемента в список, то теперь Python сможет не только сообщать о том, что такого метода не существует, но и подсказать правильный.
AttributeError: 'list' object has no attribute 'push'. Did you mean 'append'?


6⃣ Кодировка UTF-8 по умолчанию. Python теперь всегда использует кодировку UTF-8 для чтения файлов на всех ОС, включая Windows.

Ставьте реакцию:

🔥 — если сразу обновляете Python до последней версии
👀 — если этого не делаете

#python #полезныйматериал
Please open Telegram to view this post
VIEW IN TELEGRAM
👀186🔥68👍23❤1611👏3🏆2
Друзья, а вы знали, что официальная документация Python теперь доступна на русском языке? 😍

🔥 Ознакомиться по ссылке 🔥

О выходе официального перевода сообщил в конце августа Стен Ульбрих в блоге Python Insider.

Что вошло в русскоязычную версию:

✅Руководство, объясняющее основной синтаксис, структуры данных, функции и другие теоретические блоки, необходимые для начального погружения
✅1-3 и 7 главы Справочника по языку Python.

Остальные блоки документации пока недоступны на русском.

👀 Сообщество приглашает новых участников помочь с переводом. Для этого необходимо изучить руководство по переводу в Python Developer's Guide и интерактивную панель (Translation Dashboard).

Ставьте реакцию:

🔥 — если заглядывали в официальную документацию Python
👀 — если пока этого не делали

#python #полезныйматериал
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥118👀87❤14🤷‍♂2🤩2🆒2⚡1😍1🗿1😎1