Этот код нарушен как Python. Не только как Python 3; он сломан как Python 2, или как Python 0.9. Похоже, что кто-то, кто не знает Python, пытался что-то конвертировать из JavaScript, но даже не проверял его.
Итак, короткий ответ здесь: перестаньте смотреть эту серию. Это не учит вас Python.
Первая проблема заключается в том, что в Python нет встроенного значения, называемого null
.
Там есть значение, называемое None
.
Или, может быть, где-то еще в его коде он сделал null = object()
, чтобы создать уникальное значение дозорного значения, отличное от None
, для использования, когда None
является юридическим значением? Но здесь нет смысла делать это; эта функция может возвращать только int
.
Кроме того, вы почти никогда не будете использовать != None
с None
; используйте is not None
. И, по тем же причинам, если вы создаете новый настраиваемый дозор, например null = object()
, вы также хотите проверить is not null
.
Вторая проблема заключается в том, что Python dict
s don ' t return None
или null
или что-либо еще, когда вы просматриваете значение, которого не существует; они поднимают исключение KeyError
.
Может быть, он определил memo = collections.defaultdict(lambda: null)
и передал это в функцию? Но если это так, здесь нет веских оснований; это просто делает код более сложным и запутанным без какой-либо выгоды.
Правильная вещь здесь была бы except KeyError:
или if n in memo
или if memo.get(n) is not None:
.
Пока мы находимся в этом: Запоминание функции является примером парадигмы идиомы с изменяемым по умолчанию. Он находится в официальном FAQ Python, и я думаю, что даже в учебнике. Зачем заставить пользователя построить memo
(и попытаться выяснить, что это должно быть ...), когда это не нужно?
Итак:
def fib(n, *, memo={}):
if n in memo:
return memo[n]
if n == 1 or n == 2:
result = 1
else:
result = fib(n-1) + fib(n-2)
memo[n] = result
return result
Конечно, реальный идиоматический способ написать это использовать батареи, которые поставляются с Python:
@functools.lru_cache(maxsize=None):
def fib(n):
if n == 1 or n == 2:
return 1
return fib(n-1) + fib(n-2)
Преподавание людей, как это сделать вручную, является хорошим но вы также должны показать им, как не изобретать колесо, когда они понимают, как работают колеса.
Что касается того, как печатать результат, это легко: это то же самое, что и любой другой вызов функции , он возвращает значение, и вы можете print
это значение:
print(fib(123))
. Хотя не пытайтесь ни одного из них:
print(fib(0))
print(fib(1.5))
print(fib(1001))
... если вы не хотите видеть что RecursionError
выглядит в Python.
Требуемый элемент является динамическим, поэтому вы должны вызвать WebDriverWait для требуемого ElementToBeClickable , и вы можете использовать любую из следующих стратегий локатора в качестве решения. :
Использование CSS_SELECTOR
:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "td.datagridCellStyle img[onload*='gwtLastUnhandledEvent'][src*='demoreports/DemoReportsApp/clear']"))).click()
Использование XPATH
:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//td[contains(@class, 'datagridCellStyle')]//img[contains(@onload, 'gwtLastUnhandledEvent') and contains(@src, 'demoreports/DemoReportsApp/clear')]"))).click()
Примечание : необходимо добавить следующий импорт:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC