将下述代码改为二分查找的形式并说明基本原理和代码运行流程：
```
def search_in_list(alist, target):
    for i in range(len(alist)):
        if alist[i] == target:
            return i
    return -1
```
user
```
def binary_search(alist, target):
    left, right = 0, len(alist) - 1
    while left <= right:
        mid = (left + right) // 2
        if alist[mid] == target:
            return mid
        elif alist[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1
```

**基本原理：**
二分查找是一种在有序数组中查找特定元素的算法。它通过每次将查找范围减半来快速定位目标元素。

**代码运行流程：**
1. 初始化 `left` 和 `right` 分别为数组的起始和结束索引。
2. 当 `left` 小于或等于 `right` 时，执行以下步骤：
   - 计算中间索引 `mid`。
   - 如果 `alist[mid]` 等于目标值 `target`，返回 `mid`。
   - 如果 `alist[mid]` 小于 `target`，说明目标值在 `mid` 的右侧，更新 `left` 为 `mid + 1`。
   - 如果 `alist[mid]` 大于 `target`，说明目标值在 `mid` 的左侧，更新 `right` 为 `mid - 1`。
3. 如果循环结束仍未找到目标值，返回 `-1` 表示未找到。
assistant