Внутри функции идет проверка, где мы в return'e возвращаем результат n + новый вызов функции rec(n-1) —> rec(2)
Операция повторяется и мы возвращаем результат n + rec(n-1) —> n + rec(1)
Заходим заново в функцию и возвращаем n + rec(0) —> теперь после вызова сработает return 1, т.к. if проверяет что n==0.
После чего, идем замыкать рекурсию в обратную сторону.
n + rec(0) —> 1 + 1 —> 2
n + rec(1) —> 2 + 2 —> 4
n + rec(2) —> 3 + 4 —> 7
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯13🔥5👍4👏2🤓1👀1
NamedTuple - это подтип кортежа, который позволяет объявлять собственные именованные типы, которые могут использоваться в качестве структуры данных. Он предоставляет возможность определить тип данных с помощью именованных полей. Каждое поле имеет свой собственный тип данных. Это может быть полезно в случаях, когда вам нужно создать объекты с определенными свойствами.
К примеру, если вы создаете объекты, представляющие собой записи в базе данных, вы можете использовать NamedTuple, чтобы создать тип данных, содержащий поля, соответствующие полям в таблице.
from collections import namedtupleИли например:
Person = namedtuple('Person', ['name', 'age'])
person1 = Person(name='John', age=30)
person2 = Person(name='Jane', age=25)
print(person1.name) # John
print(person2.age) # 25
from collections import namedtuple
Person = namedtuple('Person', 'name age')
person1 = Person('John', 30)
person2 = Person(name='Jane', age=25)
print(person1.name) # John
print(person2.age) # 25
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3🔥3🤔1
from collections import Counter
lst = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
counted_elements = Counter(lst)
print(counted_elements)
В результате выполнения этого кода мы получим следующий словарь:
{1: 1, 2: 2, 3: 3, 4: 4}
С помощью Collections Counter мы также можем переопределить элементы коллекции. Для этого необходимо создать объект Counter для исходной коллекции и передать новые значения с помощью метода update(). Рассмотрим пример:
from collections import Counter
lst = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
counted_elements = Counter(lst)
print(counted_elements)
counted_elements.update({2: 5, 5: 1})
print(counted_elements)
В результате выполнения этого кода мы получим следующий словарь:
{1: 1, 2: 2, 3: 3, 4: 4}
{1: 1, 2: 7, 3: 3, 4: 4, 5: 1}
Collections Counter также позволяет находить n наиболее часто встречающихся элементов в коллекции. Для этого необходимо использовать метод most_common(n), где n — количество наиболее часто встречающихся элементов, которые нужно найти. Рассмотрим пример:
from collections import Counter
lst = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
counted_elements = Counter(lst)
most_common_elements = counted_elements.most_common(2)
print(most_common_elements)
В результате выполнения этого кода мы получим следующий список:
[(4, 4), (3, 3)]
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🔥2
ORM позволяет программистам работать с базами данных, не взаимодействуя с ними напрямую. Вместо этого, ORM предоставляет программистам API, который позволяет им работать с данными, как если бы они были объектами в коде. ORM берет на себя задачу преобразования объектов в данные, которые могут быть сохранены в базе данных, и обратно.
Одним из главных преимуществ ORM является упрощение процесса разработки. ORM позволяет программистам сосредоточиться на разработке бизнес-логики, а не на взаимодействии с базами данных. Кроме того, ORM обеспечивает безопасность данных, так как предотвращает возможность SQL-инъекций. В целом, ORM делает процесс разработки более быстрым, эффективным и безопасным.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥4👍2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3🔥2
GIL - это блокировка, которая накладывается на интерпретатор Python, чтобы предотвратить одновременное выполнение Python-кода несколькими потоками. Все объекты Python имеют ссылки на них, которые хранятся в глобальном пространстве имен. GIL гарантирует, что только один поток может получить доступ к этому глобальному пространству имен в любой момент времени. Когда поток хочет выполнить Python-код, он должен получить эту блокировку. Если блокировка уже занята другим потоком, поток будет ожидать, пока блокировка не освободится. Когда блокировка освобождается, следующий поток может получить ее и продолжить выполнение Python-кода.
GIL может оказывать негативное влияние на производительность Python-программ. Это связано с тем, что только один поток может выполнять Python-код в любой момент времени. Если у вас есть множество потоков, которые ожидают доступа к GIL, это может привести к значительному снижению производительности вашей программы.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3🔥1
Цель хакатонов - это создание рабочих прототипов программных продуктов в короткие сроки. Это помогает разработчикам проверить, насколько их идеи реализуемы, и получить обратную связь от других участников и экспертов. Формат хакатонов очень разнообразен - от небольших встреч в офисах компаний до крупных соревнований, на которых участвуют сотни программистов. В любом случае, участники работают в командах, обычно состоящих из 3-5 человек, и имеют на выбор несколько тематик для работы.
Хакатоны предоставляют программистам множество возможностей для роста и развития. Во-первых, они могут помочь научиться работать в команде и улучшить свои навыки коммуникации и организации. Во-вторых, участники могут узнать много нового о технологиях и инструментах, которые используют другие участники. Наконец, вас могут заметить компании, либо за победу будет объявлен денежныц приз. Кроме того, хакатоны могут просто быть замечательной возможностью для поиска новых контактов и друзей в отрасли.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍6🔥1🤝1
1. Когда объект создается, он помещается в "кучу" (heap).
2. Когда объект больше не используется, сборщик мусора помечает его как "мусор".
3. Сборщик мусора периодически запускается и проверяет все объекты в куче.
4. Если объект помечен как "мусор", сборщик мусора удаляет его из памяти.
gc.collect().Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤3🔥1
В бинарном дереве узел является основным элементом. Каждый узел имеет данные и ссылки на левого и правого потомков. В Python мы можем создать узел, определив класс Node с инициализатором, который устанавливает данные и оба потомка.
class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
После того как узел определен, мы можем создать бинарное дерево. Начальный узел известен как корень. Мы создаем бинарное дерево, добавляя новые узлы в качестве левого или правого потомка корня или любого другого узла.
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
Обход - это процесс посещения каждого узла в дереве. Существуют различные методы обхода, включая прямой (Preorder), симметричный (Inorder) и обратный (Postorder) обход. В Python мы можем реализовать эти методы с помощью рекурсии или стеков.
Пример кода для прямого обхода:
def preorder_traversal(root):
if root:
print(root.data)
preorder_traversal(root.left)
preorder_traversal(root.right)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤5🔥1
Целые числа в Python занимают разное количество байт в зависимости от их значения. В Python 3 все целые числа являются объектами класса int. Этот класс использует переменную длину, что означает, что количество байт, необходимых для хранения целого числа, зависит от его значения и может быть любым.
Вещественные числа в Python занимают 8 байт. Это соответствует 64 битам двоичного числа с плавающей точкой стандарта IEEE 754.
Строки в Python занимают количество байт, равное количеству символов в строке, умноженному на размер каждого символа. В Python 3 по умолчанию используется кодировка Unicode, которая занимает 2 байта на символ, если символ может быть представлен в 16-битной форме, и 4 байта в противном случае.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤4🔥1
CI и CD - это два понятия, которые становятся все более популярными в сфере разработки программного обеспечения. Их основная цель - упростить процесс разработки, тестирования и доставки программного обеспечения. В этой статье мы рассмотрим, что такое CI и CD и как они работают.
CI - это сокращение от "Continuous Integration", что в переводе означает "непрерывная интеграция". Это процесс автоматической сборки и тестирования кода в репозитории каждый раз, когда происходит изменение в коде. Это позволяет быстро выявлять ошибки и устранять их, что делает процесс разработки более эффективным и быстрым.
CD - это сокращение от "Continuous Delivery" или "Continuous Deployment", что в переводе означает "непрерывная доставка" или "непрерывное развертывание". Это процесс автоматической доставки программного обеспечения в производственную среду после успешного прохождения всех тестов в процессе CI. Он позволяет быстро и надежно доставлять программное обеспечение в производственную среду, что сокращает время между разработкой и выпуском.
CI и CD работают вместе, чтобы ускорить и упростить процесс разработки программного обеспечения. Когда разработчик отправляет изменения в репозиторий, CI-система автоматически собирает и тестирует код. Если тесты проходят успешно, CD-система автоматически доставляет программное обеспечение в производственную среду. Это позволяет быстро и эффективно доставлять высококачественное программное обеспечение в производственную среду.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🔥1
1. Быстрая разработка - Django предоставляет множество готовых компонентов, что позволяет быстро создавать веб-приложения. Например, Django имеет встроенную систему аутентификации, которую можно использовать для регистрации и авторизации пользователей без необходимости разработки этой функциональности с нуля.
2. Безопасность - Django предоставляет множество инструментов для обеспечения безопасности веб-приложений. Это включает в себя защиту от CSRF-атак, SQL-инъекций и других видов атак на веб-приложения.
3. Масштабируемость - Django позволяет легко масштабировать веб-приложения. Это может быть особенно полезно для больших проектов, которые нуждаются в масштабировании для обработки большого количества пользователей.
1. Сложность - хотя Django предоставляет множество готовых компонентов, изучение фреймворка может быть сложным, особенно для новичков в веб-разработке. Django имеет свой собственный способ работы с запросами и базами данных, который может отличаться от других фреймворков.
2. Ограничения при создании пользовательского интерфейса - Django не является лучшим инструментом для создания сложных пользовательских интерфейсов. Он предоставляет базовые инструменты для создания интерфейса, но, если вам нужно что-то более сложное, вам может прийтись использовать другие инструменты.
3. Сложность в обработке асинхронных запросов - Django не обрабатывает асинхронные запросы так же легко, как другие фреймворки. Если вы работаете с приложением, которое требует обработки большого количества асинхронных запросов, вам может прийтись использовать другие инструменты.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍6🔥1
Декларативное программирование - это подход к написанию кода, в котором программа описывает желаемый результат, а не способ его достижения. В декларативном программировании вы описываете, что должно произойти, а не как это должно произойти. Это означает, что вы не указываете последовательность шагов, которые должны быть выполнены, а вместо этого указываете, какой результат вы хотите получить.
Одним из преимуществ декларативного программирования является то, что код может быть проще для понимания и сопровождения. Также декларативный подход может быть более выразительным, поскольку он позволяет описывать более сложные операции и структуры.
Императивное программирование - это подход к написанию кода, в котором программа описывает последовательность шагов, необходимых для достижения желаемого результата. В императивном программировании вы описываете, как нужно выполнить задачу, а не только то, что должно получиться в результате.
Одним из преимуществ императивного программирования является то, что вы можете более точно контролировать процесс выполнения программы. Это означает, что вы можете управлять памятью, производительностью и другими аспектами выполнения программы.
Основное различие между декларативным и императивным программированием заключается в том, как программа описывает желаемый результат. В декларативном программировании программа описывает желаемый результат, а в императивном - последовательность шагов, необходимых для достижения желаемого результата.
Другое отличие заключается в том, что декларативное программирование более абстрактно, поскольку оно описывает желаемый результат, а не конкретный способ его достижения. Императивное программирование более конкретно, поскольку оно описывает последовательность шагов, которые должны быть выполнены.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔6❤4👍2🔥1🥰1
Декларативное программирование - это стиль программирования, который сосредотачивается на "что", а не на "как" программы. Он включает в себя указание желаемого вывода программы без указания того, как его достичь. В Python одним из примеров декларативного программирования является использование генераторов списков.
numbers = [1, 2, 3, 4, 5]В этом примере мы объявляем, что мы хотим создать список квадратов от 1 до 5. Мы не указываем, как достичь этого вывода. Генераторы списков в Python заботятся об этом за нас.
squares = [num ** 2 for num in numbers]
Императивное программирование - это стиль программирования, который сосредотачивается на "как" программы. Он включает в себя указание последовательных инструкций для достижения желаемого вывода. В Python одним из примеров императивного программирования является использование цикла for.
numbers = [1, 2, 3, 4, 5]В этом примере мы указываем, как достичь желаемого вывода, создав список квадратов от 1 до 5. Мы используем цикл for для итерации по каждому числу и добавляем его квадрат в новый список.
squares = []
for num in numbers:
squares.append(num ** 2)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤4🔥2
🤔11😢3🤨3👍1
Переданные параметры никак не влияют на ответ, важно только их количество.
Важно помнить, что self принимает в себя сам объект. Если вызов идет через объект, то self передается автоматически.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯11❤7🔥3🤓2👍1👀1