Упрямая del операция (ч.1)
Фух, наконец-то удалил. Возможно, вы уже догадались, что спасло del от вызова при нашей первой попытке удаления x.
del x напрямую не вызывает x.del().
При del x обнаружении Python удаляет имя x из текущей области видимости и уменьшает на 1 количество ссылок на объект, на который x ссылается. del() вызывается только тогда, когда количество ссылок на объект достигает нуля.
#theory // Just Python
Фух, наконец-то удалил. Возможно, вы уже догадались, что спасло del от вызова при нашей первой попытке удаления x.
del x напрямую не вызывает x.del().
При del x обнаружении Python удаляет имя x из текущей области видимости и уменьшает на 1 количество ссылок на объект, на который x ссылается. del() вызывается только тогда, когда количество ссылок на объект достигает нуля.
#theory // Just Python
Упрямая del операция (ч.2)
Во втором фрагменте вывода del() не был вызван, потому что предыдущий оператор (>>> y) в интерактивном интерпретаторе создал другую ссылку на тот же объект (в частности, на _ магическую переменную, которая ссылается на результирующее значение последнего не None выражения в REPL), таким образом предотвращая достижение нулевого значения количества ссылок при del y обнаружении.
Вызов globals (или, на самом деле, выполнение чего-либо, что не будет иметь None результата) заставил _ ссылаться на новый результат, отбрасывая существующую ссылку. Теперь количество ссылок достигло 0, и мы видим, что "Удалено!" печатается (наконец-то!).
#theory // Just Python
Во втором фрагменте вывода del() не был вызван, потому что предыдущий оператор (>>> y) в интерактивном интерпретаторе создал другую ссылку на тот же объект (в частности, на _ магическую переменную, которая ссылается на результирующее значение последнего не None выражения в REPL), таким образом предотвращая достижение нулевого значения количества ссылок при del y обнаружении.
Вызов globals (или, на самом деле, выполнение чего-либо, что не будет иметь None результата) заставил _ ссылаться на новый результат, отбрасывая существующую ссылку. Теперь количество ссылок достигло 0, и мы видим, что "Удалено!" печатается (наконец-то!).
#theory // Just Python
Переменная вне области видимости (ч.1)
Когда вы присваиваете переменной в области видимости, она становится локальной для этой области. Таким образом, a становится локальным для области another_func, но он не был инициализирован ранее в той же области, что выдает ошибку.
#theory // Just Python
Когда вы присваиваете переменной в области видимости, она становится локальной для этой области. Таким образом, a становится локальным для области another_func, но он не был инициализирован ранее в той же области, что выдает ошибку.
#theory // Just Python
Переменная вне области видимости (ч.2)
Чтобы изменить переменную внешней области a в another_func, мы должны использовать global ключевое слово.
В another_closure_func, a становится локальным для области another_inner_func, но он не был инициализирован ранее в той же области, поэтому выдает ошибку.
#theory // Just Python
Чтобы изменить переменную внешней области a в another_func, мы должны использовать global ключевое слово.
В another_closure_func, a становится локальным для области another_inner_func, но он не был инициализирован ранее в той же области, поэтому выдает ошибку.
#theory // Just Python
Переменная вне области видимости (ч.3)
Чтобы изменить переменную внешней области a в another_inner_func, используйте nonlocal ключевое слово. Нелокальный оператор используется для ссылки на переменные, определенные в ближайшей внешней (исключая глобальную) области видимости.
Ключевые слова global и nonlocal говорят интерпретатору python не объявлять новые переменные и искать их в соответствующих внешних областях.
Прочтите это короткое, но потрясающее руководство, чтобы узнать больше о том, как работают пространства имен и разрешение области видимости в Python.
#theory // Just Python
Чтобы изменить переменную внешней области a в another_inner_func, используйте nonlocal ключевое слово. Нелокальный оператор используется для ссылки на переменные, определенные в ближайшей внешней (исключая глобальную) области видимости.
Ключевые слова global и nonlocal говорят интерпретатору python не объявлять новые переменные и искать их в соответствующих внешних областях.
Прочтите это короткое, но потрясающее руководство, чтобы узнать больше о том, как работают пространства имен и разрешение области видимости в Python.
#theory // Just Python
Удаление элемента списка во время итерации (ч.1)
Никогда не стоит менять объект, над которым вы выполняете итерацию. Правильный способ сделать это - выполнить итерацию по копии объекта вместо этого, и list_3[:] делает именно это.
Разница между del, remove и pop:
del var_name просто удаляет привязку var_name из локального или глобального пространства имен (вот почему list_1 это не влияет).
remove удаляет первое совпадающее значение, а не конкретный индекс, повышает ValueError, если значение не найдено.
pop удаляет элемент с определенным индексом и возвращает его, поднимает, IndexError если указан недопустимый индекс.
#theory // Just Python
Никогда не стоит менять объект, над которым вы выполняете итерацию. Правильный способ сделать это - выполнить итерацию по копии объекта вместо этого, и list_3[:] делает именно это.
Разница между del, remove и pop:
del var_name просто удаляет привязку var_name из локального или глобального пространства имен (вот почему list_1 это не влияет).
remove удаляет первое совпадающее значение, а не конкретный индекс, повышает ValueError, если значение не найдено.
pop удаляет элемент с определенным индексом и возвращает его, поднимает, IndexError если указан недопустимый индекс.
#theory // Just Python
Удаление элемента списка во время итерации (ч.2)
Почему вывод такой[2, 4]?
Итерация списка выполняется индекс за индексом, и когда мы удаляем 1 из list_2 или list_4, содержимое списков теперь [2, 3, 4]. Остальные элементы сдвинуты вниз, т.Е. 2 находятся с индексом 0, а 3 - с индексом 1. Поскольку следующая итерация будет смотреть на индекс 1 (который является 3), 2 он полностью пропускается. Аналогичная вещь произойдет с каждым альтернативным элементом в последовательности списков.
Обратитесь к этому потоку StackOverflow, объясняющему пример
Смотрите также этот приятный поток StackOverflow для аналогичного примера, связанного со словарями в Python.
#theory // Just Python
Почему вывод такой[2, 4]?
Итерация списка выполняется индекс за индексом, и когда мы удаляем 1 из list_2 или list_4, содержимое списков теперь [2, 3, 4]. Остальные элементы сдвинуты вниз, т.Е. 2 находятся с индексом 0, а 3 - с индексом 1. Поскольку следующая итерация будет смотреть на индекс 1 (который является 3), 2 он полностью пропускается. Аналогичная вещь произойдет с каждым альтернативным элементом в последовательности списков.
Обратитесь к этому потоку StackOverflow, объясняющему пример
Смотрите также этот приятный поток StackOverflow для аналогичного примера, связанного со словарями в Python.
#theory // Just Python
Готовый код за 4 часа или за 4 минуты?
Решать тебе. Но рынок всё равно поставит на тех, кто кодит с нейросетями.
Большинство айтишников тратят время на шаблонный код, типовые решения и бесконечные правки — вместо того, чтобы сосредоточиться на логике продукта.
На бесплатном эфире с СЕО университета Зерокодер покажет, как применять Cursor для ускорения разработки — от быстрого написания кода до автоматизации рутинных задач программиста.
Что ждет вас на вебинаре?
– Разберём, что такое вайб-кодинг и как Cursor уже меняет правила игры на IT-рынке;
– Пошагово покажем, как программировать в Cursor, не написав ни единой строки кода вручную;
– Создадим готовый проект с нуля своими руками;
– Расскажем, где и как правильно применять эти знания в 2025 году.
Все участники получат готовые инструменты для работы с нейросетями. Эфир подойдет всем, кто хочет сэкономить время, монетизировать навыки и оставаться в тренде технологий 2025 года.
Один из самых свежих и бесплатных эфиров лета 2025 года ждет вас по ссылке.
Решать тебе. Но рынок всё равно поставит на тех, кто кодит с нейросетями.
Большинство айтишников тратят время на шаблонный код, типовые решения и бесконечные правки — вместо того, чтобы сосредоточиться на логике продукта.
На бесплатном эфире с СЕО университета Зерокодер покажет, как применять Cursor для ускорения разработки — от быстрого написания кода до автоматизации рутинных задач программиста.
Что ждет вас на вебинаре?
– Разберём, что такое вайб-кодинг и как Cursor уже меняет правила игры на IT-рынке;
– Пошагово покажем, как программировать в Cursor, не написав ни единой строки кода вручную;
– Создадим готовый проект с нуля своими руками;
– Расскажем, где и как правильно применять эти знания в 2025 году.
Все участники получат готовые инструменты для работы с нейросетями. Эфир подойдет всем, кто хочет сэкономить время, монетизировать навыки и оставаться в тренде технологий 2025 года.
Один из самых свежих и бесплатных эфиров лета 2025 года ждет вас по ссылке.
Почтовый индекс итераторов с потерями
Итак, функция принимает произвольное количество итерируемых объектов, добавляет каждый из их элементов в result список, вызывая для них next функцию, и останавливается всякий раз, когда какой-либо из итерируемых объектов исчерпан.
Предостережение здесь в том, что когда любой итерируемый параметр исчерпан, существующие элементы в result списке отбрасываются. Именно это произошло с 3 в numbers_iter.
Первый аргумент zip должен содержать наименьшее количество элементов.
#theory // Just Python
Итак, функция принимает произвольное количество итерируемых объектов, добавляет каждый из их элементов в result список, вызывая для них next функцию, и останавливается всякий раз, когда какой-либо из итерируемых объектов исчерпан.
Предостережение здесь в том, что когда любой итерируемый параметр исчерпан, существующие элементы в result списке отбрасываются. Именно это произошло с 3 в numbers_iter.
Первый аргумент zip должен содержать наименьшее количество элементов.
#theory // Just Python
IP-адрес
Вы можете менять IP-адрес каждые несколько секунд или для каждого запроса. Целевой сервер не может идентифицировать ваши запросы и не блокирует эти IP-адреса. Вы можете создать огромный список прокси и выбирать по одному для каждого запроса случайным образом. Или используйте вращающийся прокси, который сделает это за вас. После этого изменения шансы на правильную работу скрапера резко возрастают.
#theory // Just Python
Вы можете менять IP-адрес каждые несколько секунд или для каждого запроса. Целевой сервер не может идентифицировать ваши запросы и не блокирует эти IP-адреса. Вы можете создать огромный список прокси и выбирать по одному для каждого запроса случайным образом. Или используйте вращающийся прокси, который сделает это за вас. После этого изменения шансы на правильную работу скрапера резко возрастают.
#theory // Just Python
Декораторы
Вы можете их использовать для тонкой настройки работы класса или функции. Декораторы можно считать функцией, которая применена к другой функции. Чтобы определить функцию-декоратор для декорируемой функции, используется знак @ и после него название функции. Из этого следует, что декоратор принимает в качестве аргумента функцию, которою он декорирует.
#theory // Just Python
Вы можете их использовать для тонкой настройки работы класса или функции. Декораторы можно считать функцией, которая применена к другой функции. Чтобы определить функцию-декоратор для декорируемой функции, используется знак @ и после него название функции. Из этого следует, что декоратор принимает в качестве аргумента функцию, которою он декорирует.
#theory // Just Python
User-Agent
Механизм защиты от скрапинга – User-Agent. UA – это заголовок, который браузеры отправляют в запросах для идентификации. Обычно он представляет собой длинную строку, в которой объявляется имя браузера, версия, платформа и многое другое.
#theory // Just Python
Механизм защиты от скрапинга – User-Agent. UA – это заголовок, который браузеры отправляют в запросах для идентификации. Обычно он представляет собой длинную строку, в которой объявляется имя браузера, версия, платформа и многое другое.
#theory // Just Python
Утечки переменных цикла (ч.1)
Но x никогда не был определен вне области действия цикла for...
В Python for-циклы используют область, в которой они существуют, и оставляют за собой определенную переменную цикла. Это также применимо, если мы ранее явно определили переменную for-loop в глобальном пространстве имен. В этом случае он повторно свяжет существующую переменную.
#theory // Just Python
Но x никогда не был определен вне области действия цикла for...
В Python for-циклы используют область, в которой они существуют, и оставляют за собой определенную переменную цикла. Это также применимо, если мы ранее явно определили переменную for-loop в глобальном пространстве имен. В этом случае он повторно свяжет существующую переменную.
#theory // Just Python
Утечки переменных цикла (ч.2)
Различия в выходных данных интерпретаторов Python 2.x и Python 3.x для примера понимания списков можно объяснить следующими изменениями, описанными в Что нового в Python 3.0
#theory // Just Python
Различия в выходных данных интерпретаторов Python 2.x и Python 3.x для примера понимания списков можно объяснить следующими изменениями, описанными в Что нового в Python 3.0
#theory // Just Python
Утечки переменных цикла (ч.3)
Понимание списков больше не поддерживает синтаксическую форму [... for var in item1, item2, ...]. Используйте [... for var in (item1, item2, ...)] вместо этого. Также обратите внимание, что понимание списков имеет другую семантику: они ближе к синтаксическому сахару для выражения генератора внутри list() конструктора, и, в частности, управляющие переменные цикла больше не передаются в окружающую область видимости.
#theory // Just Python
Понимание списков больше не поддерживает синтаксическую форму [... for var in item1, item2, ...]. Используйте [... for var in (item1, item2, ...)] вместо этого. Также обратите внимание, что понимание списков имеет другую семантику: они ближе к синтаксическому сахару для выражения генератора внутри list() конструктора, и, в частности, управляющие переменные цикла больше не передаются в окружающую область видимости.
#theory // Just Python
Остерегайтесь изменяемых аргументов по умолчанию (ч.1)
Изменяемые аргументы функций по умолчанию в Python на самом деле не инициализируются при каждом вызове функции. Вместо этого в качестве значения по умолчанию используется недавно присвоенное им значение. Когда мы явно передали [] в some_func качестве аргумента значение default_arg переменной по умолчанию не использовалось, поэтому функция вернулась, как ожидалось.
#theory // Just Python
Изменяемые аргументы функций по умолчанию в Python на самом деле не инициализируются при каждом вызове функции. Вместо этого в качестве значения по умолчанию используется недавно присвоенное им значение. Когда мы явно передали [] в some_func качестве аргумента значение default_arg переменной по умолчанию не использовалось, поэтому функция вернулась, как ожидалось.
#theory // Just Python
Остерегайтесь изменяемых аргументов по умолчанию (ч.2)
Обычная практика, позволяющая избежать ошибок из-за изменяемых аргументов, заключается в присвоении None значения по умолчанию и последующей проверке, передается ли какое-либо значение функции, соответствующей этому аргументу
#theory // Just Python
Обычная практика, позволяющая избежать ошибок из-за изменяемых аргументов, заключается в присвоении None значения по умолчанию и последующей проверке, передается ли какое-либо значение функции, соответствующей этому аргументу
#theory // Just Python
Перехват исключений (ч.1)
Чтобы добавить несколько исключений в предложение except, вам нужно передать их в виде кортежа в скобках в качестве первого аргумента. Второй аргумент - это необязательное имя, которое при указании будет привязывать созданный экземпляр исключения.
#theory // Just Python
Чтобы добавить несколько исключений в предложение except, вам нужно передать их в виде кортежа в скобках в качестве первого аргумента. Второй аргумент - это необязательное имя, которое при указании будет привязывать созданный экземпляр исключения.
#theory // Just Python
Перехват исключений (ч.2)
Разделение исключения из переменной запятой устарело и не работает в Python 3; правильный способ - использовать as.
#theory // Just Python
Разделение исключения из переменной запятой устарело и не работает в Python 3; правильный способ - использовать as.
#theory // Just Python
Те же операнды, другая история! (ч.1)
a += b не всегда ведет себя так же, как a = a + b. Классы могут по-разному реализовывать op= операторы, и списки делают это.
Выражение a = a + [5,6,7,8] генерирует новый список и устанавливает a ссылку на этот новый список, оставляя b без изменений.
#theory // Just Python
a += b не всегда ведет себя так же, как a = a + b. Классы могут по-разному реализовывать op= операторы, и списки делают это.
Выражение a = a + [5,6,7,8] генерирует новый список и устанавливает a ссылку на этот новый список, оставляя b без изменений.
#theory // Just Python