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

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

Во вопросам сотрудничества: @AlexErf
Download Telegram
QR коды – это двумерные коды, используемые для хранения информации. Они обычно состоят из черных квадратов на белом фоне, которые могут быть прочитаны камерой на смартфоне или специализированным программным обеспечением. Информация в QR кодах может быть текстом, ссылкой на веб-сайт или другими данными.

Чтобы парсить QR коды, нам понадобится использовать библиотеку, которая умеет распознавать эти коды. В Python, одной из популярных библиотек для этого является pyzbar.

Вот простой пример кода, который использует pyzbar и opencv для чтения QR кода из изображения:

python
from pyzbar.pyzbar import decode
import cv2

def decode_qr_code(image_path):
img = cv2.imread(image_path)
decoded_objects = decode(img)
for obj in decoded_objects:
print('Type:', obj.type)
print('Data:', obj.data.decode('utf-8'))

decode_qr_code('path_to_your_qr_code_image.jpg')


В этом коде:
- cv2.imread(image_path) считывает изображение с QR-кодом.
- decode(img) выполняет декодирование QR-кода.
- for obj in decoded_objects: перебирает все обнаруженные на изображении QR-коды (если их больше одного).
- 'Type:', obj.type показывает тип кода (QR-код, штрих-код и т.д.).
- 'Data:', obj.data.decode('utf-8') выводит данные, которые были закодированы в QR-коде.

Обратите внимание, что для работы этого кода у вас должны быть установлены библиотеки pyzbar и opencv. Вы можете установить их с помощью pip:

bash
pip install opencv-python
pip install pyzbar
👍2
QR-коды используют встроенные механизмы коррекции ошибок, основанные на кодах Рида-Соломона, которые позволяют восстановить данные даже при частичном повреждении или загрязнении. Их можно настроить на разные уровни коррекции ошибок: L (7%), M (15%), Q (25%) и H (30%). Более высокий уровень коррекции ошибок означает, что больше информации может быть восстановлено, но это также уменьшает количество информации, которую можно хранить в QR-коде.

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

Пример простой проверки контрольной суммы на Python:

python
def checksum(data):
return sum(data) % 256

data = [123, 3, 44, 125, 0, 99]
original_checksum = checksum(data)

# Впоследствии, когда мы получим данные, мы можем проверить их целостность:
received_data = [123, 3, 44, 125, 0, 99] # Предположим, это те же данные
received_checksum = checksum(received_data)

if original_checksum == received_checksum:
print("Данные целы")
else:
print("Данные повреждены")


В случае с QR-кодами, механизмы проверки целостности и коррекции ошибок уже встроены в стандарт, и программа, которую вы используете для чтения QR-кода, должна автоматически обрабатывать их.
Для чтения штрих-кода с использованием Python, можно использовать библиотеку под названием Pyzbar. Вот простой код для этой операции:

python
from pyzbar.pyzbar import decode
from PIL import Image

def read_barcode(file):
image = Image.open(file)
result = decode(image)
for barcode in result:
print("Тип штрих-кода: ", barcode.type)
print("Данные штрих-кода: ", barcode.data.decode('utf-8'))

read_barcode('path_to_your_barcode_image.jpg')

В этом коде выполняются следующие действия:

1. Сначала импортируются необходимые библиотеки. Pyzbar используется для распознавания штрих-кода, а PIL (Python Imaging Library) используется для работы с изображениями.

2. Затем определяется функция read_barcode, которая принимает в качестве аргумента путь к файлу изображения.

3. В этой функции изображение открывается с использованием функции Image.open из PIL.

4. Затем функция decode из Pyzbar используется для распознавания штрих-кодов на изображении. Она возвращает список найденных штрих-кодов.

5. Далее мы перебираем все найденные штрих-коды и выводим их тип и данные.

Пожалуйста, обратите внимание, что этот код предназначен для чтения штрих-кодов из изображений. Если вам нужно считывать штрих-коды в реальном времени (например, с использованием камеры), вам потребуется другой подход, вероятно, с использованием библиотеки OpenCV для работы с видео.
Для чтения штрих-кодов в реальном времени, можно использовать библиотеку OpenCV вместе с Pyzbar. Вот базовый код для чтения штрих-кодов с веб-камеры:

python
import cv2
from pyzbar.pyzbar import decode

cap = cv2.VideoCapture(0) # открывает камеру по умолчанию

while True:
ret, frame = cap.read() # читает кадр с камеры
for barcode in decode(frame):
print("Тип штрих-кода: ", barcode.type)
print("Данные штрих-кода: ", barcode.data.decode('utf-8'))
(x, y, w, h) = barcode.rect # координаты штрих-кода
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) # обводим штрих-код зеленым прямоугольником

cv2.imshow('Camera', frame) # отображаем кадр на экране

if cv2.waitKey(1) & 0xFF == ord('q'): # если нажать 'q', то цикл завершается
break

cap.release() # освобождаем ресурс камеры
cv2.destroyAllWindows() # закрываем все окна

В этом коде делаются следующие вещи:

1. Сначала импортируются необходимые библиотеки: cv2 (OpenCV) для работы с изображениями и видео, и pyzbar.pyzbar для распознавания штрих-кодов.

2. Затем открывается поток видео с камеры с помощью функции cv2.VideoCapture.

3. В бесконечном цикле читается каждый кадр с камеры, и для каждого кадра применяется функция decode для поиска штрих-кодов.

4. Если на кадре найден штрих-код, его данные выводятся на экран, а также на изображении рисуется прямоугольник вокруг штрих-кода.

5. Полученный кадр с возможным штрих-кодом отображается на экране.

6. Если пользователь нажимает 'q', то цикл завершается, и ресурсы, занятые камерой, освобождаются.

Обратите внимание, что данный код не содержит обработку исключений и может не работать корректно, если камера не доступна или возникают другие проблемы. В реальном приложении следует добавить соответствующую обработку исключений.
🥰2
Простой блокчейн может быть реализован на Python так:

python
import hashlib
import time

class Block:
def __init__(self, index, previous_hash, timestamp, data, hash):
self.index = index
self.previous_hash = previous_hash
self.timestamp = timestamp
self.data = data
self.hash = hash


def calculate_hash(index, previous_hash, timestamp, data):
value = str(index) + str(previous_hash) + str(timestamp) + str(data)
return hashlib.sha256(value.encode('utf-8')).hexdigest()


def create_genesis_block():
return Block(0, "0", int(time.time()), "Genesis Block", calculate_hash(0, "0", int(time.time()), "Genesis Block"))


def create_new_block(previous_block, data):
index = previous_block.index + 1
timestamp = int(time.time())
hash = calculate_hash(index, previous_block.hash, timestamp, data)
return Block(index, previous_block.hash, timestamp, data, hash)


# создаем блокчейн и добавляем генезис блок
blockchain = [create_genesis_block()]
previous_block = blockchain[0]

# добавляем блоки в блокчейн
num_blocks_to_add = 10
for i in range(0, num_blocks_to_add):
block_to_add = create_new_block(previous_block, f"Block #{i} has been added to the blockchain!")
blockchain.append(block_to_add)
previous_block = block_to_add
print(f"Block #{block_to_add.index} has been added to the blockchain!")
print(f"Hash: {block_to_add.hash}\n")

Объяснение:

1. Этот код определяет класс Block, который представляет собой блок в блокчейне. У каждого блока есть свой индекс, хеш предыдущего блока, временная метка, данные и собственный хеш.

2. calculate_hash - это функция, которая используется для создания хеша для блока. Она использует функцию sha256 из модуля hashlib для создания хеша из строкового представления индекса блока, хеша предыдущего блока, временной метки и данных.

3. create_genesis_block - это функция, которая создает первый блок в блокчейне, называемый "генезис блоком". Этот блок обычно имеет заранее заданные значения, и у него нет предыдущего блока.

4. create_new_block - это функция, которая создает новый блок на основе предыдущего блока и некоторых данных.

5. Наконец, код создает блокчейн, добавляет генезис блок, а затем добавляет еще 10 блоков, каждый из которых ссылается на предыдущий блок.

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

Важно отметить, что этот код является упрощенной версией блокчейна и не включает многие важные особенности реальных блокчейн систем, такие как механизмы консенсуса (например, Proof of Work или Proof of Stake), системы транзакций и управления данными, а также различные меры безопасности. Однако он демонстрирует базовые принципы работы блокчейна.

Подпишись 👉🏻 @KodduuPython 🤖
👍6
Предположим, что у нас есть система, которая отслеживает приход и уход сотрудников, и мы хотим использовать блокчейн, чтобы гарантировать, что эта информация не может быть изменена. Ниже представлен код на Python, который демонстрирует это:

python
import hashlib
import time

class Block:
def __init__(self, index, previous_hash, timestamp, data, hash):
self.index = index
self.previous_hash = previous_hash
self.timestamp = timestamp
self.data = data
self.hash = hash

def calculate_hash(index, previous_hash, timestamp, data):
value = str(index) + str(previous_hash) + str(timestamp) + str(data)
return hashlib.sha256(value.encode('utf-8')).hexdigest()

def create_genesis_block():
return Block(0, "0", int(time.time()), {"employee_id": "0", "action": "Genesis Block", "time": int(time.time())}, calculate_hash(0, "0", int(time.time()), "Genesis Block"))

def create_new_block(previous_block, data):
index = previous_block.index + 1
timestamp = int(time.time())
hash = calculate_hash(index, previous_block.hash, timestamp, data)
return Block(index, previous_block.hash, timestamp, data, hash)

blockchain = [create_genesis_block()]
previous_block = blockchain[0]

def log_event(employee_id, action):
data = {
"employee_id": employee_id,
"action": action,
"time": int(time.time())
}
block_to_add = create_new_block(previous_block, data)
blockchain.append(block_to_add)
print(f"Employee #{data['employee_id']} has {data['action']} at {data['time']}")
return block_to_add

# Пример использования:

previous_block = log_event("123", "entered office")
previous_block = log_event("123", "left office")
previous_block = log_event("456", "entered office")

В этом коде функция log_event добавляет новый блок в блокчейн с данными о событии: идентификатор сотрудника, действие и время. Благодаря использованию блокчейна, эта информация нельзя изменить без изменения всех последующих блоков.

В данном примере кода предполагается, что идентификатор сотрудника и действие вводятся вручную. В реальной системе они, вероятно, будут получены автоматически, например, через систему распознавания лиц или бейджи доступа.
3👍2
В зависимости от модели дрона, который вы хотите управлять, будут различные библиотеки и API, которые вы можете использовать. Однако, вот простой пример кода, который бы использовался для управления дроном с помощью библиотеки python-ardrone.

Эта библиотека специально разработана для управления дронами Parrot AR.Drone:

python
import time
from ardrone import ARDrone

# Инициализируем класс ARDrone
drone = ARDrone()

# Стартуем двигатели дрона
drone.takeoff()

# Пауза, чтобы дать дрону время на поднятие в воздух
time.sleep(3)

# Дрон движется вперед
drone.move_forward()
time.sleep(1)

# Дрон поворачивает налево
drone.turn_left()
time.sleep(1)

# Дрон движется назад
drone.move_backward()
time.sleep(1)

# Дрон поворачивает направо
drone.turn_right()
time.sleep(1)

# Дрон приземляется
drone.land()
time.sleep(1)

# Отключаем двигатели
drone.halt()

В этом примере кода дрон взлетает, движется вперед, поворачивает налево, движется назад, поворачивает направо, а затем приземляется. Между каждым действием вставляется пауза, чтобы дать дрону время для выполнения предыдущего действия.

Помните, что взаимодействие с реальным оборудованием всегда включает риск, и вы должны быть осторожны, чтобы избежать повреждения оборудования или окружающей среды. Убедитесь, что вы удовлетворяете всем необходимым требованиям безопасности перед запуском кода, который управляет физическим оборудованием, как дрон.

Подпишись 👉🏻 @KodduuPython 🤖
👍3🔥2
Обнаружение и отслеживание людей в реальном времени является сложной задачей, которая обычно решается с использованием алгоритмов компьютерного зрения и машинного обучения. OpenCV - это библиотека компьютерного зрения, которая включает в себя множество функций, которые можно использовать для обнаружения и отслеживания объектов, включая людей.

Ниже представлен пример кода, который может быть использован для обнаружения людей с использованием HOG (Histogram of Oriented Gradients) дескриптора и SVM (Support Vector Machines) классификатора, включенных в OpenCV. Затем можно было бы использовать обнаруженное положение человека для управления дроном.

python
import cv2
from droneapi import Drone

# Инициализируем дрон
drone = Drone()

# Инициализируем детектор людей
HOGCV = cv2.HOGDescriptor()
HOGCV.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

while True:
# Дрон делает снимок
frame = drone.capture_image()

# Обработка изображения с помощью OpenCV и обнаружение людей
boxes, weights = HOGCV.detectMultiScale(frame, winStride=(4, 4), padding=(8, 8), scale=1.05)

# Отслеживание первого обнаруженного человека (если есть)
if len(boxes) > 0:
x, y, w, h = boxes[0]

# Простая стратегия следования: если человек слева от центра - поворачиваем налево,
# если справа - поворачиваем направо
center_x = x + w / 2
if center_x < frame.shape[1] / 2:
drone.turn_left()
else:
drone.turn_right()


Заметьте, что это очень простой пример того, как можно было бы отслеживать человека с помощью дрона. В реальном мире вы, вероятно, столкнетесь со многими проблемами, которые не рассматриваются в этом примере, включая но не ограничиваясь ошибками обнаружения, проблемами с навигацией и управлением дроном, препятствиями в пути дрона, и так далее.

Также учтите, что это всего лишь демонстрация, что можно сделать с Python и OpenCV, и в действительности вам потребуется больше кода и возможностей для того, чтобы создать дрон, который может надежно отслеживать человека в реальном времени
3
Рисование по точкам в виде текста можно осуществить с помощью библиотеки matplotlib. Для начала нам потребуется определить координаты каждой точки, которые формируют буквы надписи "Dart Vader".

Вот пример, как это можно сделать:

python
import matplotlib.pyplot as plt

# Определение координат для надписи "Dart Vader"
# Пожалуйста, замените на реальные координаты
dart_vader_points = {
'D': [(1, 3), (1, 2), (1, 1), (2, 3), (2, 1), (3, 3), (3, 1), (4, 2)],
'a': [(6, 2), (6, 1), (7, 3), (7, 1), (8, 2)],
'r': [(10, 3), (10, 2), (10, 1), (11, 3)],
't': [(13, 3), (13, 2), (13, 1), (14, 3)],
'V': [(17, 3), (18, 2), (19, 1), (20, 2), (21, 3)],
'a2': [(23, 2), (23, 1), (24, 3), (24, 1), (25, 2)],
'd': [(27, 3), (27, 2), (27, 1), (28, 3), (29, 3), (29, 2), (29, 1)],
'e': [(31, 3), (31, 2), (31, 1), (32, 3), (32, 1), (33, 3), (33, 2)],
'r2': [(35, 3), (35, 2), (35, 1), (36, 3)]
}

fig, ax = plt.subplots()

# Рисуем каждую точку
for letter, points in dart_vader_points.items():
for point in points:
ax.plot(*point, 'bo')

ax.set_ylim(0, 4)
ax.set_xlim(0, 40)
ax.set_aspect('equal')

plt.gca().invert_yaxis()
plt.show()


Координаты в этом примере являются произвольными и нужно заменить их на реальные координаты для создания надписи "Dart Vader". Это могло бы быть сделано вручную, но это потребует много времени и терпения.

Помимо этого, для создания более сложных рисунков можно было бы использовать алгоритмы для автоматического генерирования точек по шрифтам или изображениям.
2
Можно использовать библиотеку PIL (Pillow) для чтения пикселей изображения и преобразования их в набор точек.

Возьмем пример с изображением.

python
from PIL import Image
import matplotlib.pyplot as plt

# Открыть изображение и преобразовать в черно-белое
image = Image.open('dart_vader.png').convert('L')

# Преобразовать изображение в массив пикселей
pixels = list(image.getdata())

# Создать пустой список для хранения координат точек
points = []

# Пройтись по всем пикселям изображения
for y in range(image.height):
for x in range(image.width):
# Получить интенсивность текущего пикселя (0 - черный, 255 - белый)
intensity = pixels[y * image.width + x]

# Если интенсивность ниже определенного порога, добавить координаты в список точек
if intensity < 128:
points.append((x, y))

# Отобразить точки на графике
plt.figure(figsize=(10,10))
plt.scatter(*zip(*points), s=1, color='black')
plt.gca().invert_yaxis()
plt.show()


В этом примере мы открываем изображение, преобразуем его в черно-белый формат, а затем преобразуем в массив пикселей. Затем мы проходим по каждому пикселю и, если его интенсивность (или яркость) ниже определенного порога, мы добавляем его координаты в список точек. Наконец, мы отображаем эти точки на графике.

Помните, что этот код будет работать только если файл изображения ('dart_vader.png') находится в той же директории, что и Python скрипт. Измените имя файла изображения на имя вашего файла. Вам также может потребоваться установить библиотеку Pillow, если она еще не установлена (это можно сделать с помощью команды pip install pillow в командной строке).
2
Задержка сигнала между Землей и Марсом может быть от 4 до 24 минут в обоих направлениях, в зависимости от их текущего положения друг относительно друга. По этой причине марсоходы обычно используют некую форму автономной навигации, которая позволяет им избегать препятствий без непосредственного вмешательства операторов на Земле.

Но давайте представим, что вы должны управлять марсоходом напрямую и вам нужно учитывать задержку. Предположим, что ваш MarsRoverAPI имеет методы turn_steering_wheel(angle) и press_gas(amount), где angle это угол поворота в градусах (от -45 до 45), а amount это сколько газа дать (от 0 до 1).

Мы будем использовать asyncio библиотеку для симуляции временной задержки.

python
import asyncio
import MarsRoverAPI # предположим, что такая библиотека существует

class MarsRoverController:

def __init__(self, signal_delay):
self.signal_delay = signal_delay
self.rover = MarsRoverAPI.Rover()

async def turn(self, angle):
print(f'Sending turn signal with angle {angle}...')
await asyncio.sleep(self.signal_delay) # Wait for the signal to reach Mars
self.rover.turn_steering_wheel(angle)

async def press_gas(self, amount):
print(f'Sending gas signal with amount {amount}...')
await asyncio.sleep(self.signal_delay) # Wait for the signal to reach Mars
self.rover.press_gas(amount)

async def main():
# Assume signal delay is 10 minutes
signal_delay = 10 * 60

controller = MarsRoverController(signal_delay)

# send some commands
await controller.turn(30)
await controller.press_gas(0.5)

# Run the program
asyncio.run(main())


Обратите внимание, что этот код просто симулирует отправку команд с задержкой. В реальной ситуации вам, скорее всего, придется планировать движение марсохода заранее, учитывая известные препятствия, и затем отправлять эти планы на марсоход, чтобы он мог их выполнять автономно.

Вы также можете захотеть включить в свою программу обратную связь от марсохода, чтобы управлять его действиями на основе полученных данных о его окружающем пространстве.
Для вычисления текущего времени на планете Марс, нам потребуется знать отношение между временем на Земле и Марсе. Наиболее распространенным методом является использование отношения средних солнечных дней на Земле и Марсе.

Вот пример кода на Python, который вычисляет текущее время на планете Марс с использованием модуля datetime:

python
import datetime

# Задаем отношение средних солнечных дней на Земле и Марсе
mars_solar_day = 1.027491252
earth_solar_day = 1

# Получаем текущую дату и время на Земле
current_datetime = datetime.datetime.now()

# Вычисляем количество прошедших секунд на Земле
earth_seconds = (current_datetime.hour * 3600) + (current_datetime.minute * 60) + current_datetime.second

# Вычисляем количество прошедших секунд на Марсе
mars_seconds = earth_seconds * (mars_solar_day / earth_solar_day)

# Конвертируем количество секунд на Марсе в формат времени
mars_time = datetime.timedelta(seconds=mars_seconds)

print(f"Текущее время на Марсе: {mars_time}")


Обратите внимание, что этот код использует среднее отношение длительности солнечных дней на Марсе и Земле. Фактическое время на Марсе может отличаться из-за различий в продолжительности солнечных дней и других факторов. Этот код демонстрирует примерную оценку текущего времени на Марсе на основе отношения средних солнечных дней.
1. Инкапсуляция - это концепция, которая заключается в объединении данных и методов, которые работают с этими данными, в одном объекте и скрытии деталей реализации от пользователя.

python
class BankAccount:
def __init__(self):
self.__balance = 0 # приватное свойство

def deposit(self, amount): # метод для внесения депозита
self.__balance += amount
return self.__balance

def withdraw(self, amount): # метод для снятия денег
if amount > self.__balance:
return "Insufficient funds"
self.__balance -= amount
return self.__balance


В этом примере, BankAccount класс инкапсулирует свойства и методы, которые связаны с банковским счетом. Детали реализации, такие как свойство __balance, скрыты от пользователя. Методы deposit и withdraw предоставляют контролируемый доступ к этим данным.
2. Наследование - это концепция, которая позволяет создать новый класс на основе существующего класса. Новый класс наследует все свойства и методы родительского класса, но также может добавлять или переопределять их.

python
class Vehicle:
def __init__(self, make, model):
self.make = make
self.model = model

def print_details(self):
print(f"Manufacturer: {self.make}")
print(f"Model: {self.model}")

class Car(Vehicle):
def __init__(self, make, model, year):
super().__init__(make, model)
self.year = year

def print_details(self):
super().print_details()
print(f"Year: {self.year}")

car = Car("Toyota", "Camry", 2020)
car.print_details()


В этом примере Car является подклассом Vehicle и наследует свойства и методы Vehicle. Однако Car также добавляет новое свойство year и переопределяет метод print_details().
👍1
3. Полиморфизм - это концепция, которая позволяет использовать единый интерфейс для различных типов данных. Это означает, что разные объекты могут применять один и тот же метод, но выполнять его по-разному.

python
class Dog:
def sound(self):
return "Woof!"

class Cat:
def sound(self):
return "Meow!"

def make_sound(animal):
print(animal.sound())

dog = Dog()
cat = Cat()

make_sound(dog) # выводит: Woof!
make_sound(cat) # выводит: Meow!


В этом примере Dog и Cat классы оба имеют метод sound(), но реализуют его по-разному. Функция make_sound(animal) может принимать любой объект, который имеет метод sound(), и вызывать этот метод. Это и есть полиморфизм - один и тот же интерфейс (sound()) используется для объектов разных типов (Dog и Cat).
👍1
4. Абстракция - это процесс сокрытия сложности от пользователя, предоставляя ему только функциональность. Один из способов достижения абстракции в Python - использование абстрактных базовых классов (ABC).

python
from abc import ABC, abstractmethod

class Shape(ABC):
@abstractmethod
def area(self):
pass

class Circle(Shape):
def __init__(self, radius):
self.radius = radius

def area(self):
return 3.14 * (self.radius**2)

circle = Circle(5)
print(circle.area()) # выводит: 78.5

В этом примере, Shape является абстрактным базовым классом, который определяет абстрактный метод area(). Этот метод не имеет реализации в Shape, но он должен быть реализован в любом классе, который наследуется от Shape. Circle является подклассом Shape и реализует метод area().

Абстрактные базовые классы позволяют определить общий интерфейс для связанных классов, что упрощает взаимодействие с ними.

Подпишись 👉🏻 @KodduuPython 🤖
👍1
Мы прошли основные 4 принципа ООП. Однако, есть еще много различных понятий и концепций в ООП, которые можно демонстрировать. Например, композиция и агрегация, которые являются типами ассоциации между классами.

5. Композиция - это строгий тип ассоциации, когда один класс является частью другого класса.

python
class Engine:
def __init__(self, type):
self.type = type

class Car:
def __init__(self, engine):
self.engine = engine

engine = Engine("Diesel")
car = Car(engine)

print(car.engine.type) # выводит: Diesel

В этом примере, класс Engine является частью класса Car, и без экземпляра Engine, Car не может существовать. Это демонстрирует концепцию композиции, где класс Car "включает в себя" класс Engine.

Подпишись 👉🏻 @KodduuPython 🤖
👍2
6. Агрегация - это еще один тип ассоциации, который указывает на отношение "имеет" между двумя классами. Он отличается от композиции тем, что классы могут существовать независимо друг от друга.

python
class Address:
def __init__(self, street, city):
self.street = street
self.city = city

class Person:
def __init__(self, name, address):
self.name = name
self.address = address

address = Address("1234 Main St", "Springfield")
person = Person("John Doe", address)

print(person.address.city) # выводит: Springfield

В этом примере, Person класс имеет Address, но Address может существовать и без Person. Это демонстрирует концепцию агрегации, где Person класс "имеет" Address, но оба класса могут существовать независимо.

Подпишись 👉🏻 @KodduuPython 🤖
👍3
Побитовые операторы в Python работают с битами и выполняют битовые операции. Операторы, которые являются побитовыми, включают:

- & (Битовое И)
- | (Битовое ИЛИ)
- ^ (Битовое исключающее ИЛИ)
- ~ (Битовое НЕ)
- << (Сдвиг влево)
- >> (Сдвиг вправо)

Вот пример кода на Python, использующего побитовые операторы:

python
# Инициализация двух чисел
a = 10 # 1010 в бинарном формате
b = 4 # 0100 в бинарном формате

# Битовое И
print("Битовое И: a & b = ", a & b) # Результат будет 0

# Битовое ИЛИ
print("Битовое ИЛИ: a | b = ", a | b) # Результат будет 14

# Битовое исключающее ИЛИ
print("Битовое исключающее ИЛИ: a ^ b = ", a ^ b) # Результат будет 14

# Битовое НЕ
print("Битовое НЕ: ~a = ", ~a) # Результат будет -11

# Битовый сдвиг влево
print("Сдвиг влево: a << 1 = ", a << 1) # Результат будет 20

# Битовый сдвиг вправо
print("Сдвиг вправо: a >> 1 = ", a >> 1) # Результат будет 5
Этот код показывает, как работают различные побитовые операторы в Python.

Подпишись 👉🏻 @KodduuPython 🤖
Один из самых распространенных случаев использования побитовых операторов - это работа с наборами флагов или битовыми полями. Допустим, у вас есть набор настроек или прав доступа, которые вы хотите хранить в одной переменной. Можно использовать отдельные биты этой переменной для представления разных флагов.

Возьмем, например, простую игру, где у вас есть персонаж с различными способностями, которые можно включить или выключить. Вы можете использовать битовые операторы для управления этими способностями.

python
# Инициализация способностей
CAN_FLY = 1 << 0 # 0001 в бинарном формате
CAN_SWIM = 1 << 1 # 0010 в бинарном формате
CAN_RUN = 1 << 2 # 0100 в бинарном формате

# Начальные способности персонажа
abilities = 0 # В начале персонаж не умеет ничего

# Выдаем персонажу способность летать
abilities |= CAN_FLY

# Проверяем, умеет ли персонаж летать
if abilities & CAN_FLY:
print("Персонаж умеет летать")

# Отбираем у персонажа способность летать
abilities &= ~CAN_FLY

# Теперь проверка покажет, что персонаж не умеет летать
if not abilities & CAN_FLY:
print("Персонаж не умеет летать")

# Мы также можем выдать персонажу несколько способностей сразу
abilities |= (CAN_SWIM | CAN_RUN)

# И проверить, умеет ли он плавать и бегать
if abilities & CAN_SWIM and abilities & CAN_RUN:
print("Персонаж умеет плавать и бегать")

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

Подпишись 👉🏻 @KodduuPython 🤖
👍2
Создание игры "Блэкджек" на Python.

## Создание игры "Блэкджек" на Python

### Класс Card

Сначала мы создадим класс Card, который будет представлять отдельную карту в колоде.

python
class Card:
def __init__(self, suit, rank):
self.suit = suit
self.rank = rank

def __str__(self):
return self.rank + " of " + self.suit

### Класс Deck

Затем мы создадим класс Deck, который будет представлять колоду карт.

python
import random

class Deck:
def __init__(self):
self.deck = [] # начинаем с пустой колоды
for suit in suits:
for rank in ranks:
self.deck.append(Card(suit, rank))

def __str__(self):
deck_comp = '' # начинаем с пустой строки
for card in self.deck:
deck_comp += '\n '+card.__str__() # добавляем каждую карту
return 'The deck has:' + deck_comp

def shuffle(self):
random.shuffle(self.deck)

def deal(self):
single_card = self.deck.pop()
return single_card

### Класс Hand

Теперь мы создадим класс Hand, который будет представлять руку игрока или дилера.

python
class Hand:
def __init__(self):
self.cards = [] # начинаем с пустого списка, как и в классе Deck
self.value = 0 # начинаем с нулевого значения
self.aces = 0 # добавляем атрибут для отслеживания тузов

def add_card(self,card):
self.cards.append(card)
self.value += values[card.rank]

# отслеживаем тузы
if card.rank == 'Ace':
self.aces += 1

def adjust_for_ace(self):
while self.value > 21 and self.aces:
self.value -= 10
self.aces -= 1

### Класс Game

Наконец, мы создадим класс Game, который будет управлять игровым процессом.

python
class Game:
def __init__(self, deck, player_hand, dealer_hand):
self.deck = deck
self.player_hand = player_hand
self.dealer_hand = dealer_hand

# здесь будут методы для управления игровым процессом


Подпишись 👉🏻 @KodduuPython 🤖
👍2