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
Те же операнды, другая история! (ч.2)
Выражение a += [5,6,7,8] на самом деле сопоставлено с функцией "extend", которая работает со списком таким образом, что a и b по-прежнему указывают на тот же список, который был изменен на месте.
#theory // Just Python
Выражение a += [5,6,7,8] на самом деле сопоставлено с функцией "extend", которая работает со списком таким образом, что a и b по-прежнему указывают на тот же список, который был изменен на месте.
#theory // Just Python
Разрешение имен, игнорирующее область видимости класса (ч.1)
Области, вложенные внутри определения класса, игнорируют имена, связанные на уровне класса.
#theory // Just Python
Области, вложенные внутри определения класса, игнорируют имена, связанные на уровне класса.
#theory // Just Python
Разрешение имен, игнорирующее область видимости класса (ч.2)
Выражение генератора имеет свою собственную область видимости.
Начиная с Python 3.X, понимание списков также имеет свою собственную область.
#theory // Just Python
Выражение генератора имеет свою собственную область видимости.
Начиная с Python 3.X, понимание списков также имеет свою собственную область.
#theory // Just Python
Округляет, как банкир (ч.1)
Давайте реализуем наивную функцию для получения среднего элемента списка
Это не ошибка точности с плавающей запятой, на самом деле, такое поведение является преднамеренным. Начиная с Python 3.0, round() использует округление банкира, где дроби .5 округляются до ближайшего четного числа:
#theory // Just Python
Давайте реализуем наивную функцию для получения среднего элемента списка
Это не ошибка точности с плавающей запятой, на самом деле, такое поведение является преднамеренным. Начиная с Python 3.0, round() использует округление банкира, где дроби .5 округляются до ближайшего четного числа:
#theory // Just 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, возвращая последний элемент в списке.
#theory // Just Python
Это рекомендуемый способ округления дробей .5, как описано в IEEE 754. Однако в школе большую часть времени преподают другой способ (округление от нуля), поэтому округление банкира, вероятно, не так хорошо известно. Кроме того, некоторые из самых популярных языков программирования (например: JavaScript, Java, C / C ++, Ruby, Rust) также не используют банковское округление.
Следовательно, это все еще довольно специфично для Python и может привести к путанице при округлении дробей.
Смотрите Документы round() или этот поток stackoverflow для получения дополнительной информации.
Обратите внимание, что get_middle([1]) было возвращено только 1, потому что индекс был round(0.5) - 1 = 0 - 1 = -1, возвращая последний элемент в списке.
#theory // Just Python
Иголки в стоге сена (ч.1)
Для 1 правильным утверждением для ожидаемого поведения является x, y = (0, 1) if True else (None, None).
#theory // Just Python
Для 1 правильным утверждением для ожидаемого поведения является x, y = (0, 1) if True else (None, None).
#theory // Just Python
Иголки в стоге сена (ч.2)
Для 2 правильным выражением для ожидаемого поведения является t = ('one',) or t = 'one', (пропущенная запятая), в противном случае интерпретатор считает, что t это str и повторяет его посимвольно.
() является специальным маркером и обозначает пустой tuple.
#theory // Just Python
Для 2 правильным выражением для ожидаемого поведения является t = ('one',) or t = 'one', (пропущенная запятая), в противном случае интерпретатор считает, что t это str и повторяет его посимвольно.
() является специальным маркером и обозначает пустой tuple.
#theory // Just Python
Иголки в стоге сена (ч.3)
В 3, как вы, возможно, уже поняли, после 5-го элемента ("that") в списке отсутствует запятая. Итак, с помощью неявной конкатенации строковых литералов,
#theory // Just Python
В 3, как вы, возможно, уже поняли, после 5-го элемента ("that") в списке отсутствует запятая. Итак, с помощью неявной конкатенации строковых литералов,
>>> ten_words_list
['some', 'very', 'big', 'list', 'thatconsists', 'of', 'exactly', 'ten', 'words']
#theory // Just Python
Иголки в стоге сена (ч.4)
В 4-м фрагменте на AssertionError был поднят вопрос, потому что вместо утверждения отдельного выражения a == b мы утверждаем весь кортеж. Следующий фрагмент прояснит ситуацию,
#theory // Just 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
#theory // Just Python