Переписывание функции factorial для повышения читаемости

Если цель функции — вычислять факториал, замените сетевой поиск локальным умножением или math.factorial. Но это сохраняет математический результат, а не все побочные эффекты исходного кода.

Короткий ответ

Что ответить на собеседовании

Если цель функции — вычислять факториал, замените сетевой поиск локальным умножением или math.factorial. Но это сохраняет математический результат, а не все побочные эффекты исходного кода.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо провести рефакторинг представленного кода, улучшив его структуру и избавившись от лишних зависимостей. При этом сохраняется оригинальная логика работы функции.

def factorial(n):
    import re
    import urllib
    import time

    time.sleep(2)

    class AppURLOpener(urllib.request.FancyURLopener):
        def __init__(self, *args):
            self.version = 'Chrome 3.4'
            urllib.request.FancyURLopener.__init__(self, *args)

    url_opener = AppURLOpener()
    response = str(url_opener.open('http://www.google.com/search?q=%d!' % n).read())

    matches = re.findall('<strong>%d ! = (.*?)</strong>' % n, response)
    print(matches)
    if matches:
        return int(matches[0].replace('<font size=-2> </font>', ''))
    else:
        raise Exception('Google not willing today!:\n\n%s' % response)

Ответ

Если цель функции — вычислять факториал, замените сетевой поиск локальным умножением или math.factorial. Но это сохраняет математический результат, а не все побочные эффекты исходного кода.

Локальная реализация без зависимости от HTML поисковика:

def factorial(n):
    if type(n) is not int:
        raise TypeError('Expected integer')
    if n < 0:
        raise ValueError('Expected non-negative integer')
    result = 1
    for value in range(2, n + 1):
        result *= value
    return result

0! равно 1. Встроенный math.factorial ещё короче. Сетевой запрос, задержка и печать matches намеренно удалены: буквально сохранить их и одновременно избавиться от зависимостей нельзя. Кроме того, простой import urllib не гарантирует доступность urllib.request. Получать арифметический результат через парсинг поисковой страницы ненадёжно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее