Множественное наследование - это когда класс наследуется от нескольких базовых классов. Это означает, что класс-потомок получает свойства и методы от всех своих базовых классов.
Пример использования множественного наследования в Python:
class A:
def method_a(self):
print("Method A")
class B:
def method_b(self):
print("Method B")
class C(A, B):
def method_c(self):
print("Method C")
obj_c = C()
obj_c.method_a() # Output: Method A
obj_c.method_b() # Output: Method B
obj_c.method_c() # Output: Method C
В этом примере классы A и B являются базовыми классами для класса C. Класс C получает свойства и методы от классов A и B, и может использовать их в своих собственных методах.
Множественное наследование может быть полезно, когда вам нужно использовать свойства и методы из разных классов, чтобы создать новый класс с уникальным поведением. Однако, когда используется множественное наследование, может возникать проблема "алмазного наследования", когда два базовых класса оба имеют одноименный метод, что может привести к неоднозначности и ошибкам в коде.
Если такая проблема возникает, то рекомендуется пользоваться композицией вместо множественного наследования.
Композиция - это когда вы создаете класс, включающий в себя другие классы в качестве своих атрибутов. Для примера, класс может иметь атрибут объекта класса вместо наследования от этого класса.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Method Resolution Order (MRO) — это порядок, в котором интерпретатор ищет методы при множественном наследовании.
MRO описывает, как Python разрешает методы, вызываемые по наследству. Он определяет порядок, в котором функции и методы с одинаковыми именами в базовых классах располагаются при поиске.
По умолчанию Python использует алгоритм C3 линеаризации, чтобы вычислить MRO.
Этот алгоритм гарантирует, что при следовании MRO будут учитываться все исходные порядки, сохраняя при этом их локальный порядок.
MRO является важной концепцией множественного наследования в Python, и его понимание необходимо для эффективного использования этого языка.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
В Linux можно найти идентификатор процесса (PID) с помощью утилиты ps.
Вы можете использовать команду ps aux | grep process_name для поиска процесса по его имени и показа его PID. Например:
ps aux | grep firefox
Это покажет все запущенные процессы Firefox, их PID и другую информацию.
Вы также можете использовать утилиту top, чтобы увидеть запущенные процессы и их PID. Команда top покажет текущую нагрузку на систему и список всех процессов, запущенных в данный момент. Она также отображает информацию о каждом процессе, включая его PID, процент использования процессора и использование памяти.
Чтобы узнать, сколько ресурсов занимает процесс, вы можете использовать утилиту ps. Команда ps отображает информацию о процессах, включая использование памяти. Вы можете использовать команду ps -p pid -o %cpu,%mem для показа процессорного и памятевого использования определенного процесса. Например:
ps -p 1234 -o %cpu,%mem
Это вернет процент использования процессора и памяти для процесса с PID 1234.
Если вы хотите увидеть более подробную информацию о процессах, вы можете использовать команду top.
В top вы можете сортировать процессы по использованию процессора или памяти, чтобы найти наиболее интенсивно использующий ресурсы процесс.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Есть то, что объединяет всех разработчиков, неважно, на Python вы пишите или на чём-то ещё — это понимание git
Держите мощный туториал по системе контроля версий git и о его реализации на примере GitHub.
Самое то, если только разбираетесь с этим, да и для GitHub-гуру подойдёт, освежить основные понятия не помешает.
Некоторые факты из статьи:
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
words = ["Авто", "Велосипед", "Самолет"]
И такая строка:
st = "Быстрый автомобиль"
Нужно вернуть
True
, т.к. в строке есть слово "авто"
из списка.def is_part_in_list(st, words):
for word in words:
if word.lower() in st.lower():
return True
return False
print(is_part_in_list(st, words))
print(any(word.lower() in st.lower() for word in words))
print(any(map(text.lower().__contains__, map(st.lower, words))))
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Для проверки утечки памяти в Linux можно использовать утилиту Valgrind.
Она предназначена для отладки программ, написанных на C, C++ и других языках, и позволяет обнаруживать утечки памяти, ошибки использования указателей и другие проблемы.
Для использования Valgrind в Python необходимо установить пакет memcheck-3.4.1 (или более новую версию) и запустить интерпретатор Python с помощью утилиты Valgrind. Например:
valgrind --tool=memcheck --leak-check=yes python myscript.py
Это запустит скрипт myscript.py под управлением Valgrind и выведет отчет о возможных утечках памяти и других проблемах.
Также можно использовать модуль Python tracemalloc, который позволяет отслеживать использование памяти в Python и выводить отладочную информацию. Пример использования:
import tracemalloc
tracemalloc.start() # начало трассировки памяти
# ваш код
snapshot = tracemalloc.take_snapshot() # текущее состояние памяти
top_stats = snapshot.statistics('lineno')
print("[ Top 10 ]")
for stat in top_stats[:10]:
print(stat)
Это выведет топ-10 участков кода с наибольшим использованием памяти. Однако, обратите внимание, что использование tracemalloc может снизить производительность программы и требует дополнительной обработки кода.
@linuxacademiya
Please open Telegram to view this post
VIEW IN TELEGRAM
expr_str = "[1, 2, 3, 4]"
Как эту строку можно преобразовать в список?
Вот, аж целых четыре способа
from ast import literal_eval
res = literal_eval(expr_str)
import json
res = json.loads(expr_str)
import yaml
res = yaml.safe_load(expr_str)
res = [int(i) for i in re.findall('\d+', expr_str)]
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Итак, задача: напишите функцию, которая принимает на вход несортированный связный список и удаляет из него все дубликаты.
Задачу можно решить как минимум 2 способами
def remove_duplicates(first):
if not first:
return
nextone = first
while nextone:
runner = nextone
while runner.next:
if runner.next.val == nextone.val:
runner.next = runner.next.next
else:
runner = runner.next
nextone = nextone.next
return first
Функция
remove_duplicates
принимает на вход один аргумент first
, в который мы передаем начало списка.Далее создаем переменную
nextone
, которая инициализируется значением first
. nextone
используем для перемещения по списку, она указывает на текущий элемент. То есть эта переменная является первым указателем. Переменная runner
— второй указатель. Этот подход к удалению дубликатов в связанном списке использует хеш-таблицу, чтобы отслеживать пройденные уникальные значения.
def remove_duplicates(list_head):
if not list_head:
return
seen = set()
current = list_head
prev = None
while current:
if current.val in seen:
prev.next = current.next
else:
seen.add(current.val)
prev = current
current = current.next
return list_head
Функция
remove_duplicates
принимает на вход один аргумент list_head
, в который мы передаем начало списка. Она проверяет, пуст ли список. Если да, она возвращает результат и завершает работу. Если в списке содержится хотя бы один элемент, функция начинает их обрабатывать.Далее создаем множество
seen
, которое будем использовать для отслеживания уникальных значений связанного списка. Подробнее
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Как можно написать этот код?
def check(string):
brackets_open = ('(', '[', '{', '<')
brackets_closed = (')', ']', '}', '>')
stack = []
for i in string:
if i in brackets_open:
stack.append(i)
if i in brackets_closed:
if len(stack) == 0:
return False
index = brackets_closed.index(i)
open_bracket = brackets_open[index]
if stack[-1] == open_bracket:
stack = stack[:-1]
else: return False
return (not stack)
Проверяем, как работает:
str1 = '[{([[[<>]]])(<>)(){}}]'
str2 = ']()(){<>}[[()]]'
print(check(str1)) #True
print(check(str2)) #False
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
В Python и итераторы, и генераторы позволяют перебирать элементы коллекций, но работают немного по-разному.
__iter__()
и __next__()
. Метод __iter__()
возвращает сам итератор, а __next__()
— следующий элемент коллекции. Если элементы заканчиваются, __next__()
должен вызвать исключение StopIteration
. Итераторы позволяют явно перебирать элементы коллекции, не требуя, чтобы все элементы были доступны в памяти одновременно.yield
. Главное отличие генератора заключается в том, что значения генерируются по требованию. Каждый раз, когда генератор достигает yield
, он возвращает значение и «замирает», сохраняя своё состояние до следующего вызова. Это позволяет использовать меньше памяти при итерации по длинным последовательностям.#вопросы_с_собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM
🔎 С помощью каких инструментов можно выполнить статический анализ кода?
Для статического анализа кода есть несколько инструментов:
Pylint - это инструмент, который анализирует исходный код на соответствие PEP8, а также предупреждает о потенциальных ошибках в коде.
Flake8 - это комбинированный инструмент, который объединяет в себе Pylint, PyFlakes и множество других правил, обеспечивающих соответствие стиля написания кода и обнаруживающих ошибки в исходном коде.
Mypy - это статический типизатор для Python, который позволяет находить ошибки в типах переменных в исходном коде.
Bandit - это инструмент для поиска уязвимостей в исходном коде Python.
Black - это инструмент для автоматического форматирования кода Python, который придерживается только одного стиля написания кода.
Pycodestyle — это простая консольная утилита для анализа кода Python, а именно для проверки кода на соответствие PEP8. Один из старейших анализаторов кода, до 2016 года носил название pep8, но был переименован по просьбе создателя языка Python Гвидо ван Россума.
Vulture — это небольшая утилита для поиска “мертвого” кода в программах Python. Она использует модуль ast стандартной библиотеки и создает абстрактные синтаксические деревья для всех файлов исходного кода в проекте. Далее осуществляется поиск всех объектов, которые были определены, но не используются. Vulture полезно применять для очистки и нахождения ошибок в больших базовых кодах.
Эти инструменты могут улучшить качество кода, облегчить его чтение и поддержку, а также помочь избежать ошибок, связанных с типами переменных и уязвимостями безопасности.
Пишите в комментариях, какие инструменты анализа кода используете вы 👇
@python_job_interview
Для статического анализа кода есть несколько инструментов:
Pylint - это инструмент, который анализирует исходный код на соответствие PEP8, а также предупреждает о потенциальных ошибках в коде.
Flake8 - это комбинированный инструмент, который объединяет в себе Pylint, PyFlakes и множество других правил, обеспечивающих соответствие стиля написания кода и обнаруживающих ошибки в исходном коде.
Mypy - это статический типизатор для Python, который позволяет находить ошибки в типах переменных в исходном коде.
Bandit - это инструмент для поиска уязвимостей в исходном коде Python.
Black - это инструмент для автоматического форматирования кода Python, который придерживается только одного стиля написания кода.
Pycodestyle — это простая консольная утилита для анализа кода Python, а именно для проверки кода на соответствие PEP8. Один из старейших анализаторов кода, до 2016 года носил название pep8, но был переименован по просьбе создателя языка Python Гвидо ван Россума.
Vulture — это небольшая утилита для поиска “мертвого” кода в программах Python. Она использует модуль ast стандартной библиотеки и создает абстрактные синтаксические деревья для всех файлов исходного кода в проекте. Далее осуществляется поиск всех объектов, которые были определены, но не используются. Vulture полезно применять для очистки и нахождения ошибок в больших базовых кодах.
Эти инструменты могут улучшить качество кода, облегчить его чтение и поддержку, а также помочь избежать ошибок, связанных с типами переменных и уязвимостями безопасности.
Пишите в комментариях, какие инструменты анализа кода используете вы 👇
@python_job_interview
Для упаковки бинарных зависимостей в проект следует использовать менеджеры пакетов. Для Python наиболее распространены pip и conda. Для Java - Maven или Gradle.
Пример для Python с использованием pip:
Установите необходимые библиотеки и зависимости в проекте:
pip install requests numpy pandas
Создайте файл requirements.txt с полным списком зависимостей:
requests
numpy
pandas
Упакуйте зависимости в архив:
pip freeze > requirements.txt
Можно передать файл
requirements.txt
другим пользователям вашего проекта, которые могут установить все зависимости одной командой:pip install -r requirements.txt
Для упаковки бинарных зависимостей можно использовать инструмент wheel. Wheel-файлы - это zip-архивы, содержащие установочные файлы для Python-пакетов, и могут содержать бинарные расширения (например, скомпилированные модули C), которые необходимо собрать и установить на целевой машине.
Для создания wheel-файла для Python-пакета можно использовать команду pip wheel. Например, если есть файл с требованиями
requirements.txt,
содержащий список зависимостей вашего проекта, можете создать wheel-файлы для всех зависимостей с помощью следующей команды:pip wheel -r requirements.txt
Вы также можете установить wheel-файлы с помощью pip install, указав имя файла:
pip install mypackage-1.0.0-py3-none-any.whl
Таким образом, вы можете создавать и распространять бинарные зависимости в виде wheel-файлов и использовать их при установке пакетов на других устройствах.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Периодически на собеседованиях попадаются задачи с похожей формулировкой.
def find_all_keys(input_dict: dict) -> list:
result = []
for key, val in input_dict.items():
if key.startswith('description'):
result.append(val)
if isinstance(val, dict):
result.extend(find_all_keys(val))
return result
Функция перебирает все элементы словаря и либо кладет его в новый словарь с результатами, если есть совпадение с искомым, либо запускает сама себя для элементов, представляющие собой так же словарь. На выходе получается массив найденных значений.
data = yaml.safe_load(Path(sys.argv[1]).read_text())
descriptions = find_all_keys(data)
Ну вот, теперь на одну проблемную задачу меньше)
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Держите большой список из 98 вопросов по Python и немного по смежным штукам типо Git, SQL.
Вопросы есть простые и не очень, вот некоторые из них:
• Чем файл
.pyc
отличается от .py
• Что такое GIL
• Будет ли возвращать что-то функция без
return
?• Что такое миксины
• Сколько может быть родителей и наследников у класса
• Что такое json, xml
• Какой паттерн программирования реализует Django
• Что такое JOIN и какой он может быть
• Метаклассы в Python
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Держите 36 вопросов с ответами по Python + вопросы по Computer Science, Django, по базам данных и не только.
Успешных собеседований)
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Machine learning Interview
▪Смотреть
▪Данные
▪Ноутбук
@machinelearning_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Эти вопросы покрывают практически все темы Python + затрагивают азы Computer Science: алгоритмы, структуры данных и т.д.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM