# Writing tests for binary search (part fabf)

Решение без тестов быстро ломается, поэтому добавим к задаче простые проверки.

## Задача

Дан отсортированный список чисел `arr` и число `target`. Найти его индекс или вернуть `-1`, если элемента нет.

## Решение

```python
def binary_search(arr: list[int], target: int) -> int:
    lo, hi = 0, len(arr) - 1
    while lo <= hi:
        mid = (lo + hi) // 2
        if arr[mid] == target:
            return mid
        if arr[mid] < target:
            lo = mid + 1
        else:
            hi = mid - 1
    return -1


print(binary_search([1, 3, 5, 7, 9, 11], 7))
```

## Как это работает

На каждом шаге диапазон поиска сокращается вдвое: если середина меньше цели — ищем справа, иначе слева. Отсюда и логарифмическая скорость.

## Пример работы

```text
3
```

## Сложность

O(log n) по времени, O(1) по памяти.


## Проверка тестами

Хорошая привычка — проверять решение сразу на нескольких примерах, включая крайние случаи.

```python
assert is_valid(True) is not None  # базовая проверка вызова
assert is_valid(False) is not None  # и второй случай
```

Такой минимум уже защищает от случайной ошибки при правках кода.

Тесты вида assert удобны для учебных задач: они короткие, наглядные и не требуют фреймворков.

**Читайте также:**

[Такой](https://exhibit86268.mataroa.blog/blog/daughterlust-dirty-stepdads-swap-their-horny-teen-stepdaughters/) · [правках](https://contracosta.news/wp-content/uploads/event-manager-uploads/event_banner/2026/10/1silkc00059-4b8b55.pdf) · [Сложность](https://vit.ac.in/wp-content/uploads/event-manager-uploads/event_banner/2026/10/hamile-plak-amc-k-t-rk-748420.pdf) · [сокращается](https://www.sfahba.com/wp-content/uploads/event-manager-uploads/event_banner/2026/10/ms-sethi-new-video-e7abc5.pdf) · [меньше](https://yakihonne.com/article/naddr1qvzqqqr4gupzprxfvsam0ma0r8tjcvtn7dvadu3zae76g4s3rwmgv6p96llkq3ccqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszrthwden5te0dehhxtnvdakqzynhwden5te0danxvcmgv95kutnsw43qqtr8v9kxcetj0ykkyefnxgervepj95cnze3h956x2cny95urzetr94sn2wp3vvcrzdehxscnwd0h7su) · [нескольких](https://dev.to/valentina_silvaferreira_/rassmatrivaiem-klassichieskuiu-zadachu-provierka-anaghramm-geg) · [проверять](https://news-ctl-posts.hashnode.dev/pitfalls-of-removing-duplicates-from-a-list-part-6ff9) · [Проверка](https://cultmtl.com/wp-content/uploads/event-manager-uploads/event_banner/2026/10/mia-z-porn-478e94.pdf) · [список](https://statics.pancake.vn/web-media-264/b6/3f/f7/16/94315b5cbf7f20d9217803230e9968cbcda337012c029439578712c3.pdf) · [диапазон](https://statics.pancake.vn/web-media-264/80/16/5a/00/c7845baced3ad39d3d74a2e80a9e7f1cd72771f18bb9dd29125f293d.pdf) · [поэтому](https://discuss.tchncs.de/post/65445717) · [крайние](https://portfolio85827.mataroa.blog/blog/ameliasicurvy/) · [решение](https://contracosta.news/wp-content/uploads/event-manager-uploads/event_banner/2026/10/91-23d62c.pdf) · [while](https://dev.to/valentina_silvaferreira_/rieshaiem-i-tiestiruiem-shifr-tsiezaria-59g) · [индекс](https://paper.wf/almakeller88log/hustleebabyy_vikki) · [элемента](https://hey.xyz/posts/2qh9wgx2bz93qwcjq4j) · [len(arr](https://hey.xyz/posts/17g2m29q3y81xgamfxb) · [включая](https://gitlab.com/chuongnhuhoa/trusrewre/-/blob/main/articles/gcd-oshibki-mve4irsj.md) · [примерах](https://dev.to/valentina_silvaferreira_/nieskolko-rieshienii-rieshieniia-prostoi-zadachi-chisla-fibonachchi-48da) · [слева](https://news-ctl-posts.hashnode.dev/two-approaches-to-binary-search-part-63df) · [assert](https://radicle.network/nodes/index.radicle.garden/rad%3Az2carwXnumN2XjBC4rSRbKw2s4WRM/issues/bdb88df4411a5d71dcd1d685d00567965dc1e2c0) · [добавим](https://paper.wf/ninahoffmann97log/sks-khyn-ybn) · [тестами](https://privatebin.devol.it/?21ac7f54750d912c#AckZHamRLFBsmWqdtjJzaXqbGXfiuU2gZ5K29pqVmn1R) · [защищает](https://kappa.lol/Rf46xO)

