Kodduu Python
1.08K subscribers
311 photos
28 videos
187 links
Научись программировать на Python на интересных примерах

Самый быстрый курс https://stepik.org/a/187914
Самый нескучный курс https://stepik.org/a/185238

Во вопросам сотрудничества: @AlexErf
Download Telegram
И не забываем про курс профессия Python-разработчик с преподавателями 🔥🔥🔥

Реклама. Информация о рекламодателе по ссылкам в посте.
🌸 С наступающим 8 марта! Ниже код, который рисует радужный цветок 🎨💐


import turtle
import math
import random

# Настройка экрана
screen = turtle.Screen()
screen.bgcolor("lightblue")

t = turtle.Turtle()
t.speed(0)

# Палитра цветов для лепестков
colors = ["red", "orange", "yellow", "green", "blue", "purple"]

# Функция для рисования сердцевидного лепестка
def heart_petal(size, color):
t.fillcolor(color)
t.begin_fill()
t.left(140)
t.forward(size)
for _ in range(200): # Рисуем дугу
t.right(1)
t.forward(size * math.pi / 200)
t.left(120)
for _ in range(200): # Вторая дуга
t.right(1)
t.forward(size * math.pi / 200)
t.forward(size)
t.end_fill()

# Рисуем цветок с разноцветными лепестками
t.penup()
t.goto(0, -50)
t.pendown()
for i in range(6):
t.color(colors[i % len(colors)]) # Берем цвет из списка
heart_petal(50, colors[i % len(colors)])
t.right(60) # Поворачиваем для следующего лепестка

# Рисуем стебель
t.color("green")
t.fillcolor("green")
t.penup()
t.goto(0, -50)
t.pendown()
t.right(90)
t.forward(200)

# Оставляем окно открытым
turtle.done()


💡 Что делает этот код?
🌈 Рисует цветок с 6 лепестками, каждый разного цвета.
🌿 Добавляет зеленый стебель для естественного вида.
🐢 Использует `turtle`, чтобы легко и красиво рисовать графику.

Подумайте как ускорить рисование, и как сделать чтобы стебель шел всегда вниз 🤔

Подпишись 👉🏻 @KodduuPython 🤖
This media is not supported in your browser
VIEW IN TELEGRAM
Цветок из кода выше 🖕🖕🖕

Подпишись 👉🏻 @KodduuPython 🤖
👍2
Женская логика – это нечто уникальное, непредсказуемое и невероятно гениальное. Именно за это мы и любим женщин! ❤️
Давайте напишем юмористический код на Python, который это демонстрирует.

😂 Код (все в шутку, не воспринимать всерьез! 🙃)

import random

class WomanLogic:
def __init__(self):
self.mood = random.choice(["😇 Хорошее", "😈 Плохое", "🤔 Непонятное"])
self.choices = {
"Что хочешь поесть?": ["Не знаю", "Что-то вкусное", "Ты должен угадать!"],
"Ты точно не злишься?": ["Нет", "Нет.", "Я? Да нет, конечно..."],
"Можно купить это платье?": ["Оно мне идет?", "У меня уже есть похожее, но другое!", "Ты считаешь меня толстой?!"],
"Как тебе мой новый маникюр?": ["Красиво!", "Очень красиво!", "Ты даже не посмотрел! 😡"],
"Ты меня любишь?": ["Да", "Очень!", "Докажи!"],
}

def ask(self, question):
if question in self.choices:
return random.choice(self.choices[question])
return "Ты сам должен знать ответ! 😤"

# 🎭 Тестируем "женскую логику"
wl = WomanLogic()
print(f"🌸 Настроение сейчас: {wl.mood}\n")

questions = [
"Что хочешь поесть?",
"Ты точно не злишься?",
"Можно купить это платье?",
"Как тебе мой новый маникюр?",
"Ты меня любишь?",
]

for q in questions:
print(f" {q}")
print(f"💬 {wl.ask(q)}\n")


🔥 Как работает этот код?
💖 Эмулирует "женскую логику", выдавая неожиданные, но жизненные ответы.
🎭 Использует `random.choice()`, потому что предсказать ответ невозможно.
😂 Делает жизнь веселее – ведь именно эта загадочность и делает женщин уникальными!

Девушки, без обид! Мы вас любим такими, какие вы есть! ❤️ 😘

Подпишись 👉🏻 @KodduuPython 🤖
🔥2👀2
Вот код с распространенной ошибкой, которую даже опытные разработчики могут случайно допустить.

Этот код проверяет, является ли число простым. Но в нем есть неявный баг. Твоя задача – найти и исправить его! 😈

---

📝 Код с ошибкой

def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5)): # 🔥 Где-то здесь ошибка!
if n % i == 0:
return False
return True

# 🔍 Тестируем
test_numbers = [1, 2, 3, 4, 5, 16, 17, 19, 20, 23, 25]
for num in test_numbers:
print(f"{num}: {'Простое' if is_prime(num) else 'Составное'}")


---

💡 Намек:
Ошибка неявная и не бросается в глаза. Она связана с итерацией по делителям.
Из-за этой ошибки код некорректно определяет некоторые числа как простые.

Ты сможешь ее найти и исправить? 🧐🚀

Подпишись 👉🏻 @KodduuPython 🤖
2👍1
🚀 Исправляем распространенную ошибку в проверке простых чисел

Недавно я написал код для проверки, является ли число простым, но в нем была неявная ошибка, которую часто допускают даже опытные разработчики. 😈

---

🛑 Ошибка:
В этой строке:

for i in range(2, int(n ** 0.5)):

Мы не включаем верхнюю границу диапазона range(), но она должна быть int(n 0.5) + 1**!

Из-за этого алгоритм не проверял делимость на корень числа, а значит, некоторые составные числа ошибочно считались простыми. Например, 25 считалось простым, потому что 5 не проверялся.

---

### Исправленный код:

def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1): # Теперь проверяем и сам корень!
if n % i == 0:
return False
return True

# 🔍 Тестируем
test_numbers = [1, 2, 3, 4, 5, 16, 17, 19, 20, 23, 25]
for num in test_numbers:
print(f"{num}: {'Простое' if is_prime(num) else 'Составное'}")


---

💡 Итог:
Теперь код корректно определяет все числа!
Ошибка была связана с неправильным диапазоном в `range()`.
Если ты проверяешь делители до √n, не забудь включить +1 в range().

💬 Кто сталкивался с такой ошибкой? Поделитесь в комментариях! 🚀

Подпишись 👉🏻 @KodduuPython 🤖
До 12 марта идет дикая распродажа на самый полный курс по Python, который включает:

👉 Всю базу Python
👉 Data Science на Python
👉 CookBook по Python (Python в нескучных примерах)
👉 Топ 100 вопросов с реальных собеседований по Python (+тесты)

Либо отдельно можно купить только Топ 100 вопросов с реальных собеседований по Python (+тесты).

Подпишись 👉🏻 @KodduuPython 🤖
На Habr вышла вторая часть статьи "Как я сделал RAG для своей компании (часть 2). И как начал делать AI Агента." 🧐

Backlog проекта RAG + Agent AI для своей компании растет на глазах. Чем больше делаешь, тем больше идей💡В следующей части планирую выложить miro архитектуру проекта + github. Следите, подписывайтесь на habr. На картинке драфт архитектуры.

Подпишись 👉🏻 @KodduuPython 🤖
QR-коды могут содержать разнообразные данные, а не только ссылки! 📲

🔹 Что можно зашифровать в QR-код?

Текст – любой текст или сообщение.
Контактные данные (vCard) – имя, телефон, email, адрес.
Wi-Fi данные – SSID и пароль для быстрого подключения.
Электронная почта (mailto) – открывает окно для написания письма.
SMS-сообщение (sms:) – подставляет номер и текст.
Геолокация – координаты (широта и долгота).
Криптокошельки – Bitcoin, Ethereum и другие.
Команды для приложений – WhatsApp, Telegram, PayPal и др.

---

📌 Примеры кодов и их данных

1️⃣ Текстовый QR-код

qr.add_data("Привет! Это текст внутри QR-кода! 😊")


2️⃣ QR-код с контактами (vCard)

vcard = """BEGIN:VCARD
VERSION:3.0
FN:Иван Иванов
TEL:+79161234567
EMAIL:ivan@example.com
END:VCARD"""
qr.add_data(vcard)


3️⃣ QR-код для подключения к Wi-Fi

wifi_data = "WIFI:S:MyNetwork;T:WPA;P:MyPassword;;"
qr.add_data(wifi_data)

📶 После сканирования телефон автоматически подключится к Wi-Fi!

4️⃣ QR-код с координатами (например, Красная площадь, Москва)

geo_data = "geo:55.7539,37.6208"
qr.add_data(geo_data)


5️⃣ QR-код для мгновенного перевода криптовалюты (например, Bitcoin)

btc_address = "bitcoin:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa?amount=0.01"
qr.add_data(btc_address)


---

🛠 Полный код для генерации QR-кодов с разными данными

import qrcode

# Замените данные на нужные вам
data = "WIFI:S:MyNetwork;T:WPA;P:MyPassword;;" # Данные для Wi-Fi

# Генерация QR-кода
qr = qrcode.make(data)

# Сохранение изображения
qr.save("qr_code.png")
print(" QR-код сохранен как 'qr_code.png'")


---

💡 Как можно применять?
Визитки – добавляйте QR-код с контактами 📇
Wi-Fi в кафе – клиенты подключаются без пароля 📶
Маркетинг – ссылки на соцсети, акции, сайты 🏪
Криптоплатежи – удобный перевод крипты 🚀
Билеты и доступ – QR-коды для мероприятий 🎟

QR-коды многофункциональны, и их можно использовать не только для ссылок! 🔥

Ты уже пробовал создавать свои QR-коды? 😎

Подпишись 👉🏻 @KodduuPython 🤖
3👨‍💻2🆒1
🛡 Как работают SQL-инъекции на Python?

SQL-инъекция — это одна из самых опасных уязвимостей, которая позволяет взломать базу данных через неправильно обработанные запросы. Давайте разберем это на примере Python + SQLite.


🚨 Уязвимый код (НЕЛЬЗЯ ТАК ПИСАТЬ!)

import sqlite3

# Создаем тестовую базу данных
conn = sqlite3.connect(":memory:") # Используем оперативную память (не сохраняется на диск)
cursor = conn.cursor()

# Создаем таблицу пользователей
cursor.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, username TEXT, password TEXT)")
cursor.execute("INSERT INTO users (username, password) VALUES ('admin', 'supersecret')")
conn.commit()

# 🚨 Вход пользователя (уязвимый код!)
username = input("Введите имя пользователя: ")
password = input("Введите пароль: ")

query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"
print(f"\n[DEBUG] SQL-запрос: {query}") # Показываем SQL-запрос (чтобы увидеть проблему)

cursor.execute(query)
user = cursor.fetchone()

if user:
print(" Доступ разрешен!")
else:
print(" Неверный логин или пароль!")

conn.close()


🕵 Как это взломать?
Допустим, злоумышленник вводит в поле "Имя пользователя":

' OR '1'='1

Тогда SQL-запрос превратится в:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = ''

А так как '1'='1' всегда истина, то запрос вернет всех пользователей, и злоумышленник войдет в систему без пароля! 😨


Как защититься? Используем параметризованные запросы!
Исправим уязвимость с помощью защищенных SQL-запросов:

# 🔒 Безопасная версия
query = "SELECT * FROM users WHERE username = ? AND password = ?"
cursor.execute(query, (username, password))
user = cursor.fetchone()

Теперь любые вредоносные символы (`'`, --, OR, `1=1`) не повлияют на SQL-запрос, так как Python передает их как безопасные параметры, а не код.


💡 Итог
SQL-инъекции = опасно!
Никогда не вставляйте данные напрямую в SQL-запросы!
Используйте `cursor.execute("... WHERE username = ?", (username,))`

Подпишись 👉🏻 @KodduuPython 🤖
👍5
Продлили распродажу на +1 день, до 12 марта распродажа самый полный курс по Python, который включает:

👉 Всю базу Python
👉 Data Science на Python
👉 CookBook по Python (Python в нескучных примерах)
👉 Топ 100 вопросов с реальных собеседований по Python (+тесты)

Либо отдельно можно купить только Топ 100 вопросов с реальных собеседований по Python (+тесты) 🔥

Подпишись 👉🏻 @KodduuPython 🤖
🛡 Code Injection на Python: как это работает и как защититься

Code Injection (внедрение кода) — это атака, при которой злоумышленник заставляет приложение выполнить произвольный код.
На Python такое может случиться, если использовать `eval()` или `exec()` с неподконтрольными данными.


🚨 Уязвимый код (НЕЛЬЗЯ ТАК ПИСАТЬ!)

user_input = input("Введите математическое выражение: ")
result = eval(user_input) # ОПАСНО! Позволяет выполнить любой код
print(f"Результат: {result}")

🕵 Как это взломать?
Допустим, злоумышленник вводит:

__import__('os').system('rm -rf /') # Удалит все файлы на Linux!

или

__import__('subprocess').getoutput('ls') # Выполнит команду терминала

Так как eval() выполняет ПОЛНОЦЕННЫЙ Python-код, атакующий может удалять файлы, читать данные и делать все, что угодно! 😱


Как защититься?
1️⃣ Не используйте `eval()` и `exec()` с пользовательскими данными!
2️⃣ Если вам нужно безопасно вычислять выражения, используйте ast.literal_eval():

import ast

user_input = input("Введите число или выражение (2+2): ")

try:
result = ast.literal_eval(user_input) # Безопасно вычисляет только числа, списки, кортежи
print(f"Результат: {result}")
except (ValueError, SyntaxError):
print("Ошибка: недопустимый ввод!")

🔒 Теперь злоумышленник не сможет выполнить команды системы, так как literal_eval() позволяет только простые структуры (`int`, float, list, `tuple`).


🔥 Итог
eval(user_input) = ДЫРКА В БЕЗОПАСНОСТИ!
ast.literal_eval(user_input) = безопасный вариант
📌 Всегда фильтруйте ввод от пользователя!


Подпишись 👉🏻 @KodduuPython 🤖
🍀 Код в честь Дня Святого Патрика! Сколько пива выпьют в Ирландии? 🍻

День Святого Патрика (17 марта) — самый пивной праздник в Ирландии! Давайте посчитаем, сколько пинт пива выпьют в 2025 году.

📌 Факты для расчетов:
📊 В 2019 году в Ирландии выпили ~13 миллионов пинт в этот день.
📈 Средний рост потребления пива на праздник — 2% в год.
👥 Население Ирландии — ~5,3 млн человек (2025).

🍺 Код на Python

# Исходные данные
base_pints_2019 = 13_000_000 # Пинт выпито в 2019 году
growth_rate = 0.02 # Средний рост потребления (2% в год)
years = 2025 - 2019 # Сколько лет прошло

# Считаем пиво в 2025 году
pints_2025 = base_pints_2019 * ((1 + growth_rate) ** years)

# Выводим результат
print(f"🍀 В День Святого Патрика 2025 года в Ирландии выпьют примерно {int(pints_2025):,} пинт пива! 🍻")


📊 Результат:
Около 14,6 миллионов пинт! 😲 🍺

💡 Что можно добавить?
Учет роста населения 📈
Разделить на Guinness vs. другое пиво 🍺
Сравнить с водопотреблением в стране 🚰

Подпишись 👉🏻 @KodduuPython 🤖
👍3👀1
Давайте создадим пример простого AI-агента, который использует OpenAI Function Calling для выполнения задач на основе пользовательских запросов. Мы будем использовать случай, где агент помогает пользователю отслеживать свои задачи. Он будет принимать запросы от пользователя, добавлять задачи в список и позволять пользователю получать их.

Для этого мы будем использовать OpenAI GPT-4 с Function Calling.

Шаги:

1. Создаём функцию для добавления задач.
2. Создаём функцию для получения всех задач.
3. Создаём функцию для удаления задачи.


import openai
import json

# Устанавливаем ваш API ключ OpenAI
openai.api_key = 'your-openai-api-key'

# Переменная для хранения задач
tasks = []

# Функция для добавления задачи
def add_task(task):
tasks.append(task)
return f"Задача '{task}' добавлена."

# Функция для получения списка задач
def get_tasks():
if tasks:
return "Список задач:\n" + "\n".join([f"{i+1}. {task}" for i, task in enumerate(tasks)])
else:
return "Список задач пуст."

# Функция для удаления задачи
def delete_task(task_index):
try:
removed_task = tasks.pop(task_index - 1)
return f"Задача '{removed_task}' удалена."
except IndexError:
return "Ошибка: Неверный индекс задачи."

# Функции OpenAI для обработки команд
def function_call_handler(function_name, args):
if function_name == "add_task":
return add_task(args["task"])
elif function_name == "get_tasks":
return get_tasks()
elif function_name == "delete_task":
return delete_task(args["task_index"])
else:
return "Неизвестная функция."

# Настроим prompt с описанием задач для OpenAI
functions = [
{
"name": "add_task",
"description": "Добавить задачу в список.",
"parameters": {
"type": "object",
"properties": {
"task": {
"type": "string",
"description": "Описание задачи"
}
},
"required": ["task"]
}
},
{
"name": "get_tasks",
"description": "Получить список всех задач.",
"parameters": {
"type": "object",
"properties": {}
}
},
{
"name": "delete_task",
"description": "Удалить задачу по индексу.",
"parameters": {
"type": "object",
"properties": {
"task_index": {
"type": "integer",
"description": "Индекс задачи, которую нужно удалить."
}
},
"required": ["task_index"]
}
}
]

# Функция для общения с OpenAI
def chat_with_agent(user_input):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "Ты помощник для отслеживания задач. Ты можешь добавлять, показывать и удалять задачи."
}, {
"role": "user",
"content": user_input
}],
functions=functions,
function_call="auto"
)

# Получаем ответ и выполняем функцию
message = response['choices'][0]['message']
if "function_call" in message:
function_name = message["function_call"]["name"]
arguments = json.loads(message["function_call"]["arguments"])
return function_call_handler(function_name, arguments)

return message['content']

# Пример взаимодействия с агентом
while True:
user_input = input("Введите команду: ")
if user_input.lower() in ["exit", "quit"]:
print("До свидания!")
break
response = chat_with_agent(user_input)
print("Ответ агента:", response)


ChatGPT с функциями:
- Используется API openai.ChatCompletion.create() для вызова модели GPT-4.
- Функции, которые агент может вызывать, передаются в параметре functions.
- В зависимости от того, что хочет сделать пользователь (например, добавить задачу или удалить), OpenAI вызывает соответствующую функцию.

Подпишись 👉🏻 @KodduuPython 🤖
Пример работы, кода выше 👆👆👆

Пользователь:

Введите команду: Добавить задачу купить молоко


Агент:

Ответ агента: Задача 'купить молоко' добавлена.


Пользователь:

Введите команду: Показать задачи


Агент:

Ответ агента: Список задач:
1. купить молоко


Подпишись 👉🏻 @KodduuPython 🤖
В чем основная сложность изучения программирования? Нужно много изучать, много кодить, много дебажить, много искать/исправлять багов.

А в чем прелесть? Все это можно делать самому, но в дружной компании может быть намного легче, например на курсе Профессия Python-разработчик от GB. Плюс прокачка командных скиллов, на реальной работе вы всегда будете в команде.

Реклама. Информация о рекламодателе по ссылкам в посте.