Остерегайтесь изменяемых аргументов по умолчанию (ч.1)
Изменяемые аргументы функций по умолчанию в Python на самом деле не инициализируются при каждом вызове функции. Вместо этого в качестве значения по умолчанию используется недавно присвоенное им значение. Когда мы явно передали [] в some_func качестве аргумента значение default_arg переменной по умолчанию не использовалось, поэтому функция вернулась, как ожидалось.
Разъяснивший Python
Изменяемые аргументы функций по умолчанию в Python на самом деле не инициализируются при каждом вызове функции. Вместо этого в качестве значения по умолчанию используется недавно присвоенное им значение. Когда мы явно передали [] в some_func качестве аргумента значение default_arg переменной по умолчанию не использовалось, поэтому функция вернулась, как ожидалось.
Разъяснивший Python
Остерегайтесь изменяемых аргументов по умолчанию (ч.2)
Обычная практика, позволяющая избежать ошибок из-за изменяемых аргументов, заключается в присвоении None значения по умолчанию и последующей проверке, передается ли какое-либо значение функции, соответствующей этому аргументу
Разъяснивший Python
Обычная практика, позволяющая избежать ошибок из-за изменяемых аргументов, заключается в присвоении None значения по умолчанию и последующей проверке, передается ли какое-либо значение функции, соответствующей этому аргументу
Разъяснивший Python
Проверка вхождения подстроки через оператор in — быстрее и проще
Иногда разработчики прибегают к
Итог:
Используй
Разъяснивший Python
Иногда разработчики прибегают к
str.find()
или str.index()
для поиска подстроки, но есть более питоничный способ — использовать in
.Итог:
Используй
in
для проверки наличия подстроки — это читаемо, кратко и безопасно.Разъяснивший Python
Перехват исключений (ч.1)
Чтобы добавить несколько исключений в предложение except, вам нужно передать их в виде кортежа в скобках в качестве первого аргумента. Второй аргумент - это необязательное имя, которое при указании будет привязывать созданный экземпляр исключения.
Разъяснивший Python
Чтобы добавить несколько исключений в предложение except, вам нужно передать их в виде кортежа в скобках в качестве первого аргумента. Второй аргумент - это необязательное имя, которое при указании будет привязывать созданный экземпляр исключения.
Разъяснивший Python
Перехват исключений (ч.2)
Разделение исключения из переменной запятой устарело и не работает в Python 3; правильный способ - использовать as.
Разъяснивший Python
Разделение исключения из переменной запятой устарело и не работает в Python 3; правильный способ - использовать as.
Разъяснивший Python
Атрибуты по умолчанию с getattr
Иногда нужно безопасно получить значение атрибута объекта, даже если он может не существовать. Вместо проверки через hasattr, можно использовать getattr с дефолтным значением.
Безопасный доступ — особенно полезен при работе с внешними объектами, парсерами или нестабильными структурами данных.
Итог:
getattr(obj, attr, default) — простой способ избежать AttributeError и задать значение по умолчанию для несуществующих атрибутов.
Разъяснивший Python
Иногда нужно безопасно получить значение атрибута объекта, даже если он может не существовать. Вместо проверки через hasattr, можно использовать getattr с дефолтным значением.
Безопасный доступ — особенно полезен при работе с внешними объектами, парсерами или нестабильными структурами данных.
Итог:
getattr(obj, attr, default) — простой способ избежать AttributeError и задать значение по умолчанию для несуществующих атрибутов.
Разъяснивший Python
Те же операнды, другая история! (ч.1)
a += b не всегда ведет себя так же, как a = a + b. Классы могут по-разному реализовывать op= операторы, и списки делают это.
Выражение a = a + [5,6,7,8] генерирует новый список и устанавливает a ссылку на этот новый список, оставляя b без изменений.
Разъяснивший Python
a += b не всегда ведет себя так же, как a = a + b. Классы могут по-разному реализовывать op= операторы, и списки делают это.
Выражение a = a + [5,6,7,8] генерирует новый список и устанавливает a ссылку на этот новый список, оставляя b без изменений.
Разъяснивший Python
Те же операнды, другая история! (ч.2)
Выражение a += [5,6,7,8] на самом деле сопоставлено с функцией "extend", которая работает со списком таким образом, что a и b по-прежнему указывают на тот же список, который был изменен на месте.
Разъяснивший Python
Выражение a += [5,6,7,8] на самом деле сопоставлено с функцией "extend", которая работает со списком таким образом, что a и b по-прежнему указывают на тот же список, который был изменен на месте.
Разъяснивший Python
Разрешение имен, игнорирующее область видимости класса (ч.1)
Области, вложенные внутри определения класса, игнорируют имена, связанные на уровне класса.
Разъяснивший Python
Области, вложенные внутри определения класса, игнорируют имена, связанные на уровне класса.
Разъяснивший Python
Разрешение имен, игнорирующее область видимости класса (ч.2)
Выражение генератора имеет свою собственную область видимости.
Начиная с Python 3.X, понимание списков также имеет свою собственную область.
Разъяснивший Python
Выражение генератора имеет свою собственную область видимости.
Начиная с Python 3.X, понимание списков также имеет свою собственную область.
Разъяснивший Python
Округляет, как банкир (ч.1)
Давайте реализуем наивную функцию для получения среднего элемента списка
Это не ошибка точности с плавающей запятой, на самом деле, такое поведение является преднамеренным. Начиная с Python 3.0, round() использует округление банкира, где дроби .5 округляются до ближайшего четного числа:
Разъяснивший Python
Давайте реализуем наивную функцию для получения среднего элемента списка
Это не ошибка точности с плавающей запятой, на самом деле, такое поведение является преднамеренным. Начиная с Python 3.0, round() использует округление банкира, где дроби .5 округляются до ближайшего четного числа:
Разъяснивший Python
Округляет, как банкир (ч.2)
Это рекомендуемый способ округления дробей .5, как описано в IEEE 754. Однако в школе большую часть времени преподают другой способ (округление от нуля), поэтому округление банкира, вероятно, не так хорошо известно. Кроме того, некоторые из самых популярных языков программирования (например: JavaScript, Java, C / C ++, Ruby, Rust) также не используют банковское округление.
Следовательно, это все еще довольно специфично для Python и может привести к путанице при округлении дробей.
Смотрите Документы round() или этот поток stackoverflow для получения дополнительной информации.
Обратите внимание, что get_middle([1]) было возвращено только 1, потому что индекс был round(0.5) - 1 = 0 - 1 = -1, возвращая последний элемент в списке.
Разъяснивший Python
Это рекомендуемый способ округления дробей .5, как описано в IEEE 754. Однако в школе большую часть времени преподают другой способ (округление от нуля), поэтому округление банкира, вероятно, не так хорошо известно. Кроме того, некоторые из самых популярных языков программирования (например: JavaScript, Java, C / C ++, Ruby, Rust) также не используют банковское округление.
Следовательно, это все еще довольно специфично для Python и может привести к путанице при округлении дробей.
Смотрите Документы round() или этот поток stackoverflow для получения дополнительной информации.
Обратите внимание, что get_middle([1]) было возвращено только 1, потому что индекс был round(0.5) - 1 = 0 - 1 = -1, возвращая последний элемент в списке.
Разъяснивший Python
Иголки в стоге сена (ч.1)
Для 1 правильным утверждением для ожидаемого поведения является x, y = (0, 1) if True else (None, None).
Разъяснивший Python
Для 1 правильным утверждением для ожидаемого поведения является x, y = (0, 1) if True else (None, None).
Разъяснивший Python
Иголки в стоге сена (ч.2)
Для 2 правильным выражением для ожидаемого поведения является t = ('one',) or t = 'one', (пропущенная запятая), в противном случае интерпретатор считает, что t это str и повторяет его посимвольно.
() является специальным маркером и обозначает пустой tuple.
Разъяснивший Python
Для 2 правильным выражением для ожидаемого поведения является t = ('one',) or t = 'one', (пропущенная запятая), в противном случае интерпретатор считает, что t это str и повторяет его посимвольно.
() является специальным маркером и обозначает пустой tuple.
Разъяснивший Python
Иголки в стоге сена (ч.3)
В 3, как вы, возможно, уже поняли, после 5-го элемента ("that") в списке отсутствует запятая. Итак, с помощью неявной конкатенации строковых литералов,
Разъяснивший Python
В 3, как вы, возможно, уже поняли, после 5-го элемента ("that") в списке отсутствует запятая. Итак, с помощью неявной конкатенации строковых литералов,
>>> ten_words_list
['some', 'very', 'big', 'list', 'thatconsists', 'of', 'exactly', 'ten', 'words']
Разъяснивший Python
This media is not supported in your browser
VIEW IN TELEGRAM
print("Программирование — В С Ё!")
В 2025 году на кодинге уже не вывезешь, перспектива года - Кибербезопасность.
Ловите полезные каналы, которые помогут ворваться в новое направление:
Please open Telegram to view this post
VIEW IN TELEGRAM
Иголки в стоге сена (ч.4)
В 4-м фрагменте на AssertionError был поднят вопрос, потому что вместо утверждения отдельного выражения a == b мы утверждаем весь кортеж. Следующий фрагмент прояснит ситуацию,
Разъяснивший Python
В 4-м фрагменте на AssertionError был поднят вопрос, потому что вместо утверждения отдельного выражения a == b мы утверждаем весь кортеж. Следующий фрагмент прояснит ситуацию,
>>> a = "python"
>>> b = "javascript"
>>> assert a == b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
>>> assert (a == b, "Значения не равны")
<stdin>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?
>>> assert a == b, "Значения не равны"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: Values are not equal
Разъяснивший Python
Иголки в стоге сена (ч.5)
Что касается пятого фрагмента, большинство методов, которые изменяют элементы объектов последовательности / сопоставления, такие как list.append, dict.update, list.sort и т.д. измените объекты на месте и верните None. Обоснование этого заключается в повышении производительности за счет отказа от создания копии объекта, если операция может быть выполнена на месте.
Разъяснивший Python
Что касается пятого фрагмента, большинство методов, которые изменяют элементы объектов последовательности / сопоставления, такие как list.append, dict.update, list.sort и т.д. измените объекты на месте и верните None. Обоснование этого заключается в повышении производительности за счет отказа от создания копии объекта, если операция может быть выполнена на месте.
Разъяснивший Python
Иголки в стоге сена (ч.6)
Последний должен быть довольно очевидным, изменяемым объектом (например list) может быть изменен в функции, и переназначение неизменяемого (a -= 1) не является изменением значения.
Разъяснивший Python
Последний должен быть довольно очевидным, изменяемым объектом (например list) может быть изменен в функции, и переназначение неизменяемого (a -= 1) не является изменением значения.
Разъяснивший Python
Разбиения
На первый взгляд может показаться, что разделителем по умолчанию для split является один пробел ' ', но согласно документации:
Если sep не указан или есть None, применяется другой алгоритм разделения: последовательные пробельные строки рассматриваются как единый разделитель, и результат не будет содержать пустых строк в начале или в конце, если строка содержит начальный или конечный пробел. Следовательно, возвращается разделение пустой строки или строки, состоящей только из пробелов с разделителем None []. Если задан sep, последовательные разделители не группируются вместе и считаются разделителями пустых строк (например, '1,,2'.split(',') возвращает ['1', '', '2']). Возвращает разделение пустой строки указанным разделителем [''].
Разъяснивший Python
На первый взгляд может показаться, что разделителем по умолчанию для split является один пробел ' ', но согласно документации:
Если sep не указан или есть None, применяется другой алгоритм разделения: последовательные пробельные строки рассматриваются как единый разделитель, и результат не будет содержать пустых строк в начале или в конце, если строка содержит начальный или конечный пробел. Следовательно, возвращается разделение пустой строки или строки, состоящей только из пробелов с разделителем None []. Если задан sep, последовательные разделители не группируются вместе и считаются разделителями пустых строк (например, '1,,2'.split(',') возвращает ['1', '', '2']). Возвращает разделение пустой строки указанным разделителем [''].
Разъяснивший Python