Python для начинающих
1.09K subscribers
304 photos
3 videos
232 files
62 links
Python для начинающих
Download Telegram
Что такое исключения и как обрабатывать ошибки в коде
Итак, представьте, что вы путешественник в мире Python, и на вашем пути вам предстоит встретить невидимых врагов — исключения. Это те незаметные препятствия, которые поджидают в вашем коде и могут сорвать всё путешествие. Но не волнуйтесь, я расскажу вам, как превратить этих противников в союзников!

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

Но как же справиться с этими пакостниками? Тут приходит на помощь конструкция try-except. Она — ваш верный компас, который поможет обойти ловушки. Давайте посмотрим на небольшой пример:

try:
result = 10 / 0
except ZeroDivisionError:
print("Oops! Division by zero is not allowed.")


Что здесь происходит? Мы вставляем потенциально опасный код в блок try. Если возникает исключение, Python ищет блок except, соответствующий типу исключения. В нашем случае это ZeroDivisionError, и программа выводит дружественное сообщение, вместо того чтобы упасть с громким стуком.

Но это ещё не всё! Исключений бывает множество, и иногда вам нужно отловить их всех разом. Используйте простое except, чтобы поймать любую неожиданность:

try:
int_value = int("not_a_number")
except:
print("An error occurred!")


Однако будьте осторожны! Такой подход может скрыть важные детали об ошибке. Лучше обрабатывать исключения более конкретно и добавлять несколько блоков except при необходимости.

Ещё одна мощная техника — блоки finally и else. Они помогут завершить вашу одиссею на высокой ноте. Блок finally исполняется после всех остальных, независимо от исхода. Это идеальное место, чтобы освободить ресурсы или закрыть файлы.

try:
file = open("data.txt")
content = file.read()
except FileNotFoundError:
print("File not found!")
else:
print("File successfully read.")
finally:
file.close()


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

Теперь, когда вы знаете, что исключения — это не враги, а предупреждающие сигналы, вы вооружены знанием и готовы к любым неожиданностям на вашем пути. Впереди вас ждет ещё много удивительных открытий в мире Python!
👍1🔥1
Как парсить веб-страницы и извлекать данные с BeautifulSoup
Привет, друзья! Сегодня я хочу рассказать вам о магии, которая позволяет извлекать данные из веб-страниц, и имя этой магии — BeautifulSoup. Мы окунёмся в увлекательный мир парсинга и узнаем, как легко можно с помощью Python достать нужную информацию с любого сайта.

Начнем с того, что такое BeautifulSoup. Это библиотека на Python, которая позволяет парсить HTML и XML документы, создавая объектное представление документа. Это означает, что она преобразует код в красивую, организованную структуру, с которой легко работать. Давайте рассмотрим, как же это происходит на практике.

Первое, что нам нужно, это установить библиотеку. Если её у вас еще нет, быстро устанавливаем с помощью команды:

pip install beautifulsoup4


Также, для получения HTML-кода страниц, нам понадобится библиотека requests. Установить её можно аналогичным образом:

pip install requests


Теперь, когда всё готово, давайте напишем небольшой код, который извлечет заголовки статей с какой-нибудь интересной страницы. Например, возьмем "https://example.com".

import requests
from bs4 import BeautifulSoup

# Отправляем GET-запрос к странице
response = requests.get("https://example.com")

# Проверяем, что страница загрузилась успешно
if response.status_code == 200:
page_content = response.text
soup = BeautifulSoup(page_content, 'html.parser')

# Ищем все заголовки на странице
titles = soup.find_all('h2') # предположим, наши заголовки — это теги <h2>

# Печатаем все найденные заголовки
for title in titles:
print(title.get_text())

else:
print("Не удалось загрузить страницу")


Что здесь происходит? Мы отправляем запрос на веб-страницу и проверяем, что она была загружена успешно. Затем передаем содержимое страницы в BeautifulSoup. После чего начинаем извлекать информацию. В нашем случае, это все теги <h2>, которые содержат заголовки статей.

Конечно, это всего лишь верхушка айсберга. BeautifulSoup обладает множеством функций для поиска и навигации по HTML-документу. Например, можно использовать метод find, чтобы найти первый элемент с заданным тегом, или метод find_all для поиска всех элементов с таким тегом. Можно также использовать CSS-селекторы для более сложных запросов.

Хотите выделить текстовое содержимое всех параграфов с классом intro? Нет ничего проще:

intro_paragraphs = soup.select('p.intro')

for paragraph in intro_paragraphs:
print(paragraph.get_text())


Вот так просто можно извлечь нужные данные! BeautifulSoup — это мощный инструмент для веб-скрейпинга, и с его помощью можно автоматизировать множество рутинных задач. Надеюсь, этот краткий экскурс открыл перед вами новые возможности!

Удачного парсинга, друзья!
👍6🔥1
Интерактивные графики и визуализация данных с Plotly
Сегодня мы погрузимся в удивительный мир интерактивной визуализации данных с помощью библиотеки Plotly. Если вы когда-нибудь хотели оживить свои графики и сделать их более впечатляющими, то Plotly — это именно то, что вам нужно!

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

Начнем с простого примера. Допустим, у вас есть данные о продажах разных продуктов, и вы хотите визуализировать их в виде столбчатой диаграммы:

import plotly.graph_objects as go

categories = ['Продукт A', 'Продукт B', 'Продукт C']
values = [150, 200, 250]

fig = go.Figure([go.Bar(x=categories, y=values)])
fig.show()


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

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

import plotly.express as px
import pandas as pd

data = pd.DataFrame({
'month': ['Январь', 'Февраль', 'Март', 'Апрель'],
'sales': [2000, 3000, 4000, 3500]
})

fig = px.line(data, x='month', y='sales', title='Динамика продаж')
fig.show()


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

Plotly в полной мере раскрывает свой потенциал при работе с картами и 3D-графиками, что делает его незаменимым в мире больших данных и геовизуализаций.

Теперь, вооружившись этими знаниями, вы можете создавать прекрасные интерактивные графики для любого случая. Начните использовать Plotly в своих проектах, и увидите, насколько обогащается ваш опыт работы с данными. В следующий раз мы поговорим о других полезных библиотеках для Python-программистов. Оставайтесь с нами!
👍2🔥1
Создание GUI приложений с использованием Tkinter
Привет, начинающие маги Python! Сегодня у нас захватывающее приключение в мир создания графических приложений. Если вы когда-либо мечтали сделать свое собственное приложение с кнопками и вводом данных, то вы попали по адресу. Знакомьтесь, это Tkinter – ваш верный спутник на пути к созданию GUI-программ.

Что же такое Tkinter? Это библиотека, которая позволяет нам создавать окна, кнопки, поля ввода и массу других графических элементов на языке Python. Tkinter входит в стандартную библиотеку Python, что делает его доступным прямо "из коробки".

Начнем с создания простого окна. Это как раз тот момент, когда мы открываем "волшебную книгу" и делаем первый шаг в мир GUI.

import tkinter as tk

root = tk.Tk()
root.title("Мое первое приложение")
root.geometry("300x200")

root.mainloop()


В этом небольшом кусочке кода мы импортировали библиотеку tkinter и создали главное окно. Метод mainloop() заставляет наше приложение работать и реагировать на события.

Теперь добавим в наше окно немного интерактивности с помощью кнопки:

def on_button_click():
print("Кнопка нажата!")

button = tk.Button(root, text="Нажми меня", command=on_button_click)
button.pack()


Сначала мы создали функцию, которая будет выполняться при нажатии кнопки. Затем, с помощью функции Button, добавили кнопку в наше окно. Метод pack() заботится о расстановке элементов. Вуаля, у нас уже есть интерактивное приложение!

Tkinter также позволяет работать с полями ввода. Давайте добавим поле, в которое пользователь сможет вводить текст:

entry = tk.Entry(root)
entry.pack()

def show_entry_data():
user_input = entry.get()
print(f"Вы ввели: {user_input}")

show_button = tk.Button(root, text="Показать текст", command=show_entry_data)
show_button.pack()


Здесь мы создаем объект Entry, представляющий поле ввода, и добавляем кнопку, которая выводит введенный текст в консоль.

Можно продолжать бесконечно, добавляя новые элементы и функциональность: списки, выпадающие меню, и даже сложные интерфейсы с помощью библиотеки Tkinter. Это мощный инструмент, который при должном старании поможет создать приложение мечты.

Теперь у вас есть все необходимое для начала работы с Tkinter! Исследуйте, экспериментируйте и создавайте. Помните, в программировании, как и в магии, возможности ограничены лишь вашим воображением. Удачи в создании ваших первых графических приложений!
👍5🔥2
Основы многопоточности и асинхронного программирования
В мире программирования Python многопоточность и асинхронное программирование — это словно две параллельные вселенные, которые могут сделать ваш код не только эффективнее, но и значительно сложнее для восприятия. Тем не менее, освоение этих техник — шаг к вашему росту как программиста. Что ж, давайте разбираться!

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

Пример кода с использованием модуля threading:

import threading

def print_numbers():
for i in range(5):
print(f"Number: {i}")

def print_letters():
for letter in 'abcde':
print(f"Letter: {letter}")

thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)

thread1.start()
thread2.start()

thread1.join()
thread2.join()


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

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

Пример кода с использованием asyncio:

import asyncio

async def print_numbers():
for i in range(5):
print(f"Number: {i}")
await asyncio.sleep(1)

async def print_letters():
for letter in 'abcde':
print(f"Letter: {letter}")
await asyncio.sleep(1)

async def main():
task1 = asyncio.create_task(print_numbers())
task2 = asyncio.create_task(print_letters())

await task1
await task2

asyncio.run(main())


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

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

Надеюсь, этот краткий экскурс в параллельные миры многопоточности и асинхронности зажег ваш интерес к изучению этих мощных инструментов. Ведь с их помощью ваш Python-код станет еще более эффективным и мощным!
👍6🔥2
Основы тестирования кода: Юнит-тестирование в Python
Загляните в мир программирования, и вы неизбежно столкнетесь с понятием тестирования. Это одна из тех тем, о которой все говорят, но мало кто уделяет ей должное внимание, пока не окажется слишком поздно. Сегодня мы окунемся в мир юнит-тестирования в Python, и, поверьте, это путешествие будет увлекательнее, чем кажется.

Итак, представьте, что ваш код — это замок из песка. Он может выглядеть внушительно, пока не придет первое напряжение или ошибка, которая рушит всю конструкцию. Юнит-тестирование — это ваша защита, способ убедиться, что ваш замок не развалится даже от сильного ветра.

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

Начнем с простого примера. Представьте, что у нас есть функция, которая возвращает квадрат числа:

def square(x):
return x * x


Первая реакция: "Эта функция проста, ей тесты не нужны!" Но представьте, что в один момент функция изменилась, и вместо умножения она начала использовать сложение. Запомните: тесты — это ваши преданные друзья, которые не дадут вам оступиться.

Напишем для неё тест:

import unittest

class TestMathFunctions(unittest.TestCase):
def test_square(self):
self.assertEqual(square(2), 4)
self.assertEqual(square(-3), 9)
self.assertEqual(square(0), 0)

if __name__ == '__main__':
unittest.main()


Здесь мы создали класс TestMathFunctions, который наследует unittest.TestCase. Метод test_square проверяет нашу функцию square с несколькими значениями. Запуская этот файл, мы мгновенно узнаем, если что-то пойдёт не так.

Но что, если вам нужно учитывать больше, чем просто квадратное число? Представьте, у нас есть функция, переводящая градусы Цельсия в Фаренгейты:

def celsius_to_fahrenheit(c):
return (c * 9/5) + 32


И снова тесты приходят на помощь:

class TestConversionFunctions(unittest.TestCase):
def test_celsius_to_fahrenheit(self):
self.assertAlmostEqual(celsius_to_fahrenheit(0), 32)
self.assertAlmostEqual(celsius_to_fahrenheit(100), 212)


Функция assertAlmostEqual позволяет учитывать незначительные погрешности, которые могут возникнуть из-за особенностей вычислений.

Юнит-тестирование — это как раз тот момент, когда вы становитесь героем для будущего себя. Оно не только помогает ловить ошибки на ранних этапах, но и позволяет уверенно вносить изменения в код. И самое главное — это просто и быстро! Откройте для себя тестирование, и пускай ваш код будет устойчив, словно дом кирпичный, а не песочный замок.
🔥3
Настройка виртуального окружения для проектов на Python
Настройка виртуального окружения для проектов на Python: магия изоляции

В программировании всегда наступает тот момент, когда ты понимаешь, что пора уходить от хаоса и создавать порядок. Работа с Python проектами — не исключение. На ранних стадиях разработки можно незаметно оказаться в ловушке, когда различные проекты начинают конфликтовать друг с другом из-за несовместимых зависимостей. В такие моменты на помощь приходят виртуальные окружения — наша спасительная палочка-выручалочка. Давайте же разберёмся, как настроить это чудо!

Представьте себе ситуацию: у вас есть два проекта, и для одного требуется библиотека pandas версии 1.2.4, а для другого — свежая версия 1.3.0. Если вы начнёте устанавливать их глобально, очень скоро вы рискуете окунуться в море ошибок. Виртуальные окружения позволяют изолировать зависимости каждого проекта, как будто они каждый живут в своем маленьком пузыре.

Начнём с самого начала. Имея на своём устройстве установленный Python (если ещё не установлено, то в интернете масса инструкций по установке), мы уже готовы к созданию виртуальных окружений. Для этого существует встроенный модуль venv. Чтобы создать виртуальное окружение, достаточно выполнить команду:

python -m venv myproject_env


Здесь myproject_env — это название вашего виртуального окружения. Придумайте любое имя, которое позволит вам быстро понять, для какого проекта это окружение.

После создания, виртуальное окружение необходимо активировать. Это всё равно, что разбудить его ото сна. На Windows это делается так:

myproject_env\Scripts\activate


На macOS и Linux всё немного иначе:

source myproject_env/bin/activate


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

pip install pandas==1.2.4


Иногда, после долгой работы, может оказаться, что вам нужно выйти из виртуального окружения и вернуться в реальный мир. Просто выполните команду:

deactivate


Вот и всё! Теперь вы знаете, как удержать хаос в узде и сделать так, чтобы каждый ваш проект жил своей жизнью, не мешая остальным. Настройка виртуального окружения — это один из ключевых элементов профессиональной разработки. Используйте эту магию изоляции в своих проектах и продолжайте прогрессировать в мире Python!
👍5🔥2
Работа с базами данных: Введение в SQLite в Python
Приветствую тебя, дорогой читатель! Сегодня мы с тобой отправимся в невероятное путешествие в мир баз данных. И в качестве нашего верного спутника выступит язык программирования Python. Готов? Тогда заваривай чай, устраивайся поудобнее — мы погружаемся в дебри SQLite!

Начнем с самого главного — почему SQLite? Это простейшая в настройке и использовании база данных. Она встроена в сам Python, не требует установки дополнительных серверов и идеально подходит для небольших проектов или локальных приложений. Представь себе карманный нож швейцарской армии — маленький, компактный и невероятно полезный. Именно таким инструментом является SQLite в мире баз данных.

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

import sqlite3

# Создание подключения
connection = sqlite3.connect('mydatabase.db')

# Создание курсора
cursor = connection.cursor()

# Создание таблицы
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL
)
''')

# Подтверждение изменений
connection.commit()

# Закрытие подключения
connection.close()


Что мы здесь видим? Мы создаем подключение к файлу базы данных mydatabase.db. Если файла не существует, он будет создан автоматически! Далее с помощью курсора (нет, не компьютерного, а специального объекта для работы с запросами) мы создаем таблицу users.

Хорошо, таблицу мы создали. А как насчет добавления данных? Давай научимся добавлять нового пользователя в нашу таблицу.

def add_user(name, age):
connection = sqlite3.connect('mydatabase.db')
cursor = connection.cursor()

cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', (name, age))

connection.commit()
connection.close()

add_user('Alice', 30)
add_user('Bob', 25)


Вот так просто мы добавили двух пользователей — Алису и Боба — в нашу базу данных. Обрати внимание на использование ? внутри SQL-запроса. Это позволяет защититься от SQL-инъекций, доверяя вводимые данные SQLite.

А как же извлечение данных? Давай достанем всех пользователей и выведем их на экран.

def fetch_users():
connection = sqlite3.connect('mydatabase.db')
cursor = connection.cursor()

cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()

for row in rows:
print(row)

connection.close()

fetch_users()


И voilà! Мы видим весь список наших пользователей. Здесь, в светлом будущем работы с базами данных, твои навыки в Python помогут создавать мощные и эффективные решения. Надеюсь, этот небольшой экскурс вдохновил тебя покорить новые горизонты!

Спасибо за внимание, надеюсь, ты узнал что-то новое. Если так, то мы уже достигли цели этого поста!
🔥2👍1
Как работать с изображениями с помощью PIL и OpenCV
Привет, дорогие читатели! Сегодня я расскажу вам о мире обработки изображений в Python с помощью двух популярных библиотек: PIL (Python Imaging Library) и OpenCV. Эти инструменты позволяют нам легко и эффективно работать с изображениями, и вы удивитесь, насколько это просто и увлекательно!

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

from PIL import Image

# Загрузка изображения
img = Image.open("example.jpg")

# Вывод размерности изображения
print(f"Image size: {img.size}")

# Сохранение изображения в другом формате
img.save("example.png")


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

from PIL import ImageFilter

# Применение размытия
blurred_img = img.filter(ImageFilter.BLUR)
blurred_img.save("blurred_example.jpg")


Теперь представьте, что вам нужно не просто отредактировать изображения, но и обрабатывать видео в реальном времени. Здесь на помощь приходит OpenCV. Эта библиотека подходит для более сложных вычислительных задач и поддерживает работу с видео. Начнем с простого примера: чтение и отображение изображения.

import cv2

# Загрузка изображения
img_cv = cv2.imread("example.jpg")

# Отображение изображения в отдельном окне
cv2.imshow('Displayed Image', img_cv)
cv2.waitKey(0)
cv2.destroyAllWindows()


Совсем несложно, правда? OpenCV также обладает мощным функционалом для таких задач, как преобразование в градации серого, обнаружение краев и многое другое. Давайте попробуем преобразовать наше изображение в оттенки серого:

# Преобразование изображения в градации серого
gray_img = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
cv2.imwrite("gray_example.jpg", gray_img)


А для более динамичных задач, как, например, работа с видео, вы можете использовать OpenCV для захвата и отображения потокового видео:

cap = cv2.VideoCapture(0)  # Открытие камеры

while True:
ret, frame = cap.read()
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

cv2.imshow('Video Stream', gray_frame)

if cv2.waitKey(1) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()


Пара строк кода — и вы уже обрабатываете видеопоток в режиме реального времени!

Использование таких библиотек, как PIL и OpenCV, открывает множество возможностей для обработки изображений. От редактирования фото до сложных аудиовизуальных проектов — всё это по силам каждому, вооружившемуся базовыми знаниями Python и хорошей дозой креативности! Удачи в ваших экспериментах и до новых запусков!
👍2🔥2
Использование регулярных выражений для поиска и замены
Привет, друзья! Сегодня мы с вами отправимся в захватывающее путешествие по миру регулярных выражений в Python. Эти маленькие магические заклинания помогают нам искать, извлекать и заменять текстовые данные с фантастической точностью и ловкостью.

Регулярные выражения в Python реализованы в модуле re. Представьте, что вам нужно найти все email-адреса в тексте. Мы могли бы обратиться к re, как к верному спутнику в этом деле. С помощью регулярных выражений мы сможем выудить их за считаные секунды!

Давайте рассмотрим маленький примерчик:

import re

text = "Contact us at: info@example.com or support@site.org"
emails = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b', text)
print(emails)


Что тут происходит? С помощью функции re.findall мы запускаем поиск по строке text. Наше "заклинание" r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b' выглядит как нечто таинственное, но на самом деле оно просто описывает, как выглядит email. И вот, мы поймали двух хитрецов — наши адреса!

Но поиск — это лишь полдела, часто нам хочется не только найти, но и подправить те самые строки. Допустим, мы решили, что все упоминания "test" в тексте надо заменить на "exam". Что ж, re.sub нам в помощь!

pattern = r'test'
replacement = 'exam'
text = "This is just a test."
new_text = re.sub(pattern, replacement, text)
print(new_text)


И вот, наш тест превратился в экзамен, а мы даже не успели испугаться! re.sub позволяет заменить все вхождения заданного шаблона на то, что мы пожелаем.

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

Вот и все на сегодня! Надеюсь, вы получили удовольствие и вдохновение попробовать свои силы с регулярными выражениями. Они могут привести небольшую магию в ваш код, позволяя вам писать более эффективные и лаконичные программы. До встречи в следующем посте!
👍5🔥2