Если цель функции — вычислять факториал, замените сетевой поиск локальным умножением или math.factorial. Но это сохраняет математический результат, а не все побочные эффекты исходного кода.
Переписывание функции 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. Получать арифметический результат через парсинг поисковой страницы ненадёжно.