Как получить доступ к модулю, написанному на python из C и наоборот?
Ответ:
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
Ответ:
Для того чтобы получить доступ к модулю, написанному на Python из C, можно использовать библиотеку Python/C API, которая позволяет вызывать Python функции и работать с объектами Python из C программы. Для того чтобы получить доступ к модулю, сначала нужно получить указатель на объект модуля с помощью функции PyImport_ImportModule(). Затем можно получить указатель на функции или объекты модуля с помощью функции PyObject_GetAttrString().
Например, вот пример кода на C, который вызывает функцию “hello” из модуля “example” на Python:#include <Python.h>
int main() {
Py_Initialize();
PyObject* module = PyImport_ImportModule("example");
PyObject* func = PyObject_GetAttrString(module, "hello");
PyObject* result = PyObject_CallObject(func, NULL);
printf("Result: %sn", PyUnicode_AsUTF8(result));
Py_DECREF(func);
Py_DECREF(module);
Py_DECREF(result);
Py_Finalize();
return 0;
}
Аналогичным образом можно вызвать функции из библиотек, написанных на C из Python, используя библиотеку ctypes. Например, вот пример кода на Python, который вызывает функцию sqrt из библиотеки math:
from ctypes import cdll
libm = cdll.LoadLibrary('libm.so ')
print(libm.sqrt(4.0))
Здесь мы загружаем библиотекуlibm.so (которая содержит функцию sqrt) и вызываем её с помощью атрибута dot-notation
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Парсинг с помощью Python. Веб-скрапинг в действии [2025]
🔤 Скачать книгу
➡️ Подготовка Python | #книги
Если программирование – магия, то веб-скрапинг – настоящее колдовство. Написав простую автоматизированную программу, можно отправлять запросы веб-серверам, получать ответы с данными, а затем анализировать эти данные и извлекать необходимую информацию. Это обновленное третье издание книги не только познакомит вас с веб-скрапингом, но и послужит исчерпывающим руководством по сбору практически любых видов данных в современном Интернете. В части I основное внимание уделено механике веб-скрапинга: как с помощью Python отправлять запросы веб-серверам, обрабатывать ответы и автоматизировать взаимодействие с сайтами. В части II исследуются более конкретные инструменты и приложения, которые пригодятся при любом сценарии веб-скрапинга.
Please open Telegram to view this post
VIEW IN TELEGRAM
Репозиторий с пошаговыми задачами для старта в Python за 30 дней
Внутри — текстовые уроки для челленджа «30 дней программирования на Python». Разбор тем, задачки, полезные ссылки — всё для тех, кто только делает первые шаги
➡️ Ссылка на репозиторий
➡️ Подготовка Python | #репозиторий
Внутри — текстовые уроки для челленджа «30 дней программирования на Python». Разбор тем, задачки, полезные ссылки — всё для тех, кто только делает первые шаги
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое wheels и eggs? В чём разница?
Ответ:
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
Ответ:
В Python wheels и eggs – это форматы пакетов для установки и дистрибуции пакетов с помощью утилиты управления пакетами pip.
Eggs был первоначально разработан как формат дистрибуции пакетов для Python, но был заменен wheels. В отличие от wheels, eggs могут содержать .pyc файлы, что может привести к проблемам при установке на другой платформе или версии Python.
Wheels – это новый формат дистрибуции пакетов, который был введен в Python 2.7. Он поддерживается большинством пакетов на PyPI и имеет множество преимуществ, например:
Он не содержит .pyc файлов, что снижает вероятность конфликтов.
Он легко переносится между платформами и версиями Python.
Он поддерживает сжатие библиотек и упрощает установку требований.
В целом, wheels считается более продвинутой и предпочтительной формой дистрибуции пакетов в Python.
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯4
Почему в python нет оптимизации хвостовой рекурсии? Как это реализовать?
Ответ:
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
Ответ:
В Python хвостовая рекурсия не оптимизируется автоматически, поскольку она может привести к переполнению стека вызовов. В связи с этим, используется итеративный подход для написания функций, которые могут быть написаны с использованием хвостовой рекурсии в других языках.
Вы можете использовать декоратор sys.setrecursionlimit() для установки максимальной глубины стека вызовов. Однако это не рекомендуется, поскольку установка слишком большого лимита может привести к проблемам с производительностью, а слишком маленький лимит – к ошибкам переполнения стека вызовов.
Вот пример того, как можно установить максимальную глубину стека вызовов до 4000:
import sys
sys.setrecursionlimit(4000)
Вы также можете изменить код функции, чтобы использовать итеративный подход вместо хвостовой рекурсии. Один пример такого изменения может выглядеть следующим образом:
def factorial(n):
result = 1
for i in range(1, n+1):
result *= i
return result
это вместо использования рекурсивного подхода с вызовом factorial(n-1) внутри функции factorial(n).
Изменение рекурсивно написанной функции на итеративный код не всегда легко, но может существенно повысить производительность и устранить проблемы с переполнением стека вызовов.
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Что такое интернирование строк? Почему это есть в python?
Ответ:
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
Ответ:
Интернирование строк – это процесс, при котором две или более строковые переменные, содержащие одинаковое значение, ссылаются на один и тот же объект в памяти.
В Python интернирование строк происходит автоматически при создании строковых констант в исходном коде программы. Это означает, что если две или более строковые константы содержат одинаковое значение, они будут ссылаются на один и тот же объект в памяти.
Интернирование строк применяется для оптимизации использования памяти и ускорения выполнения программы. Поскольку операция сравнения двух строк, ссылающихся на один и тот же объект в памяти, выполняется быстрее, чем сравнение двух строк, которые хранятся в разных объектах в памяти.
В Python интернирование строк применяется для строковых констант, которые состоят из символов ASCII и имеют длину не более 20 символов. Это объясняется тем, что длинные строки могут занимать слишком много места в памяти, что может привести к проблемам производительности.
Интернирование строк является одним из многих способов оптимизации производительности, доступных в Python. Оно позволяет ускорить выполнение программы за счет сокращения использования памяти и оптимизации операций сравнения строк.
Пример кода, который демонстрирует интернирование строк в Python:
a = 'hello'
b = 'hello'
print(a is b) # True, потому что обе переменные ссылаются на один и тот же объект в памяти
c = 'hello world'
d = 'hello world'
print(c is d) # False, потому что строка "hello world" длиннее 5 символов и не является интернированной
e = '_123'
f = '_123'
print(e is f) # True, потому что строка содержит только цифры и символ '_'
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯3🔥2
Почему всякий раз, когда python завершает работу, не освобождается вся память?
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
Python использует автоматическое управление памятью с помощью механизма сборки мусора, который освобождает память, занятую объектами, которые больше не
используются в программе. Однако, до того как механизм сборки мусора может освободить память объекта, все ссылки на этот объект должны быть удалены. Если в
программе остаются ссылки на объекты, которые больше не нужны, то эти объекты не будут удалены до окончания работы приложения.
Также может случиться, что размер объектов, которые использует программа, слишком велик для доступной оперативной памяти. В этом случае операционная система
может начать использовать файл подкачки, что может замедлить работу программы.
Если вы столкнулись с проблемой утечки памяти, то можно воспользоваться инструментами, такими как memory_profiler для Python, которые помогут выявить места, где
память не освобождается, и найти способы ее оптимизации.
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯4
Что такое GIL? Почему GIL всё ещё существует?
Ответ:
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
Ответ:
GIL (Global Interpreter Lock) – это механизм в интерпретаторе CPython , который гарантирует, что только один поток исполнения может выполнять байт-код Python в любой момент времени. Это было добавлено в Python для обеспечения безопасности потоков в многопоточной среде и для упрощения реализации интерпретатора. GIL всё ещё существует, потому что он является важной частью интерпретатора CPython и его логики работы с потоками.
Однако, недавние версии Python имеют некоторые механизмы для обхода ограничений GIL, такие как использование многопроцессных вычислений вместо многопоточных и использование асинхронного
программирования. Кроме того, есть и другие реализации языка Python, такие как Jython и IronPython, которые не используют GIL.
Короче, вопрос насколько GIL ограничивает производительность Python сейчас является спорным и холиварным.
Подробнее о GIL можно почитать тут:Python — это медленно. Почему?
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2🤯2
Что будет напечатано в результате выполнения следующего кода?
Ответ:
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
Ответ:
import sys
arr_1 = []
arr_2 = arr_1
print(sys.getrefcount(arr_1))
В результате выполнения данного кода будет напечатано число, равное количеству ссылок на объект arr_1, которые существуют в настоящий момент времени. Так как мы создаем две переменные, arr_1 и arr_2, которые ссылаются на один и тот же пустой список [], то количество ссылок на него будет равно 2.
Поэтому в результате выполнения данного кода будет напечатано число 2. Эта величина может быть немного больше, чем ожидается, из-за внутренней оптимизации CPython, которая добавляет
временные ссылки на объекты.
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Что такое MRO? Как это работает?
Ответ:
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
Ответ:
MRO (Method Resolution Order) – это порядок разрешения методов, который используется в языке программирования Python при наследовании классов.
Когда вызывается метод на экземпляре класса, Python ищет этот метод в самом классе, а затем в его родительских классах в порядке, определенном в MRO. Таким образом, MRO управляет тем, как Python ищет методы, которые были унаследованы из нескольких родительских классов.
Порядок MRO может быть определен несколькими способами, но в общем случае MRO определяется с помощью алгоритма C3, который гарантирует, что порядок разрешения методов будет соблюдать локальный порядок наследования каждого класса и не создавать циклов в определении этого порядка.
Например, если класс A наследуется от классов B и C, а класс B наследуется от класса D, а класс C наследуется от класса E, то MRO для класса A будет определен как [A, B, D, C, E, object].
Это означает, что если существует метод, определенный в классе A и в одном из его родительских классов, то метод из класса A будет вызван, а не из его родительских классов.
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
Когда будет выполнена ветка else в конструкции try…except…else?
Ответ:
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
Ответ:
Ветка else в конструкции try ... except ... else будет выполнена только в том случае, если исключения не было возбуждено в блоке try.
Если в блоке try произошло исключение, то выполнение программы переходит к соответствующему блоку except, и ветка else пропускается. Если блок except не указан, то исключение будет
возбуждено дальше, а программа завершится с сообщением об ошибке.
a, b = map(int, input().split())
try:
print(a / b)
except:
print('Ошибка')
else:
print('Ошибки не было') # это выводится для любых чисел a, b, если b != 0
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Python — отличный инструмент, прежде всего из-за множества библиотек для работы с данными. Эта книга объединяет подробные описания таких библиотек, как IPython, NumPy, pandas, Matplotlib и Scikit-Learn.
Специалисты по обработке данных найдут здесь решения для обработки, преобразования и визуализации данных, а также для разработки статистических и машинных моделей. Книга является идеальным справочником по научным вычислениям в Python.
Please open Telegram to view this post
VIEW IN TELEGRAM
Каким будет результат следующего выражения?
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
len(' '.join(list(map(str, [0, 1]))))Внутреннее выражение map(str, [[0], [1]]) преобразует целые значения 0 и 1 в строки, в результате чего получается ['0', '1'].
Затем функция списка преобразует этот итератор в список.
Метод соединения соединяет элементы списка пробелом, в результате чего получается строка "0 1".
Наконец, функция len возвращает длину этой строки, которая равна 3. Вот и всё.
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯1
Как перезагрузить импортированный модуль?
Чтобы перезагрузить импортированный модуль в Python, вы можете использовать функцию reload() из модуля importlib.
Вот как это сделать:
from importlib import reload
import module_name
reload(module_name)
Замените module_name на фактическое имя модуля, который вы хотите перезагрузить.
Это может быть полезно при разработке и тестировании модулей, но не рекомендуется использовать в производственном коде без серьезных причин.
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
Вот как это сделать:
from importlib import reload
import module_name
reload(module_name)
Замените module_name на фактическое имя модуля, который вы хотите перезагрузить.
Это может быть полезно при разработке и тестировании модулей, но не рекомендуется использовать в производственном коде без серьезных причин.
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2🤯2
Как создать класс без слова class?
Kласс можно создать без использования ключевого слова class, используя типы type или metaclass.
Например, следующий код определяет класс MyClass без использования ключевого слова class:
MyClass = type('MyClass', (), {'x': 42, 'foo': lambda self: self.x})
Этот код эквивалентен определению класса с использованием ключевого слова class:
class MyClass:
x = 42
def foo(self):
return self.x
Оба определения класса эквивалентны и создают объект класса MyClass. Но, честно, использование ключевого слова class читабельнее, хотя где-нибудь может пригодиться и type с metaclass.
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
Например, следующий код определяет класс MyClass без использования ключевого слова class:
MyClass = type('MyClass', (), {'x': 42, 'foo': lambda self: self.x})
Этот код эквивалентен определению класса с использованием ключевого слова class:
class MyClass:
x = 42
def foo(self):
return self.x
Оба определения класса эквивалентны и создают объект класса MyClass. Но, честно, использование ключевого слова class читабельнее, хотя где-нибудь может пригодиться и type с metaclass.
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯3
Каким будет результат следующего выражения?
Ответ:
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
Ответ:
Супер простой вопрос, но, согласитесь, ошибиться возможно.
[0, 1][10:]
Выражение [0, 1][10:] возвращает пустой список [], так как срез [10:] означает извлечение элементов начиная с индекса 10 и до конца списка [0, 1], но таких элементов нет.
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2🤯1
Как итерировать словарь по парам ключ-значение
Ответ:
Метод словаря .items() возвращает генератор кортежей (key, value).
Если знали ответ — поставьте 🔥
Если нет — 🤯
➡️ Подготовка Python | #вопросы
Ответ:
Если знали ответ — поставьте 🔥
Если нет — 🤯
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2