Цена за 24 часа в ленте | 600,00 |
Цена за 1 час закрепления | 100,00 |
Взаимопиар | ≥ 600 подписчиков |
Казино, мошенничества, пирамиды, ставки и всё в этом духе. |
|
yield
и возобновляют работу только при запросе следующего значения.def read_logs(filename):
with open(filename) as file:
for line in file:
if '[ERROR]' in line:
yield line.strip()
for error in read_logs('server.log'):
print(f"Error found: {error}")
[for ... in ...]
, используемая в нашем коде, называется списковое включение (или list comprehension на английском). Это удобный способ быстро создать новый список на основе существующей коллекции, применяя к его элементам условия или преобразования. Хотя правильное название — списковое включение, его часто называют просто "генератором" — это не совсем корректно, но распространено среди разработчиков.
def filter_numbers(
numbers: list[int],
) -> list[int]:
return [
x
for x in numbers
if is_prime(x) or is_even(x)
]
def is_prime(num: int) -> bool:
if num < 2:
return False
return all(
num % i != 0
for i in range(2, int(num**0.5) + 1)
)
def is_even(num: int) -> bool:
return num % 2 == 0
sequence = [2, 3, 5, 10, 15, 21, 22]
result = filter_numbers(sequence)
print(result)
numbers
и возвращает новый список, содержащий только те числа, которые проходят проверку на простоту или чётность.[x for x in numbers if is_prime(x) or is_even(x)]
.x
из numbers
добавляется в результат, если он проходит проверку: is_prime(x) or is_even(x)
. То есть число добавляется в новый список, если оно простое (функция is_prime
) или чётное (функция is_even
).all()
проверяется, что оно не делится на числа от 2 до квадратного корня из него. Это оптимизация, позволяющая сократить количество делений, ведь если число делится на какое-то число больше квадратного корня, то это уже не простое число.True
, если число чётное, и False
— если нечётное.num % 2 == 0
.sequence
хранится список чисел [2, 3, 5, 10, 15, 21, 22]
.filter_numbers
проверит каждый элемент списка на чётность или простоту. Если хотя бы одно из этих условий выполнено, число попадёт в результирующий список.[2, 3, 5, 10, 22]
.class Employee:
def __init__(self, manager=None):
self.manager = manager
alice = Employee()
bob = Employee(alice)
alice.manager = bob
del alice
del bob
version: '3.8'
services:
web:
image: examplewebapp:latest
build: ./web
ports:
- "8000:8000"
depends_on:
- db
environment:
- DATABASE_URL=postgres://user:password@db:5432/mydb
db:
image: postgres:13
volumes:
- db_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
db_data:
docker-compose up -d
Order
, которая принимает список товаров, каждый из которых представлен как словарь с полями id
и quantity
. Используйте Pydantic для преобразования и проверки данных:id
должен всегда быть строкой;quantity
— целым числом, и если меньше или равен нулю, должно автоматически подставляться значение по умолчанию — 1.from pydantic import BaseModel, Field, ValidationError, field_validator
class Item(BaseModel):
id: str
quantity: int = Field(default=1, gt=0)
@field_validator("id", mode="before")
def id_to_str(cls, v):
return str(v)
class Order(BaseModel):
items: list[Item]
order_data = {"items": [{"id": 123, "quantity": -5}, {"id": "456", "quantity": "3"}, {"id": 789}]}
order = Order(**order_data)
print(order.items)
Item
. Он содержит два поля: id
и quantity
.id
применяется валидатор @field_validator("id", mode="before")
. Этот валидатор срабатывает перед основной валидацией и преобразует переданное значение в строку. Это значит, что, например, числовой id
123 автоматически конвертируется в строку "123"
. Таким образом, независимо от исходного типа данных, id
всегда становится строкой.quantity
имеет ограничение gt=0
, что означает "должно быть больше нуля". Если в данных указывается значение, не соответствующее этому условию (например, отрицательное число), Pydantic выбрасывает ValidationError
. Также quantity
имеет значение по умолчанию — 1. Если quantity
не указано, автоматически подставится это значение.Order
содержит список товаров items
, где каждый элемент должен соответствовать модели Item
. Благодаря этому, при создании заказа Pydantic автоматически проверяет каждый элемент items
и применяет к ним правила, заданные в Item
.{"id": 123, "quantity": -5}
id
преобразуется в строку "123"
с помощью валидатора id_to_str
.quantity
указано как -5
, что нарушает условие gt=0
(больше нуля). Поэтому при попытке создать объект Item
с такими данными Pydantic выбросит ValidationError
.{"id": "456", "quantity": "3"}
id
уже строка, и ваПосмотрим на передаваемые данные:лидатор оставляет его как есть.quantity
передан как строка "3"
, но Pydantic автоматически конвертирует её в целое число 3
, что удовлетворяет условию gt=0
.{"id": 789}
id
преобразуется в строку "789"
.quantity
не указано, поэтому используется значение по умолчанию 1
.Order
Pydantic проверяет каждый элемент в списке items
. Первый элемент нарушает условие gt=0
из-за отрицательного значения quantity
, и это приводит к ValidationError
. В результате объект Order
не создается, и программа останавливается на этом этапе.ValidationError
ValidationError
помогает нам избежать ошибок при создании заказа с некорректными данными, таких как отрицательное количество. Этот инструмент позволяет создавать более надежные API, автоматически преобразуя и проверяя данные.
Order
, которая принимает список товаров, каждый из которых представлен как словарь с полями id
и quantity
. Используйте Pydantic для преобразования и проверки данных:id
должен всегда быть строкой;quantity
— целым числом, и если меньше или равен нулю, должно автоматически подставляться значение по умолчанию — 1.