Перебор списка строк в Python - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь понять, почему верхний код работает, а нижний - нет. Они оба для циклов, просто написаны по-разному, которые, кажется, делают то же самое, но второй отказывает с «int объект не повторяется». Может быть, я упускаю что-то очевидное здесь

это работает

def longestWord(words):
    return max(len(s) for s in words)


x = longestWord(['these', 'are', 'some', 'strings'])

print(x)

это не работает

def longestWord(words):
    for s in words:
        return max(len(s))

x = longestWord(['these', 'are', 'some', 'strings'])

print(x)

TypeError: 'int' object is not iterable

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Поскольку max() работает на итерируемом или двух числах, если вы проверите определение метода max (). И когда вам нравится max(len(s)), это не повторяемый объект, а аргументы не являются двумя целыми числами, это просто целочисленное значение. Проверьте ссылку для получения информации о макс ():

https://www.programiz.com/python-programming/methods/built-in/max

max(iterable, *iterables[,key, default])
max(arg1, arg2, *args[, key])
0 голосов
/ 10 ноября 2018

проблема со вторым подходом

Это имеет смысл, так как здесь, если вы вызываете это, например, 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(..) будет повторять эту итерацию и отслеживать максимум. Когда генератор «исчерпан», он возвращает максимальный объект, который он видел.

0 голосов
/ 10 ноября 2018
def longestWord(words):
    for s in words:
        return max(len(s))

Во-первых, вы возвращаетесь, как только получаете первое слово в вашем списке слов.

Во-вторых, len() дает вам целое число того, как долго это называется. Итак, выполнив max(len(whatever)), вы получите максимум одного числа, поэтому вы получаете ошибку, которую делаете.

Причина, по которой это работает в вашем первом примере:

max(len(s) for s in words)

потому что len(s) for s in words дает вам итерацию, из которой вы можете получить элемент max.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...