def binary_search(list, target):
  lower = 0 
  upper = len(list) - 1
    
  while lower <= upper: 
    mid = (lower + upper) // 2  # Floor Division
    guess = list[mid]
    if guess == target:
      return mid
    if guess > target:
      upper = mid - 1
    else: 
      lower = mid + 1
 
  return None
解释为什么这个算法有效。
此算法使用分治法的思路。它将给定的列表分成两部分，并通过不断将列表减半直到找到目标元素的位置。这种方法的优势在于它大大减少了查找目标值需要的比较次数。如果没有找到元素，那么搜索的上下限将相等，这意味着该元素不存在于列表中。因此，该算法保证找到目标（如果存在），如果不存在则返回None。