проблема со вторым подходом
Это имеет смысл, так как здесь, если вы вызываете это, например, longestWord(['these', 'are', 'some', 'strings'])
, то на первой итерации s
будет 'these'
.
Теперь, если мы назовем max(len(s))
, это означает, что Python сначала оценит len(s)
, что составляет len('these')
и, следовательно, 5
, а затем мы вызовем max(..)
, на 5
, Но 5
является , а не и повторяемыми (список, генератор или любая «коллекция» значений). Вычисление « максимум 5 » странно, поэтому ошибка.
Даже если Python разрешит для одного не повторяемого элемента просто вернуть этот элемент, он все равно не будет работать, поскольку это означает, что он будет возвращать длину первого элемента.
Почему работает первый подход
В первой реализации:
def longestWord(words):
return max(<b>len(s) for s in words</b>)
вы создаете итерируемое: (len(s) for s in words)
- это не цикл for
, это генератор, который при итерации по нему будет давать длины words
. Таким образом, max(..)
принимает в качестве первого (и единственного) аргумента итерацию из int
egers. Это означает, что функция max(..)
будет повторять эту итерацию и отслеживать максимум. Когда генератор «исчерпан», он возвращает максимальный объект, который он видел.