sequence[start:stop:step]
🔹
start – начальный индекс (по умолчанию 0).🔹
stop – конечный индекс (не включается!).🔹
step – шаг (по умолчанию 1).
lst = [0, 1, 2, 3, 4, 5]
print(lst[1:4]) # [1, 2, 3] (элементы с индекса 1 по 3)
print(lst[:3]) # [0, 1, 2] (с начала до индекса 2)
print(lst[::2]) # [0, 2, 4] (каждый второй элемент)
print(lst[::-1]) # [5, 4, 3, 2, 1, 0] (разворот списка)
⚡ Итог: срезы позволяют легко работать с последовательностями без циклов и лишнего кода!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2
Когда pandas начинает задыхаться на гигабайтах данных — не надо переписывать код.
Просто меняешь библиотеку — и Python начинает считать на всех ядрах и даже на кластере.
import pandas as pd
df = pd.read_csv("data.csv")
df.groupby("city").sum()
🧩 Dask подключает все ядра
import dask.dataframe as dd
df = dd.read_csv("data.csv")
df.groupby("city").sum().compute()
Всё летит параллельно.
from dask.distributed import Client
client = Client("tcp://scheduler:8786")
Каждая нода тянет свой кусок данных.
import modin.pandas as pd
df = pd.read_csv("data.csv")
df.groupby("city").sum()
Многоядерность включается автоматически.
🧠 Dask + ML = масштаб
from dask_ml.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X, y)
Больше данных — та же логика.
dask-scheduler &
dask-worker tcp://localhost:8786
localhost:8787 — видишь граф задач, загрузку CPU, память.dask-ctl deploy kubernetes --replicas 8
Kubernetes, AWS, GCP — всё поддерживается.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🔥2❤🔥1
В Python можно распаковывать коллекции в аргументы или структуры — это мощно.
def f(*args, **kwargs):
print(args, kwargs)
f(1, 2, x=10) # (1, 2), {'x': 10}
nums = [1, 2, 3]
print(*nums) # 1 2 3
params = {"sep": " | "}
print(1, 2, 3, **params) # 1 | 2 | 3
a, *middle, b = [1, 2, 3, 4, 5]
print(middle) # [2, 3, 4]
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥3
Когда тебе нужно не просто «читать» блокчейн, а управлять смарт-контрактами — Web3.py становится твоим ключом. Ни лишней магии, просто Python и прямой доступ к Ethereum (или совместимым сетям).
📡 Подключение к сети
from web3 import Web3
w3 = Web3(Web3.HTTPProvider("https://mainnet.infura.io/v3/<token>"))
print(w3.is_connected())
balance = w3.eth.get_balance("0x742d35Cc6634C0532925a3b844Bc454e4438f44e")
print(w3.from_wei(balance, 'ether'))📦 Отправка транзакции
tx = {
'to': '0xRecipientAddress',
'value': w3.to_wei(0.01, 'ether'),
'gas': 21000,
'gasPrice': w3.to_wei('50', 'gwei'),
'nonce': w3.eth.get_transaction_count(sender),
}
signed = w3.eth.account.sign_transaction(tx, private_key)
w3.eth.send_raw_transaction(signed.rawTransaction)abi = json.load(open("contract.abi"))
address = "0xContractAddress"
contract = w3.eth.contract(address=address, abi=abi)value = contract.functions.getData().call()
print(value)
tx = contract.functions.setData(42).build_transaction({
'from': sender,
'nonce': w3.eth.get_transaction_count(sender),
'gas': 200000,
'gasPrice': w3.to_wei('40', 'gwei')
})
signed_tx = w3.eth.account.sign_transaction(tx, private_key)
w3.eth.send_raw_transaction(signed_tx.rawTransaction)events = contract.events.DataChanged.create_filter(fromBlock='latest')
for e in events.get_all_entries():
print(e.args)
block = w3.eth.get_block('latest')
print(block['number'], block['miner'])msg = "Verify ownership"
signed_msg = w3.eth.account.sign_message(encode_defunct(text=msg), private_key)
print(signed_msg.signature.hex())
from eth_account.messages import encode_defunct
signer = w3.eth.account.recover_message(encode_defunct(text=msg), signature=signed_msg.signature)
print(signer)
Комбинируешь Web3.py с FastAPI:
@app.get("/balance/{addr}")
def get_balance(addr):
return {"balance": w3.from_wei(w3.eth.get_balance(addr), 'ether')}Поднимаешь Ethereum-ноду в Docker и подключаешь к Web3.py.
Инфраструктура, тесты, деплой — всё автоматизируется питоновским кодом.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Media is too big
VIEW IN TELEGRAM
В этом видео автор рассказывает, где используется Python и какие реальные задачи он помогает решать — от веб-разработки и анализа данных до машинного обучения и автоматизации процессов.
Показываются основные направления, в которых язык особенно силён, и примеры, как Python используется в крупных проектах и компаниях.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👎1
Когда Python начинает тормозить на тяжёлых вычислениях — не надо бросаться в C. Rust решает проблему безопасно и быстро, а PyO3 делает мост между ними почти без боли.
import rustlib
print(rustlib.sum_numbers([1, 2, 3, 4, 5]))
use pyo3::prelude::*;
#[pyfunction]
fn sum_numbers(nums: Vec<i64>) -> i64 {
nums.iter().sum()
}
#[pymodule]
fn rustlib(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(sum_numbers, m)?)?;
Ok(())
}
maturin develop
#[pyfunction]
fn fib(n: u64) -> u64 {
match n {
0 => 0,
1 => 1,
_ => fib(n-1) + fib(n-2),
}
}
PyO3 сам управляет ссылками, не нужно мучиться с GIL и утечками.
Rust-функции безопасно возвращают значения прямо в Python.
#[pyfunction]
async fn download(url: String) -> PyResult<String> {
Ok(reqwest::get(&url).await?.text().await?)
}
use numpy::{PyArray1, IntoPyArray};
#[pyfunction]
fn double(arr: &PyArray1<f64>) -> Py<PyArray1<f64>> {
let data = arr.as_slice().unwrap();
let doubled: Vec<f64> = data.iter().map(|x| x * 2.0).collect();
Python::with_gil(|py| doubled.into_pyarray(py).to_owned())
}Парсинг, криптография, машинное обучение, обработка JSON — всё, где Python не справляется, Rust добивает.
Cargo + maturin интегрируются в CI/CD.
Сборка Rust-модулей в .whl пакеты — нативно, быстро, кроссплатформенно.
from rustlib import fib
print(fib(35))
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥4👍2
Когда скрипт превращается в утилиту — ты становишься ближе к DevOps-богу.
Больше никаких
print("enter value:"). Теперь у тебя интерактив, цвет, автодополнение и команды как в Git.name = input("Введите имя: ")
print(f"Привет, {name}!")from rich.console import Console
from rich.table import Table
console = Console()
table = Table(title="Users")
table.add_column("ID", style="cyan")
table.add_column("Name", style="green")
table.add_row("1", "Alice")
table.add_row("2", "Bob")
console.print(table)
from rich.progress import track
import time
for _ in track(range(5), description="Processing..."):
time.sleep(0.5)
from prompt_toolkit import prompt
from prompt_toolkit.completion import WordCompleter
langs = WordCompleter(["Python", "Go", "Rust", "Java"])
lang = prompt("Выбери язык: ", completer=langs)
print(f"Твой выбор: {lang}")
from prompt_toolkit.validation import Validator, ValidationError
validator = Validator.from_callable(
lambda t: t.isdigit(),
error_message="Нужно число!",
)
age = prompt("Возраст: ", validator=validator)
import typer
app = typer.Typer()
@app.command()
def greet(name: str):
print(f"Привет, {name}!")
@app.command()
def add(x: int, y: int):
print(x + y)
if __name__ == "__main__":
app()
python app.py greet Alice или python app.py add 2 3 — чисто и понятно.python app.py --help
--help, --version, и описание аргументов.from rich.console import Console
import typer
console = Console()
app = typer.Typer()
@app.command()
def fancy(name: str):
console.print(f"[bold green]Привет, {name}![/bold green]")
if __name__ == "__main__":
app()
@app.command()
def choose():
from prompt_toolkit import prompt
color = prompt("Твой любимый цвет: ")
console.print(f"[{color}]Вот как выглядит твой цвет![/]")
poetry build
pip install dist/mycli-0.1.0-py3-none-any.whl
mycli fancy Alice
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡5❤3
Media is too big
VIEW IN TELEGRAM
В этом видео автор разбирает, почему Python называют лучшим языком для новичков и с какими трудностями можно столкнуться на практике.
Обсуждаются ключевые преимущества языка — простота, универсальность, широкий выбор библиотек, а также его слабые стороны — скорость, зависимость от интерпретатора и ограничения при масштабных проектах.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2🖕1
Когда код повторяется или хочется динамики без копипаста, Python умеет писать сам себя. AST и метапрограммирование — ключ к мощным и компактным решениям.
def make_adder(x):
return lambda y: x + y
add5 = make_adder(5)
print(add5(10))
🛠 Изменение классов после определения
class A: pass
A.new_attr = 42
print(A.new_attr)
📜 Использование type для создания классов
MyClass = type("MyClass", (object,), {"x": 10})
print(MyClass().x)import ast
tree = ast.parse("a = 1 + 2")
print(ast.dump(tree))
code = compile(tree, filename="<ast>", mode="exec")
exec(code)
print(a)
def log_calls(fn):
def wrapper(*args, **kwargs):
print(f"Calling {fn.__name__}")
return fn(*args, **kwargs)
return wrapper
@log_calls
def foo(): pass
foo()
class Meta(type):
def __new__(cls, name, bases, dct):
dct["hello"] = lambda self: print("Hello")
return super().__new__(cls, name, bases, dct)
class A(metaclass=Meta): pass
A().hello()
📦 Генерация кода для API
for i in range(3):
exec(f"def func{i}(): print('Function {i}')")
func1()
def make_test(n):
code = f"def test_{n}(): return {n} * 2"
exec(code)
make_test(5)
print(test_5())
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍4
Когда код начинает напоминать магические заклинания, а бизнес хочет «писать на языке предметной области» — пора сделать DSL.
Domain-Specific Language в Python — это не парсер, не компилятор, а читаемый API, который звучит как человеческий язык.
create_user("alice", "admin", True, "2025-10-27")user = (UserBuilder()
.named("alice")
.with_role("admin")
.active(True)
.created_today())
class UserBuilder:
def __init__(self):
self.user = {}
def named(self, name):
self.user["name"] = name; return self
def with_role(self, role):
self.user["role"] = role; return self
def active(self, flag):
self.user["active"] = flag; return self
def created_today(self):
self.user["created"] = "2025-10-27"; return self
self — и цепочка становится мини-языком.infra = (Server("app")
.runs("nginx")
.exposes(80)
.depends_on("db"))Ни YAML, ни JSON — только Python, но читается как Terraform.
def pipeline():
source("data.csv")
filter("age > 18")
transform("normalize")
output("report.json")
model = (train()
.on("dataset.csv")
.using("RandomForest")
.tune(max_depth=10)
.evaluate("accuracy"))
class DSL:
def __enter__(self): print("start")
def __exit__(self, *a): print("end")
with DSL():
do("something")
class Rule:
def __getitem__(self, key):
return f"IF {key} THEN alert"
rule = Rule()
print(rule["cpu > 90%"])
🧩 9. Декораторы как ключевые слова DSL
@task("extract")
def extract_data(): ...
@task("transform")
def transform_data(): ...q = SELECT("name", "age").FROM("users").WHERE("age > 18").ORDER_BY("name")given(user="admin").when(login).then(see_dashboard)
🧩 12. Генерация собственного синтаксиса
from textx import metamodel_from_str
grammar = '''
Model: statements*=Statement;
Statement: name=ID '=' value=INT;
'''
meta = metamodel_from_str(grammar)
model = meta.model_from_str("x = 5\ny = 10")
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3🔥1
🚦 Feature Flags и Canary: как Python выпускает код без боли
Никто не хочет падений после деплоя. Feature Flags и Canary-развёртывания позволяют включать фичи по частям: сначала 1%, потом 10%, потом всем. Без ручных выкатываний и откатов.
💀 Старый путь — “всё или ничего”
➡️ Фича включается для всех сразу. Если падает — падает всё.
⚙️ Добавляем флаг
➡️ Теперь можно включать фичи точечно, без релиза.
🧩 Храним флаги в Redis
➡️ Изменил флаг в Redis — поведение поменялось в реальном времени.
🧠 Canary rollout
➡️ Только 10% пользователей получают новую версию. Остальные — стабильный код.
📊 Метрики на фичу
➡️ Мгновенно видишь, как влияет новая логика.
⚡️ Canary через прокси
NGINX split-трафик по cookie или hash:
➡️ Управляешь выкаткой без касания Python-кода.
🧰 Комбинация с CI/CD
➡️ Новая фича включается автоматически после деплоя.
🔥 Canary + Celery
➡️ Даже фоновые задачи можно тестировать на части нагрузки.
🔍 Rollback за секунды
➡️ Фича отключается без перезапуска.
🚀 Full rollout
➡️ Всё прошло — включаем всем. Без deploy, без боли.
🗣 Запомни: флаги — это не костыль, а ремни безопасности. Python с Feature Flags и Canary учит выкатывать код медленно, зато без катастроф.
Никто не хочет падений после деплоя. Feature Flags и Canary-развёртывания позволяют включать фичи по частям: сначала 1%, потом 10%, потом всем. Без ручных выкатываний и откатов.
if new_feature_enabled:
process_new_logic()
else:
process_old_logic()
from featureflags import FeatureFlags
flags = FeatureFlags({
"new_ui": False,
"smart_sort": True
})
if flags.is_enabled("smart_sort"):
sort_items_ml()
else:
sort_items_old()
🧩 Храним флаги в Redis
import redis, json
r = redis.Redis()
r.set("feature_flags", json.dumps({"beta_chat": True}))
flags = json.loads(r.get("feature_flags"))
if flags.get("beta_chat"):
launch_beta_chat()
import random
def canary(percent: int):
return random.randint(1, 100) <= percent
if canary(10):
serve_new_api()
else:
serve_old_api()
def process():
if flags["smart_sort"]:
metrics.increment("sort.smart.active")
else:
metrics.increment("sort.old.active")
NGINX split-трафик по cookie или hash:
if ($cookie_user_group = "canary") {
proxy_pass http://new-version;
}# .github/workflows/deploy.yml
- name: Toggle feature flag
run: curl -X POST http://flags/api/enable?flag=smart_sort
if canary(5):
queue = "tasks_beta"
else:
queue = "tasks_prod"
send_task(queue, "process_data")
r.set("feature_flags", json.dumps({"smart_sort": False}))flags["new_ui"] = True
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍1🔥1
CLI уже давно не должен быть серым текстом на чёрном фоне.
rich и prompt_toolkit превращают Python-консоль в полноценный интерфейс: цвет, подсветка, ввод, меню — всё живое и интерактивное.💀 Старый CLI — мёртвый текст
name = input("Введите имя: ")
print("Привет,", name)from rich import print
from rich.console import Console
console = Console()
console.print("[bold green]Hello, world![/bold green]")
from rich.progress import track
for step in track(range(5), description="Processing..."):
time.sleep(0.5)
from rich.table import Table
table = Table(title="Users")
table.add_column("Name")
table.add_column("Age")
table.add_row("Alice", "24")
table.add_row("Bob", "30")
console.print(table)
from prompt_toolkit import prompt
from prompt_toolkit.completion import WordCompleter
langs = WordCompleter(["Python", "Go", "Rust"])
name = prompt("Язык? ", completer=langs)
print("Вы выбрали:", name)
from prompt_toolkit.lexers import PygmentsLexer
from prompt_toolkit.styles import Style
from pygments.lexers.python import PythonLexer
prompt(">>> ", lexer=PygmentsLexer(PythonLexer), style=Style.from_dict({"": "#00ff00"}))
from prompt_toolkit.shortcuts import checkboxlist_dialog
result = checkboxlist_dialog(
title="Выбор модулей",
text="Отметьте нужные:",
values=[("auth", "Auth"), ("db", "Database"), ("api", "API")]
).run()
print(result)
from rich.console import Console
from prompt_toolkit import PromptSession
console = Console()
session = PromptSession()
while True:
cmd = session.prompt(">>> ")
console.print(f"[cyan]Выполняю:[/cyan] {cmd}")
from prompt_toolkit import Application
from prompt_toolkit.key_binding import KeyBindings
kb = KeyBindings()
@kb.add("c-c")
def _(event): event.app.exit()
app = Application(full_screen=True, key_bindings=kb)
app.run()
from rich.logging import RichHandler
import logging
logging.basicConfig(level="INFO", handlers=[RichHandler()])
logging.info("Система запущена")
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8❤🔥2👍1
Python — удобный, но медленный. WebAssembly (WASM) даёт шанс выжать из него максимум: код работает в браузере или sandbox-среде со скоростью C, при этом безопасно и кроссплатформенно.
def fib(n):
return n if n < 2 else fib(n-1) + fib(n-2)
print(fib(35))
⚙️ Компиляция в WebAssembly
pip install pyodide-build
pyodide build
🌐 Запуск Python в браузере
<script type="module">
import { loadPyodide } from "https://cdn.jsdelivr.net/pyodide/v0.26.0/full/pyodide.mjs";
const pyodide = await loadPyodide();
await pyodide.runPythonAsync("print('Hello from WebAssembly!')");
</script>
⚡️ Ускоряем вычисления через Rust
#[no_mangle]
pub extern "C" fn square(x: i32) -> i32 {
x * x
}
.wasm, а Python вызывает его как обычную функцию.🔗 Подключаем WASM в Python
import wasmtime
store = wasmtime.Store()
module = wasmtime.Module.from_file(store.engine, "math.wasm")
instance = wasmtime.Instance(store, module, [])
square = instance.exports(store)["square"]
print(square(store, 12))
🧩 Лёгкая изоляция
WebAssembly — песочница:
🟢 нельзя обращаться к файлам,🟢 нельзя падать с segfault,🟢 код полностью детерминирован.
wasmer run app.wasm
import numpy as np
a = np.arange(1e6)
print(a.sum())
Просто кидаешь .wasm в CDN, и Python-код выполняется где угодно.
from flask import Flask
from wasmtime import Store, Module, Instance
app = Flask(__name__)
store = Store()
module = Module.from_file(store.engine, "math.wasm")
instance = Instance(store, module, [])
square = instance.exports(store)["square"]
@app.route("/square/<int:x>")
def api_square(x):
return {"result": square(store, x)}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥1🤔1
Media is too big
VIEW IN TELEGRAM
В этом видео автор показывает, как с нуля создать два практических проекта на Python: простой калькулятор и игру "Угадай число".Разбирается, как реализовать основные операции (сложение, вычитание, умножение, деление), обработать ошибки вроде деления на ноль, и как организовать логику игры с подсказками и проверками.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🔥1
Media is too big
VIEW IN TELEGRAM
В этом видео автор показывает, как записывать данные в CSV файлы с помощью модуля csv. Разбирается, как работать с кодировками (особенно проблемы в Windows), управлять разделителями и избегать пустых строк при записи.
Это практический навык, который пригодится при работе с данными, экспортом информации и автоматизации обработки файлов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤2
Многие новички (и даже опытные разработчики) забывают, что в Python блок
else можно использовать вместе с циклами for и while.Блок
else выполняется только в том случае, если цикл завершился естественным образом (то есть полностью прошел все итерации и не был прерван оператором break).Это позволяет избавиться от лишних переменных-флагов (вроде
found = False) при поиске элементов.Ищем число в списке. Если нашли — прерываем цикл. Если перебрали всё и не нашли — срабатывает
else.
items = [1, 3, 5, 7]
target = 4
for item in items:
if item == target:
print("Нашел!")
break
else:
# Сработает, только если break НЕ был вызван
print("Элемента нет в списке")
for-else, чтобы сделать код поиска чище и понятнее, убирая лишние проверки после цикла.Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤4🔥3
Забудьте про громоздкие срезы вроде
list[1:-1]. В Python можно использовать оператор * (asterisk), чтобы гибко распаковывать итерируемые объекты.Нужно взять первый и последний элементы списка, а всё, что посередине, сохранить отдельно.
data = [10, 20, 30, 40, 50, 60]
# first — первый элемент
# last — последний
# *middle — всё остальное (соберется в список)
first, *middle, last = data
print(first) # 10
print(last) # 60
print(middle) # [20, 30, 40, 50]
Везде! Списки, кортежи, строки. Звездочка может стоять в начале, в конце или посередине (но только одна в выражении).
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3🥴1
Если вы часто пишете
print("var =", var), чтобы проверить значение переменной, то этот трюк сэкономит вам кучу времени.Начиная с Python 3.8, в f-строках можно использовать знак равно =.
user = "Alex"
age = 25
print(f"user = {user}, age = {age}")
# Вывод: user = Alex, age = 25
Просто добавьте = в конце переменной внутри фигурных скобок. Python сам подставит имя переменной и её значение.
user = "Alex"
age = 25
print(f"{user=}, {age=}")
# Вывод: user='Alex', age=25
Это работает даже с выражениями:
print(f"{2 + 2 = }")
# Вывод: 2 + 2 = 4
Мелочь, а код для отладки пишется в два раза быстрее! 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤3
Сталкивались с ошибкой
KeyError или писали громоздкие проверки if key not in my_dict, просто чтобы добавить элемент в список внутри словаря?В модуле
collections есть спаситель — defaultdict.Если вы обращаетесь к ключу, которого нет,
defaultdict не выдаст ошибку, а создаст значение по умолчанию сам.Пример: Группируем имена по длине.
⛔ Обычный способ:
names = ["Ana", "Bob", "Alex", "John"]
groups = {}
for name in names:
length = len(name)
if length not in groups:
groups[length] = [] # Создаем список, если ключа нет
groups[length].append(name)
✅ С defaultdict:
from collections import defaultdict
names = ["Ana", "Bob", "Alex", "John"]
# Указываем list как фабрику значений по умолчанию
groups = defaultdict(list)
for name in names:
# Не нужно проверять наличие ключа!
groups[len(name)].append(name)
print(dict(groups))
# {3: ['Ana', 'Bob'], 4: ['Alex', 'John']}
Меньше кода — меньше багов. Идеально для подсчета статистики и группировки данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
Если вы всё еще склеиваете пути к файлам через строки или
os.path.join, пора переходить на pathlib. Это встроенная библиотека, которая превращает пути в удобные объекты.Пути можно соединять через оператор деления
/! Это выглядит очень чисто и интуитивно.Создадим путь к файлу
data/report.txt в текущей директории.
from pathlib import Path
# Получаем текущую папку
current_dir = Path.cwd()
# Магия слешей! Никаких запятых и скобок
file_path = current_dir / "data" / "report.txt"
# Проверяем, существует ли файл
if file_path.exists():
# Читаем текст сразу методом объекта
print(file_path.read_text())
else:
print("Файл не найден")
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤2
Как проверить, что все элементы в списке положительные? Писать цикл? Нет!
Используйте встроенные функции
all() и any().
numbers = [1, 5, 10, 20]
# all вернет True, только если ВСЕ условия верны
if all(n > 0 for n in numbers):
print("Все числа положительные!")
# any вернет True, если ХОТЯ БЫ ОДНО условие верно
if any(n > 15 for n in numbers):
print("Есть число больше 15!")
Это читается почти как обычный английский текст. Пишите выразительно! ✍️
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10⚡3