🧑💻 Вот и готов наш код, завтра допишу навигацию, чтобы вы с кайфом могли с этим всем разобраться:
def student_data():
students = {}
while True:
name = input("Введите имя студента, или 'стоп' для завершения ввода: ")
if name.lower() == 'стоп':
break
try:
grades = list(map(float, input(f"Введите оценки для {name} через пробел: ").split()))
students[name] = grades
except ValueError:
print("ERROR")
return students
def calculate_average(grades):
return sum(grades) / len(grades) if grades else 0
def get_top_students(students, threshold):
return {name: average_rating for name, average_rating in students.items() if average_rating > threshold}
def print_top_student(students):
if not students:
print("Нет данных о студентах.")
return
top_student = max(students, key=students.get)
print(f"Студент с наивысшим средним баллом: {top_student} ({students[top_student]:.2f})")
def main():
while True:
students = student_data()
if not students:
print("Нет данных для анализа.")
continue
student_averages = {name: calculate_average(grades) for name, grades in students.items()}
print("\nСредний балл студентов:")
for name, average_rating in student_averages.items():
print(f"{name}: {average_rating:.2f}")
threshold = float(input("\nВведите порог для вывода студентов с баллом выше: "))
top_students = get_top_students(student_averages, threshold)
if top_students:
print("\nСтуденты с баллом выше порога:")
for name, average_rating in top_students.items():
print(f"{name}: {average_rating:.2f}")
else:
print("Нет студентов с баллом выше порога.")
print_top_student(student_averages)
repeat = input("\nХотите ввести данные заново? (да/нет): ").lower()
if repeat != 'да':
print("Программа завершена.")
break
main()
14❤🔥2🤯2👍1🤓1👨💻1
Как то пару дней назад я делал тест с такой функцией, давайте быстренько ее разберем:
0️⃣ Для начала объявим функцию 🟰
1️⃣ Внутри 'внешней функции' будет находиться
2️⃣ После того, как мы объявили функцию
3️⃣ Кароч, чтобы было понятно: мы передаем аргумент n = 4 в 🟰
Тройка передается в multiply и становится значением x. Ну, тут точно также как с четверкой, 3 * 3 = 9. Два результата складываются и получаем 25
def func_1(n):
def multiply(x):
return x * x
return multiply(n) + multiply(n - 1)
result = func_1(4)
print(result)
0️⃣ Для начала объявим функцию 🟰
def func_1(n):🟰‼️ Как раз туда мы и передадим аргумент 4 1️⃣ Внутри 'внешней функции' будет находиться
🟰def multiply(x):🟰, она будет возвращать квадрат числа (x * x). 2️⃣ После того, как мы объявили функцию
🟰def multiply(x):🟰, во 'внешнюю' функцию 🟰def func_1(n):🟰 возвращается сумма двух вызовов multiply return multiply(n) + multiply(n - 1)
3️⃣ Кароч, чтобы было понятно: мы передаем аргумент n = 4 в 🟰
func_1🟰 → затем, в функции 🟰func_1🟰 определена функция 🟰multiply(x)🟰, при ее вызове мы как раз передаем аргумент x → воот, внутри функции multiply, x = 4 (‼️Потому что n — это просто переменная func_1, которую мы передаем в multiply как аргумент x, когда вызываем multiply(n)‼️), → x * x даст 4 * 4 = 16 → multiply(n - 1) — это вызов multiply(3). Тройка передается в multiply и становится значением x. Ну, тут точно также как с четверкой, 3 * 3 = 9. Два результата складываются и получаем 25
19❤🔥3❤1🥰1
CodeLab
⚙️ Итак, здарова работяги, ща рассмотрим пример из книги: 👨💻Сам пример посложнее, мы можем близко предсказать, но вот с точностью могут быть проблемы. 🔗 Таблица показывает данные о домах с разным количеством комнат и их ценах. ⭕️ Цена дома напрямую зависит…
🧑💻 Так, продолжаем машинку, завтра мб выложу тесты)
Помните мы написали формулу цена=100+50×количество комнат+небольшое расхождение.
⭕️ Когда мы говорим, что наклон
прямой равен 50, это означает, что каждый раз, добавляя в дом одну комнату, мы вычисляем, что цена дома вырастет на 50 долларов. Когда говорим, что y-пересечение прямой равно 100, это означает, что стоимость гипотетического
дома с нулевым количеством комнат базовая — 100 долларов.
Помните мы написали формулу цена=100+50×количество комнат+небольшое расхождение.
⭕️ Когда мы говорим, что наклон
прямой равен 50, это означает, что каждый раз, добавляя в дом одну комнату, мы вычисляем, что цена дома вырастет на 50 долларов. Когда говорим, что y-пересечение прямой равно 100, это означает, что стоимость гипотетического
дома с нулевым количеством комнат базовая — 100 долларов.
4❤🔥2🥰1
CodeLab
🔗 Начнем сразу с примера: 🔗 Абсолютно каждому подписчику этого великого канала будет ясно, что вместо вопросиков будет число 4500. Отсюда можем вывести формулу нахождения каждого последующего значения: ⚙️ Продажи = 5 × Реклама + 1500 Отлично, теперь разберемся…
‼️ Я советую также повторить все эти посты для понимания того, что мы делаем.
🤓3❤🔥2
🟰Алгоритм линейной регрессии🟰
Немного теории, которая нам пригодится:
🔗 Входные данные — набор точек на плоскости.
🔗 Результат — прямая, проходящая близко к точкам
🔗 Процедура — выбираем случайную прямую → выбираем случайную точку данных → перемещаем прямую немного ближе к ней ( повторяем это )
🔗 Возврат — полученная прямая
p — цена дома в наборе данных;
Y — прогнозируемая цена дома;
r — количество комнат;
m — цена за комнату;
b — базовая цена за дом.
Теперь формула:
🟰Y = mr + b🟰 — прогнозируемая цена = цена за комнату × количество комнат + базовая цена дома
⭕️ Допустим, цена за комнату — 50000, у нас 3 комнаты в доме, а базовая цена 200000, как мог бы выглядеть код:
Немного теории, которая нам пригодится:
🔗 Входные данные — набор точек на плоскости.
🔗 Результат — прямая, проходящая близко к точкам
🔗 Процедура — выбираем случайную прямую → выбираем случайную точку данных → перемещаем прямую немного ближе к ней ( повторяем это )
🔗 Возврат — полученная прямая
p — цена дома в наборе данных;
Y — прогнозируемая цена дома;
r — количество комнат;
m — цена за комнату;
b — базовая цена за дом.
Теперь формула:
🟰Y = mr + b🟰 — прогнозируемая цена = цена за комнату × количество комнат + базовая цена дома
⭕️ Допустим, цена за комнату — 50000, у нас 3 комнаты в доме, а базовая цена 200000, как мог бы выглядеть код:
def predict_price(m, r, b):
return m * r + b
price_per_room = 50000
number_of_rooms = 3
base_price = 200000
predicted_price = predict_price(price_per_room, number_of_rooms, base_price)
print(f"Прогнозируемая цена дома: ${predicted_price}")
5❤🔥2👍1🤓1👨💻1
def multiply(a = 2, b=7):
return a * b
result = multiply(3) print(result)
return a * b
result = multiply(3) print(result)
Anonymous Quiz
19%
3
0%
6
6%
7
0%
24
56%
21
19%
14
❤🔥2🤓2
Опрос будет внизу под постом 👇🏻
def func(x):
return x + 5
def main():
return func(5) + func(10)
print(main())
3❤🔥2👨💻1
🧑💻 Всем ку, разберем небольшой код с утра:
📈 Итак, в чем суть, у нас есть строка "aaabbvvvvccd", а мы будем должны ее сократить как то так -- a3b2v4c2d1
0️⃣ Объявим функцию для начала
1️⃣ Создадим список (туда будем заносить измененные строчки) и счетчик (для подсчета повторяющихся букв):
2️⃣🔗 Теперь основной цикл:
3️⃣⚙️ Иначе:
4️⃣🔗 После завершения цикла мы добавляем последний символ и его количество в список (последний символ не будет обработан в цикле)
🔗Весь код:
📈 Итак, в чем суть, у нас есть строка "aaabbvvvvccd", а мы будем должны ее сократить как то так -- a3b2v4c2d1
0️⃣ Объявим функцию для начала
def compress_string(s): и проверим строку на наличие символов. Типо если строка s пустая, функция возвращает пустую строку. def compress_string(s):
if not s:
return " "
1️⃣ Создадим список (туда будем заносить измененные строчки) и счетчик (для подсчета повторяющихся букв):
listt = []
count = 1
2️⃣🔗 Теперь основной цикл:
for i in range(1, len(s)): # Мы начинаем с индекса 1 (у нас это второй символ) и проходим по всей строке до конца
if s[i] == s[i - 1]: # Если текущий равен предыдущему:
count += 1 # Увеличиваем счетчик на 1
3️⃣⚙️ Иначе:
else:
listt.append(s[i - 1] + str(count)) #Если текущий символ не равен предыдущему, последовательность закончилась. Это значит, что вся строка добавляет в список listt[] строку, состоящую из символа и его количества (как раз то, что нам нужно)
count = 1 # Обновляем счетчик, чтобы начать подсчет для новой буквы
4️⃣🔗 После завершения цикла мы добавляем последний символ и его количество в список (последний символ не будет обработан в цикле)
listt.append(s[-1] + str(count)) # Мы соединяем все элементы в списке listt в одну строку с помощью ''.join(listt) и возвращаем результат
return ''.join(listt) # Об этом поговорим еще сегодня
print(compress_string("aaabbvvvvccd"))🔗Весь код:
def compress_string(s):
if not s:
return " "
listt = []
count = 1
for i in range(1, len(s)):
if s[i] == s[i - 1]:
count += 1
else:
listt.append(s[i - 1] + str(count))
count = 1
listt.append(s[-1] + str(count))
return ''.join(listt)
print(compress_string("aaabbvvvvccd"))
7❤🔥2🥰1🤯1🤡1👨💻1
🧑💻 #1 Выполним несколько тестов
def func(a, *args, **kwargs):
print(a, args, kwargs)
func(1, 2, 3, x=4, y=5)
1❤🔥2👍1🤓1
Да, знаю, что мы это не проходили, завтра разберемся) Хотя, если среди вас есть те, кто шарит, смело объясняйте в коментах
Anonymous Quiz
33%
1 (2, 3) {'x': 4, 'y': 5}
40%
1 [2, 3] {'x': 4, 'y': 5}
27%
1 (2, 3, {'x': 4, 'y': 5})
0%
2 (1, 3, {'x': 4, 'y': 5})
❤🔥2❤1👍1🥰1
#2 🌶
def func(x, y=[]):
y.append(x)
return y
list1 = func(1)
list2 = func(2, [])
list3 = func(3)
print(list1, list2, list3)
1❤🔥2❤1👍1👀1
Какой будет ответ? (Завтра также разберем)
Anonymous Quiz
43%
[1] [2] [3]
29%
[1, 3] [2] [1, 3]
21%
[1] [2] [1, 3]
7%
[1, 2, 3] [1, 2, 3] [1, 2, 3]
❤🔥2❤1👍1🥰1
🧑💻 Всем добрый вечер гайс
🔗 Как и говорил, рассмотрим метод join(). Этот метод используется в Python для объединения списка строк в одну строку с использованием указанного разделителя.
🔗 Использование другого разделителя (запятая и пробел):
🔗 Также есть случаи, когда элементы последовательности не являются строками, в таком случае приводим их к нужному типу данных.
🔗 Как и говорил, рассмотрим метод join(). Этот метод используется в Python для объединения списка строк в одну строку с использованием указанного разделителя.
words = ["Hello", "Code", "Lab", "is", "awesome"]
result = " ".join(words)
print(result) # Вывод: "Hello Code Lab is awesome"
🔗 Использование другого разделителя (запятая и пробел):
fruits = ["Hello", "Code", "Lab", "is", "awesome"]
result = ", ".join(fruits)
print(result) # Вывод: "Hello, Code, Lab, is, awesome"
🔗 Также есть случаи, когда элементы последовательности не являются строками, в таком случае приводим их к нужному типу данных.
numbers = [1, 2, 3]
result = "-".join(map(str, numbers))
print(result) # Вывод: "1-2-3"
1❤🔥2🤯1🤡1🤓1
🧑💻Всем ку, сейчас разберем вот такую функцию ↓
🔗 Как раз постараемся понять что такое этот ваш **кваргс и *аргс
0️⃣ Ну для начала базировано объявляем функцию:
⚙️ Из аргументов у нас есть a (обычный аргумент, мы их обычно и передаем в других примерах), *args (Позиционные аргументы) и **kwargs (Именованные аргументы) — сейчас со всем разберемся
Для начала, разберемся с таким оператором как 🟰
⁉️ Че он делает? Он буквально распаковывает элементы из коллекций (у нас это списки, кортежи или множества)
💬 — Мысль не моя, но автор статьи пояснил очень неплохо, вот вам пример:
📊 Вот еще пример, но уже с нашей любимой функцией:
‼️ Если вы подумали, что на одной звездочке все закончится, как бы не так)
🔗 Ведь существует оператор 🟰
🔗 Как раз постараемся понять что такое этот ваш **кваргс и *аргс
def func(a, *args, **kwargs):
print(a, args, kwargs)
func(1, 2, 3, x=4, y=5)
0️⃣ Ну для начала базировано объявляем функцию:
⚙️ Из аргументов у нас есть a (обычный аргумент, мы их обычно и передаем в других примерах), *args (Позиционные аргументы) и **kwargs (Именованные аргументы) — сейчас со всем разберемся
def func(a, *args, **kwargs):
Для начала, разберемся с таким оператором как 🟰
* 🟰⁉️ Че он делает? Он буквально распаковывает элементы из коллекций (у нас это списки, кортежи или множества)
"Я могу описать его как оператор расширения, распаковывающий наборы домино, чтобы потом выстроить из них одну единую огромную последовательность."
💬 — Мысль не моя, но автор статьи пояснил очень неплохо, вот вам пример:
a = [1,2,3]
b = [*a,4,5,6] # мы берем содержимое списка a и распаковываем его в новый список b
print(b) # [1,2,3,4,5,6]
📊 Вот еще пример, но уже с нашей любимой функцией:
def func(x, y, z):
return x + y + z
numbers = [1, 2, 3]
result = func(*numbers) # Распаковываем список в отдельные аргументы
print(result) # Вывод: 6
‼️ Если вы подумали, что на одной звездочке все закончится, как бы не так)
🔗 Ведь существует оператор 🟰
** 🟰. Нужен он для распаковки словарей, превращая пары ключ-значение в отдельные именованные аргументы: data = {'name': 'Brovscki', 'age': 21}
def greeting(name, age):
print(f"Hello, {name}! You are {age} years old.")
greeting(**data) # Вывод: Hello, Brovscki! You are 21 years old7❤🔥3👍2❤1🤓1👀1
This media is not supported in your browser
VIEW IN TELEGRAM
1️⃣ *args и **kwargs
🔗 Как вы уже заметили, к звездочкам добавились имена args и kwargs.
🔗 Вот вам пример:
Здесь, *args собирает все аргументы после первого a и сохраняет их в args в виде кортежа (2, 3, 4).
‼️ Теперь пример с **kwargs
**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❤🔥3❤1👍1🥰1🤯1
🧑💻 Всем доброе утро! Давно мы с вами не разбирали Алгоритмы (у нас даже есть навигация, но это по секрету)
🔗 С функциями разобрались базово, теперь можно перейти к такому элегантному методу решения задач, как Р Е К У Р С И Я
💬 Так, для начала разберемся, что это и для чего это нужно:
🔗 Рекурсивные функции состоят из двух частей: базового случая и рекурсивного случая. И вот вам пример из реальной жизни:
✔️ П Р И М Е Р
⚙️ Все мы знаем традиционную Русскую матрешку. Внутри самой большой находятся уменьшенные копии. Каждая матрешка открывается и обнаруживает внутри себя ещё одну, но меньшего размера. Этот процесс продолжается до тех пор, пока не останется самая маленькая матрёшка, которую уже открыть нельзя — это и есть базовый случай.
🟰Базовый случай — самая маленькая кукла, которую нельзя открыть.
🟰Рекурсивный случай — каждая кукла содержит в себе другую куклу.
🟰Базовый случай (условие выхода) — это условие, при котором функция завершает вызовы и возвращает результат, не вызывая себя снова. (Наша маленькая матрешка)
🟰Рекурсивный случай — это часть функции, где функция вызывает саму себя с другими параметрами, приближаясь к базовому случаю. (Каждая матрешка, кроме самой маленькой)
🔗 С функциями разобрались базово, теперь можно перейти к такому элегантному методу решения задач, как Р Е К У Р С И Я
💬 Так, для начала разберемся, что это и для чего это нужно:
Рекурсия — это техника в программировании, при которой функция вызывает сама себя для решения подзадачи, которая является частью исходной задачи.
🔗 Рекурсивные функции состоят из двух частей: базового случая и рекурсивного случая. И вот вам пример из реальной жизни:
✔️ П Р И М Е Р
⚙️ Все мы знаем традиционную Русскую матрешку. Внутри самой большой находятся уменьшенные копии. Каждая матрешка открывается и обнаруживает внутри себя ещё одну, но меньшего размера. Этот процесс продолжается до тех пор, пока не останется самая маленькая матрёшка, которую уже открыть нельзя — это и есть базовый случай.
🟰Базовый случай — самая маленькая кукла, которую нельзя открыть.
🟰Рекурсивный случай — каждая кукла содержит в себе другую куклу.
🟰Базовый случай (условие выхода) — это условие, при котором функция завершает вызовы и возвращает результат, не вызывая себя снова. (Наша маленькая матрешка)
🟰Рекурсивный случай — это часть функции, где функция вызывает саму себя с другими параметрами, приближаясь к базовому случаю. (Каждая матрешка, кроме самой маленькой)
Telegram
CodeLab
⚙️ Навигация по алгоритмам: (книга Адитьи Бхаргавы 'Грокаем Алгоритмы'): big(O), Tsp, а также разбор интересных тем, например, почему 0.1 + 0.1 != 0.2...Ниже также будут посты с подтемами.
🧑💻(Большой материал):
🔗Связанные списки и массивы (отдельный…
🧑💻(Большой материал):
🔗Связанные списки и массивы (отдельный…
12❤3🥰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 (Рекурсия разбивает задачи на подзадачи, но всегда есть предел, условие, после которого функция перестает работать)
🧑💻Теперь попробуем наши мысли скомпоновать:
0️⃣ Вызывается factorial(5) и так как
n != 0 и n != 1, функция возвращает 5 * factorial(4)
1️⃣ Вызывается factorial(4), функция возвращает 4 * factorial(3)
Далее происходят вызовы factorial(3) и factorial(2).
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❤🔥3❤1🥰1🤓1
П Р О Д О Л Ж Е Н И Е
🧑💻2️⃣ На моменте, когда происходит вызов factorial(1), срабатывает базовый случай, и функция возвращает 1 (Это был пятый вызов)
🔗‼️3️⃣ После всего это начинается возврат значений, обратный процесс (так как рекурсивные вызовы завершатся и достигнут базового случая)
🟰4️⃣ Идем от обратного,четвертый вызов (Это был factorial(2)) → получает результат 1 от factorial(1) и возвращает 2×1=2 (Короче, четвертый вызов получает результат от 5 и возвращает результат) — происходит это все согласно строчке:
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 (Надеюсь вы понимаете, что происходит)
🧑💻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👍2❤1🤓1