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

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

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

### Шаг 1: Создание базы данных

Сначала определим структуру базы данных и создадим её. Ниже приведен код для инициализации базы данных:

import sqlite3

def init_db():
conn = sqlite3.connect('quotes.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS actors (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL)''')
c.execute('''CREATE TABLE IF NOT EXISTS quotes (
id INTEGER PRIMARY KEY,
actor_id INTEGER,
quote TEXT NOT NULL,
FOREIGN KEY (actor_id) REFERENCES actors (id))''')
conn.commit()
conn.close()

init_db()


### Шаг 2: Наполнение базы данных

Для демонстрации добавим несколько актеров и цитат вручную. Вы можете добавить больше данных по своему усмотрению.

python
def add_sample_data():
actors = [('Morgan Freeman',), ('Tom Hanks',)]
quotes = [
(1, "Get busy living, or get busy dying."),
(2, "Life is like a box of chocolates, you never know what you're gonna get.")
]
conn = sqlite3.connect('quotes.db')
c = conn.cursor()
c.executemany('INSERT INTO actors (name) VALUES (?)', actors)
c.executemany('INSERT INTO quotes (actor_id, quote) VALUES (?, ?)', quotes)
conn.commit()
conn.close()

add_sample_data()


### Шаг 3: Создание Flask приложения

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

python
from flask import Flask, render_template, request, redirect, url_for
import sqlite3
import random

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
actor_id = request.form.get('actor')
return redirect(url_for('quote', actor_id=actor_id))
else:
conn = sqlite3.connect('quotes.db')
c = conn.cursor()
c.execute('SELECT * FROM actors')
actors = c.fetchall()
conn.close()
return render_template('index.html', actors=actors)

@app.route('/quote/<int:actor_id>')
def quote(actor_id):
conn = sqlite3.connect('quotes.db')
c = conn.cursor()
c.execute('SELECT quote FROM quotes WHERE actor_id=? ORDER BY RANDOM() LIMIT 1', (actor_id,))
quote = c.fetchone()
conn.close()
return render_template('quote.html', quote=quote[0] if quote else "No quotes found.")

if __name__ == '__main__':
app.run(debug=True)


### Шаг 4: Создание шаблонов HTML

Создайте папку templates и внутри нее файлы index.html и quote.html.

index.html

html
<!DOCTYPE html>
<html>
<head>
<title>Select an Actor</title>
</head>
<body>
<h1>Select an Actor</h1>
<form method="post">
<select name="actor">
{% for actor in actors %}
<option value="{{ actor[0] }}">{{ actor[1] }}</option>
{% endfor %}
</select>
<input type="submit" value="Get Quote">
</form>
</body>
</html>


quote.html

html
<!DOCTYPE html>
<html>
<head>
<title>Quote</title>
</head>
<body>
<h1>Quote</h1>
<p>{{ quote }}</p>
<a href="/">Choose another actor</a>
</body>
</html>


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

Подпишись 👉🏻 @KodduuPython 🤖
Давайте создадим файл app.py, который будет включать добавление актеров и цитат в базу данных, а также функциональность для выбора актера и отображения случайной цитаты. Этот пример предполагает, что у вас уже создана база данных и таблицы в соответствии с предыдущими инструкциями.

### app.py

from flask import Flask, render_template, request, g
import sqlite3

app = Flask(__name__)
DATABASE = 'quotes.db'

def get_db():
db = getattr(g, '_database', None)
if db is None:
db = g._database = sqlite3.connect(DATABASE)
db.row_factory = sqlite3.Row
return db

@app.teardown_appcontext
def close_connection(exception):
db = getattr(g, '_database', None)
if db is not None:
db.close()

def init_db():
with app.app_context():
db = get_db()
with open('schema.sql', mode='r') as f:
db.cursor().executescript(f.read())
db.commit()

def add_sample_data():
actors = [('Morgan Freeman',), ('Tom Hanks',)]
quotes = [
(1, "Get busy living, or get busy dying."),
(2, "Life is like a box of chocolates, you never know what you're gonna get.")
]
db = get_db()
db.executemany('INSERT INTO actors (name) VALUES (?)', actors)
db.executemany('INSERT INTO quotes (actor_id, quote) VALUES (?, ?)', quotes)
db.commit()

@app.route('/')
def index():
db = get_db()
actors = db.execute('SELECT * FROM actors').fetchall()
return render_template('index.html', actors=actors)

@app.route('/quote', methods=['POST'])
def quote():
actor_id = request.form['actor']
db = get_db()
quote = db.execute('SELECT quote FROM quotes WHERE actor_id = ? ORDER BY RANDOM() LIMIT 1', (actor_id,)).fetchone()
actor_name = db.execute('SELECT name FROM actors WHERE id = ?', (actor_id,)).fetchone()
return render_template('quote.html', quote=quote['quote'] if quote else "No quotes found.", actor_name=actor_name['name'] if actor_name else "Unknown")

if __name__ == '__main__':
with app.app_context():
init_db() # Инициализация базы данных
add_sample_data() # Добавление начальных данных
app.run(debug=True)

### Шаблоны 👉 в следующем посте

Перед запуском приложения убедитесь, что вы запустили функции init_db() и add_sample_data() хотя бы один раз, чтобы инициализировать базу данных и добавить в нее начальные данные. После инициализации и добавления данных эти вызовы можно закомментировать или удалить, чтобы избежать повторного создания таблиц и добавления тех же данных при каждом запуске приложения.

Подпишись 👉🏻 @KodduuPython 🤖
Шаблоны:

### Шаг 1: Создание файла app.py 👉 смотрите предыдущий пост

### Шаг 2: Создание схемы базы данных в файле schema.sql

Создайте файл schema.sql в той же директории, что и app.py. Этот файл будет содержать SQL-команды для создания таблиц базы данных.

sql
DROP TABLE IF EXISTS actors;
DROP TABLE IF EXISTS quotes;

CREATE TABLE actors (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL
);

CREATE TABLE quotes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
actor_id INTEGER,
quote TEXT NOT NULL,
FOREIGN KEY (actor_id) REFERENCES actors(id)
);


### Шаг 3: Создание шаблонов HTML

Создайте папку templates в той же директории, что и app.py, и добавьте в нее следующие файлы:

index.html

html
<!DOCTYPE html>
<html>
<head>
<title>Select an Actor</title>
</head>
<body>
<h1>Select an Actor</h1>
<form method="post" action="/quote">
<select name="actor">
{% for actor in actors %}
<option value="{{ actor['id'] }}">{{ actor['name'] }}</option>
{% endfor %}
</select>
<input type="submit" value="Get Quote">
</form>
</body>
</html>


quote.html

html
<!DOCTYPE html>
<html>
<head>
<title>Quote</title>
</head>
<body>
<h1>Quote</h1>
<p>{{ quote }}</p>
<a href="/">Choose another actor</a>
</body>
</html>


### Запуск программы

Перед первым запуском убедитесь, что вы вызвали init_db() для инициализации базы данных. После первого запуска вы можете закомментировать эту строку, чтобы предотвратить повторное создание таблиц. Если вы хотите добавить в базу данных начальные данные, раскомментируйте add_sample_data()

Подпишись 👉🏻 @KodduuPython 🤖
👉 Весенняя скидка на курс Python: самый быстрый курс 🌱 Курс для тех кому некогда, но быстро нужно выучить Python, или повторить перед собеседованием/экзаменом🤖
Для создания простой системы хранения данных о генеологическом древе на Python с использованием SQLite, мы можем определить базу данных, которая будет содержать таблицы для хранения информации о людях и их отношениях друг с другом. В этом примере я покажу, как создать такую систему, включая начальные данные для демонстрации.

### Шаг 1: Определение структуры базы данных

Для нашей базы данных потребуются минимум две таблицы:
- Persons: для хранения информации о каждом человеке.
- Relationships: для хранения информации об отношениях между людьми (например, родитель-ребенок).

### Шаг 2: Создание и инициализация базы данных

import sqlite3

def init_db():
conn = sqlite3.connect('genealogy.db')
c = conn.cursor()
c.execute('''
CREATE TABLE IF NOT EXISTS persons (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
birth_year INTEGER,
death_year INTEGER
)
''')
c.execute('''
CREATE TABLE IF NOT EXISTS relationships (
person_id INTEGER,
parent_id INTEGER,
FOREIGN KEY (person_id) REFERENCES persons (id),
FOREIGN KEY (parent_id) REFERENCES persons (id)
)
''')
conn.commit()
conn.close()

init_db()


### Шаг 3: Добавление примеров данных

python
def add_sample_data():
conn = sqlite3.connect('genealogy.db')
c = conn.cursor()
# Добавление людей
persons = [
('John Doe', 1960, None),
('Jane Doe', 1965, None),
('Jimmy Doe', 1988, None),
('Jenny Doe', 1990, None)
]
c.executemany('INSERT INTO persons (name, birth_year, death_year) VALUES (?, ?, ?)', persons)

# Получение ID добавленных людей
c.execute("SELECT id FROM persons WHERE name='John Doe'")
john_id = c.fetchone()[0]
c.execute("SELECT id FROM persons WHERE name='Jane Doe'")
jane_id = c.fetchone()[0]
c.execute("SELECT id FROM persons WHERE name='Jimmy Doe'")
jimmy_id = c.fetchone()[0]
c.execute("SELECT id FROM persons WHERE name='Jenny Doe'")
jenny_id = c.fetchone()[0]

# Добавление отношений
relationships = [
(jimmy_id, john_id),
(jimmy_id, jane_id),
(jenny_id, john_id),
(jenny_id, jane_id)
]
c.executemany('INSERT INTO relationships (person_id, parent_id) VALUES (?, ?)', relationships)

conn.commit()
conn.close()

add_sample_data()


### Шаг 4: Функции для работы с базой данных

python
def get_person_by_name(name):
conn = sqlite3.connect('genealogy.db')
c = conn.cursor()
c.execute('SELECT * FROM persons WHERE name=?', (name,))
person = c.fetchone()
conn.close()
return person

def get_parents_of_person(person_id):
conn = sqlite3.connect('genealogy.db')
c = conn.cursor()
c.execute('SELECT parent_id FROM relationships WHERE person_id=?', (person_id,))
parent_ids = c.fetchall()
parents = []
for parent_id in parent_ids:
c.execute('SELECT * FROM persons WHERE id=?', (parent_id[0],))
parents.append(c.fetchone())
conn.close()
return parents

# Пример использования
person = get_person_by_name('Jimmy Doe')
if person:
print(f"Person: {person[1]}, Born: {person[2]}")
parents = get_parents_of_person(person[0])
for parent in parents:
print(f"Parent: {parent[1]}, Born: {parent[2]}")


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

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

### Шаг 1: Установка необходимых библиотек

Если у вас еще не установлены pandas и matplotlib, вы можете установить их с помощью pip:

bash
pip install pandas matplotlib


### Шаг 2: Создание и анализ данных

Предположим, у нас есть набор данных о погоде в формате CSV с колонками: Date, Temperature, Precipitation, и WindSpeed. В этом примере мы сгенерируем простой набор данных прямо в коде.

import pandas as pd
import matplotlib.pyplot as plt

# Генерация примера данных
data = {
'Date': pd.date_range(start='2023-01-01', end='2023-12-31', freq='D'),
'Temperature': pd.np.random.normal(20, 5, 365), # Средняя температура 20, стандартное отклонение 5
'Precipitation': pd.np.random.randint(0, 20, 365), # Осадки в мм
'WindSpeed': pd.np.random.randint(0, 15, 365) # Скорость ветра в км/ч
}

# Создание DataFrame
df = pd.DataFrame(data)

# Установка Date как индекса DataFrame
df.set_index('Date', inplace=True)

# Анализ данных: Средняя температура по месяцам
monthly_temp = df['Temperature'].resample('M').mean()

# Визуализация
monthly_temp.plot(kind='bar', color='skyblue')
plt.title('Средняя месячная температура')
plt.xlabel('Месяц')
plt.ylabel('Температура, °C')
plt.xticks(rotation=45)
plt.show()


### Обратите внимание

В коде выше используется метод resample('M').mean() для группировки данных по месяцам и расчета средней температуры в каждом месяце. Затем мы используем matplotlib для построения столбчатой диаграммы, которая показывает среднюю температуру по месяцам.

### Важно

В коде использовалось pd.np.random, однако начиная с версий Pandas, где pd.np является устаревшим, рекомендуется использовать напрямую numpy для генерации случайных чисел:

import numpy as np

# Используйте np.random.normal и np.random.randint вместо pd.np


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

Подпишись 👉🏻 @KodduuPython 🤖
Давайте создадим простой пример скрипта на Python, который использует библиотеку requests для отправки HTTP-запросов и BeautifulSoup из bs4 для парсинга HTML-страниц. Этот скрипт будет получать заголовки новостей с веб-сайта новостей и выводить их. Это простой пример веб-скрейпинга.

### Шаг 1: Установка необходимых библиотек

Если у вас еще не установлены requests и beautifulsoup4, вы можете установить их с помощью pip:

bash
pip install requests beautifulsoup4


### Шаг 2: Написание скрипта для веб-скрейпинга

В этом примере мы будем извлекать заголовки с главной страницы Python.org и выводить их.

python
import requests
from bs4 import BeautifulSoup

# URL, который мы будем скрейпить
url = 'https://python.org/'

# Отправка HTTP-запроса GET к URL
response = requests.get(url)

# Проверка успешного ответа
if response.status_code == 200:
# Создание объекта BeautifulSoup для парсинга HTML
soup = BeautifulSoup(response.text, 'html.parser')

# Поиск всех элементов <a> внутри блока с id 'top'
headlines = soup.find(id='top').find_all('a')

# Вывод текста каждой найденной ссылки
for headline in headlines:
print(headline.text.strip())
else:
print('Не удалось получить содержимое страницы')


### Обратите внимание

- Этот код использует requests для получения HTML-кода страницы https://python.org/.
- BeautifulSoup используется для парсинга полученного HTML и извлечения нужной информации. В этом случае мы ищем все ссылки (<a>) в блоке с ID top.
- В реальных задачах веб-скрейпинга важно учитывать политику использования сайта в отношении автоматизированного доступа к его содержимому. Всегда проверяйте файл robots.txt на сайте и уважайте его указания.

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

Подпишись 👉🏻 @KodduuPython 🤖
🆒2
Давайте создадим пример Python скрипта, который использует библиотеку nltk (Natural Language Toolkit) для анализа текста и определения частоты слов. Этот скрипт будет полезен для выполнения базового анализа текстовых данных, например, для выявления наиболее часто встречающихся слов в тексте.

### Шаг 1: Установка необходимых библиотек

Если у вас еще не установлен nltk, вы можете установить его с помощью pip:

bash
pip install nltk


После установки вам, возможно, потребуется загрузить некоторые ресурсы NLTK, такие как токенизаторы и списки стоп-слов. Это можно сделать с помощью NLTK Downloader.

### Шаг 2: Написание скрипта для анализа текста

import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from collections import Counter

# Загрузка необходимых ресурсов NLTK
nltk.download('punkt')
nltk.download('stopwords')

# Пример текста для анализа
text = """Natural language processing (NLP) is a field of computer science, artificial intelligence,
and linguistics concerned with the interactions between computers and human (natural) languages.
As such, NLP is related to the area of human-computer interaction. Many challenges in NLP involve
natural language understanding, that is, enabling computers to derive meaning from human or natural language input."""

# Токенизация текста
tokens = word_tokenize(text)

# Приведение к нижнему регистру и удаление пунктуации и стоп-слов
words = [word.lower() for word in tokens if word.isalpha()]
filtered_words = [word for word in words if not word in stopwords.words('english')]

# Подсчет частоты слов
word_counts = Counter(filtered_words)

# Вывод 10 наиболее часто встречающихся слов
most_common_words = word_counts.most_common(10)
print("Наиболее часто встречающиеся слова:")
for word, count in most_common_words:
print(f"{word}: {count}")


### Обратите внимание

- Скрипт использует nltk для токенизации текста, что является процессом разбиения текста на слова или фразы.
- Затем текст фильтруется для удаления стоп-слов (слов, которые встречаются слишком часто, чтобы быть полезными для анализа, например, "the", "is", "in") и пунктуации.
- После фильтрации используется Counter из модуля collections для подсчета частоты встречаемости каждого слова в тексте.
- В конце скрипт выводит 10 наиболее часто встречающихся слов в тексте.

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

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

### Шаг 1: Установка необходимых библиотек

Если у вас еще не установлены scikit-learn, pandas и numpy, вы можете установить их с помощью pip:

bash
pip install numpy pandas scikit-learn


### Шаг 2: Подготовка данных

В этом примере мы используем упрощенную версию набора данных о пассажирах Титаника. Предположим, что у нас есть DataFrame df, который содержит следующие колонки: Survived (целевая переменная, 1 если пассажир выжил, 0 если нет), Pclass (класс билета), Sex (пол), и Age (возраст).

### Шаг 3: Написание скрипта

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# Загрузка данных (пример, предполагается, что df уже загружен)
data = {
'Survived': [0, 1, 1, 1, 0, 0],
'Pclass': [3, 1, 3, 1, 3, 3],
'Sex': ['male', 'female', 'female', 'female', 'male', 'male'],
'Age': [22, 38, 26, 35, 35, 30]
}
df = pd.DataFrame(data)

# Преобразование категориальных переменных в числовые
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])

# Разделение данных на признаки (X) и целевую переменную (y)
X = df.drop('Survived', axis=1)
y = df['Survived']

# Разделение данных на обучающий и тестовый наборы
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Создание и обучение модели логистической регрессии
model = LogisticRegression()
model.fit(X_train, y_train)

# Предсказание на тестовых данных
predictions = model.predict(X_test)

# Оценка модели
accuracy = accuracy_score(y_test, predictions)
print(f'Точность модели: {accuracy:.2f}')


### Обратите внимание

- В этом примере мы используем очень упрощенные данные и не учитываем многие важные аспекты предобработки данных (например, заполнение пропущенных значений в Age).
- В реальных задачах машинного обучения важно тщательно подготовить данные, возможно, применить более сложные методы для обработки категориальных переменных (например, one-hot encoding вместо LabelEncoding) и выбрать подходящую модель после сравнения нескольких кандидатов.

Этот пример демонстрирует базовое использование scikit-learn для создания и оценки модели машинного обучения. Вы можете использовать этот подход как отправную точку для более сложных проектов в области машинного обучения.

Подпишись 👉🏻 @KodduuPython 🤖
👀2
Создадим простой симулятор торнадо на Python. Для этого мы воспользуемся библиотекой matplotlib для визуализации и numpy для математических расчётов. Симулятор будет создавать изображение, на котором торнадо будет представлено в виде спирали с изменяющимся радиусом.

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

pip install matplotlib numpy


Теперь давайте напишем код симулятора торнадо:

1. Импортируем необходимые библиотеки.
2. Создадим функцию для генерации координат точек, формирующих спираль торнадо.
3. Визуализируем торнадо с помощью matplotlib.

import numpy as np
import matplotlib.pyplot as plt

def generate_tornado_points(num_points=1000):
# Генерируем углы для спирали
theta = np.linspace(0, 30 * np.pi, num_points)

# Радиус изменяется от 1 до 10, потом уменьшается до 1, создавая форму торнадо
radius = np.linspace(1, 10, num_points // 2)
radius = np.concatenate([radius, radius[::-1]])

# Рассчитываем координаты x и y
x = radius * np.cos(theta)
y = radius * np.sin(theta)

# Возвращаем координаты
return x, y

def plot_tornado():
x, y = generate_tornado_points()

plt.figure(figsize=(6, 12))
plt.plot(x, y)
plt.title('Симулятор торнадо')
plt.axis('equal')
plt.show()

# Запускаем симулятор
plot_tornado()


Этот код создаст базовую визуализацию торнадо в виде спирали. Вы можете изменить параметры, такие как количество точек (num_points) или масштаб радиуса, чтобы экспериментировать с разными формами и размерами торнадо.

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

import numpy as np
import matplotlib.pyplot as plt

# Определение параметров для спирали
height = np.linspace(0, 2*np.pi, 100) # Высота от 0 до 2π
radius = np.linspace(0.1, 1, 100) # Радиус изменяется от 0.1 до 1
theta = 8 * np.pi * height # Угол вращения спирали
noise = np.random.uniform(-0.1, 0.1, size=height.shape) # Случайные колебания

# Реалистичная спираль торнадо
x = (radius + noise) * np.cos(theta)
y = (radius + noise) * np.sin(theta)
z = height

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(x, y, z)

ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
plt.title('Реалистичная спираль торнадо')
plt.show()


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

Подпишись 👉🏻 @KodduuPython 🤖
Реалистичная спираль торнадо 🌪
Для симуляции молнии мы можем использовать модель случайного блуждания, также известную как процесс Леви. Этот процесс имитирует хаотичное и ветвящееся движение молнии в атмосфере. Основная идея состоит в том, чтобы начать с начальной точки и на каждом шаге случайным образом выбирать направление и длину шага, при этом вероятность больших шагов будет меньше, чем маленьких. Также можно добавить ветвление, чтобы имитировать боковые разряды молнии. Попробуем реализовать это.

import matplotlib.pyplot as plt
import numpy as np


def generate_lightning(steps=100, branching_chance=0.1):
# Начальные координаты
x = [0]
y = [0]

for i in range(steps):
angle = np.random.uniform(0, 2 * np.pi)
length = np.random.exponential(scale=1) # Экспоненциальное распределение для длины шага

x.append(x[-1] + np.cos(angle) * length)
y.append(y[-1] + np.sin(angle) * length)

# Ветвление
if np.random.rand() < branching_chance:
branch_length = int(np.random.rand() * steps * 0.2) # Длина ветви
branch_x, branch_y = generate_lightning(branch_length, branching_chance / 2)
x += [x[-1] + bx for bx in branch_x]
y += [y[-1] + by for by in branch_y]

return x, y


# Генерация молнии
x, y = generate_lightning()

plt.figure(figsize=(6, 10))
plt.plot(x, y, color="blue")
plt.axis('equal')
plt.axis('off')
plt.title('Симуляция молнии')
plt.show()


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

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