CodeLab
145 subscribers
538 photos
20 videos
159 links
Говорим просто о сложном

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
1️⃣ *args и **kwargs

🔗 Как вы уже заметили, к звездочкам добавились имена args и kwargs.

🔗 Вот вам пример:

def my_function(a, *args):
print("a:", a)
print("args:", args)

my_function(1, 2, 3, 4) # args будет содержать (2, 3, 4)

# Вывод:

a: 1
args: (2, 3, 4)


Здесь, *args собирает все аргументы после первого a и сохраняет их в args в виде кортежа (2, 3, 4).

‼️ Теперь пример с **kwargs

def my_function(**kwargs):
print(kwargs)

my_function(name="Brovscki", age=25) # Вывод: {'name': 'Brovscki', 'age': 25}
my_function(city="Zalupinsk", country="USA") # Вывод: {'city': 'Zalupinsk', 'country': 'UK'}


**kwargs собирает все переданные именованные аргументы в словарь.

⁉️ Зачем нужны вообще эти имена?

Имена, такие как args и kwargs, нужны для того, чтобы у нас была переменная, через которую можно обращаться к собранным аргументам внутри функции.
8❤‍🔥31👍1🥰1🤯1
🧑‍💻 Всем доброе утро! Давно мы с вами не разбирали Алгоритмы (у нас даже есть навигация, но это по секрету)

🔗 С функциями разобрались базово, теперь можно перейти к такому элегантному методу решения задач, как Р Е К У Р С И Я

💬 Так, для начала разберемся, что это и для чего это нужно:

Рекурсия — это техника в программировании, при которой функция вызывает сама себя для решения подзадачи, которая является частью исходной задачи.


🔗 Рекурсивные функции состоят из двух частей: базового случая и рекурсивного случая. И вот вам пример из реальной жизни:

✔️ П Р И М Е Р

⚙️ Все мы знаем традиционную Русскую матрешку. Внутри самой большой находятся уменьшенные копии. Каждая матрешка открывается и обнаруживает внутри себя ещё одну, но меньшего размера. Этот процесс продолжается до тех пор, пока не останется самая маленькая матрёшка, которую уже открыть нельзя — это и есть базовый случай.

🟰Базовый случай — самая маленькая кукла, которую нельзя открыть.
🟰Рекурсивный случай — каждая кукла содержит в себе другую куклу.


🟰Базовый случай (условие выхода) — это условие, при котором функция завершает вызовы и возвращает результат, не вызывая себя снова. (Наша маленькая матрешка)
🟰Рекурсивный случай — это часть функции, где функция вызывает саму себя с другими параметрами, приближаясь к базовому случаю. (Каждая матрешка, кроме самой маленькой)
123🥰2👍1🤡1🤓1
This media is not supported in your browser
VIEW IN TELEGRAM
🧑‍💻 Возьмем простой пример — факториал числа:

5!=5×4×3×2×1=120 — факториал 5

🔗 Теперь выразим этот факториал в виде формулы — n!=n×(n−1)!

Теперь вспоминаем прошлый пост, где я говорил, что Базовый случай — это условие, при котором функция завершает вызовы и возвращает результат (снова она вызывать себя не будет)

⁉️ Что будет являться базовым случаем, если мы захотим реализовать функцию факториала с рекурсией?

💭 Ответ — 0 или 1
(Рекурсия разбивает задачи на подзадачи, но всегда есть предел, условие, после которого функция перестает работать)

🧑‍💻Теперь попробуем наши мысли скомпоновать:

def factorial(n):
# Базовый случай
if n == 0 or n == 1:
return 1
# Рекурсивный случай
else:
return n * factorial(n - 1)

print(factorial(5)) # Вывод: 120


0️⃣ Вызывается factorial(5) и так как
n != 0 и n != 1, функция возвращает 5 * factorial(4)


1️⃣ Вызывается factorial(4), функция возвращает 4 * factorial(3)

Далее происходят вызовы factorial(3) и factorial(2).
8❤‍🔥31🥰1🤓1
П Р О Д О Л Ж Е Н И Е

🧑‍💻2️⃣ На моменте, когда происходит вызов factorial(1), срабатывает базовый случай, и функция возвращает 1 (Это был пятый вызов)

🔗‼️3️⃣ После всего это начинается возврат значений, обратный процесс (так как рекурсивные вызовы завершатся и достигнут базового случая)

🟰4️⃣ Идем от обратного,четвертый вызов (Это был factorial(2)) получает результат 1 от factorial(1) и возвращает 2×1=2 (Короче, четвертый вызов получает результат от 5 и возвращает результат) — происходит это все согласно строчке:

return n * factorial(n - 1)


5️⃣⚙️ Третий вызов: factorial(3) получает результат 2 от factorial(2) и возвращает 3×2=6.

6️⃣🟰 Второй вызов: factorial(4), случай опять же не базовый, поэтому вызываем 4 * factorial(3), получаем 24

P.S (Надеюсь вы понимаете, что происходит)

7️⃣🟰 Первый вызов: factorial(5), получает 24 от второго вызова и умножает на 5, возвращая 120, это и будет наш ответ

P.S (Надеюсь вы понимаете, что происходит)

Строка return n * factorial(n - 1) запускает рекурсивный вызов и ждёт его результат. Как только factorial(n - 1) возвращает значение, это значение умножается на n, и результат поднимается обратно, возвращаясь вызову на уровень выше.
7❤‍🔥4👍21🤓1
🧑‍💻 Сегодня вам подготовил тестики по последним изученным темам, ниже будут задания и варианты ответов
__________
⬇️⬇️⬇️
❤‍🔥42🥰1🤯1🤓1
#1

numbers = [1, 2, 3]
result = ", ".join(str(num) for num in numbers)
print(result)
7❤‍🔥42👍1🤓1
👍4❤‍🔥21🤓1
#2

def sum_values(a, b, c):
return a + b + c

def wrapper(*args):
return sum_values(*args)

print(wrapper(5, 10, 15))
5👍41❤‍🔥1
#3

def calculate_sum(*args, **kwargs):
total = sum(args)
for key, value in kwargs.items():
total += value
return total

print(calculate_sum(1, 2, 3, num1=4, num2=5))
3🤯51❤‍🔥1🤓1
❤‍🔥4🤯31🤓1
#1

text = "Learn Python step by step"
result = text.split(" ", 3)
print(result)
8❤‍🔥31🥰1
#2

def Code_lab_func(a, b, *args, **kwargs):
result = a + b
for arg in args:
result += arg
for key in kwargs:
result += kwargs[key]
return result

print(Code_lab_func(1, 2, 3, 4, extra1=5, extra2=6.5))
4❤‍🔥41🥰1
❤‍🔥31🤯1👀1
🧑‍💻 Гайс, завтра разберем какой нибудь код или разберем прошлые вопросы (в любом случае, завтра будет нормальный пост)

#1

x = 5
def test():
global x
x += 1
return x

print(test())
6❤‍🔥4🥰1
❤‍🔥4👍1
#2

def func(a, b=5, *args, d=8, **kwargs):
return a + b + d

print(func(1, 2, 3, d=4, e=5))
3👨‍💻3🤡1
❤‍🔥3🤯1🤡1
🔗 Всем доброе утро! Сорянчик, что не выпускал посты, неделя выдалась тяжелой, поэтому дал время себе отдохнуть 🥱

Разбираем вот такой несложный код:
def sum_values(a, b, c):
return a + b + c

def wrapper(*args):
return sum_values(*args)

print(wrapper(5, 10, 15))


0️⃣ Как обычно объявляем функцию:

def sum_values(a, b, c):
return a + b + c


1️⃣ Объявляем вторую функцию 🟰wrapper()🟰. В виде аргумента будет 🟰*args🟰 (Позиционные аргументы, для тех, кто забыл → Сама функция *args передает произвольное количество аргументов в виде кортежа)

def wrapper(*args):
return sum_values(*args)


🔗 Во второй строчке мы как раз вызываем первую функцию 🟰sum_values()🟰 и с помощью *args переданные аргументы "передаются" в 🟰sum_values🟰

2️⃣ Дальше просто вызываем вторую функцию print(wrapper(5, 10, 15))
_______________________________

3️⃣ Кароч, вызвали мы wrapper(5, 10, 15) (5, 10, 15) — эти самые аргументы передаются в wrapper и собираются в кортеж args = (5, 10, 15) Внутри wrapper, когда мы вызываем 🟰sum_values(*args)🟰, кортеж (5, 10, 15) распаковывается, и sum_values получает три отдельных аргумента: a=5, b=10, и c=15 по итогам, sum_values вычисляет сумму: 5 + 10 + 15 = 30
15👍4❤‍🔥1🥰1🤯1
Создать отдельный канал для машинного обучения?
Anonymous Poll
59%
Да
35%
Нет
6%
Нет (да)
🤡8🤓2❤‍🔥1👎1