Цикл по диапазону (0) - PullRequest
       6

Цикл по диапазону (0)

0 голосов
/ 03 июля 2018

Вот функция:

def is_sorted(L):
    """ (str) -> Bool

    Return True iff the L is sorted in nondecreasing order. Otherwise, return
    False.

    >>> is_sorted([1, 2, 3, 3])
    True
    >>> is_sorted([3, 2, 1, 3])
    False
    """
    if len(L) == 0:
        return False

    for i in range(len(L) - 1):
        if L[i] > L[i + 1]:
            return False

    return True

Затем я выполнил его в списке с одним символом, и он вернул True. Тем не менее, я ожидал получить «список индекса из-за ошибки диапазона». Кто-нибудь может объяснить, почему он так себя ведет?

Ответы [ 4 ]

0 голосов
/ 03 июля 2018

За кулисами оператор for вызывает iter () для объекта контейнера (здесь это range). Функция возвращает объект итератора, который определяет метод next (), который обращается к элементам в контейнере по одному за раз. Когда больше нет элементов, next () вызывает исключение StopIteration, которое сообщает циклу for завершиться.

В вашем фрагменте: range (0) подразумевает, что цикл никогда не запустится, вместо этого будет создано исключение stopIteration Если бы это был диапазон (0,1), вы бы получили ожидаемый ответ. Следовательно, он переходит к следующему утверждению и возвращает true.

Вы можете узнать больше о протоколе итератора в Python.

0 голосов
/ 03 июля 2018

for i in range(n) означает, что я буду перебирать список [0,1,2....,n-1]. В вашем случае range(0)=[] (пустой список), потому что между 0 и 0 не должно быть целого числа. Вот почему этот блок кода не выполняется:

for i in range(len(L) - 1): #empty list
    if L[i] > L[i + 1]: #this line is not getting executed
        return False

и эта строка выполняется и возвращает True.

return True #this one is getting executed
0 голосов
/ 03 июля 2018

Возвращает True, потому что уже не может войти в цикл, потому что список [], который пуст, поэтому он просто возвращает то, что после него.

0 голосов
/ 03 июля 2018

range(a,b,s) - [a,a+s,a+2*s...,x], где x < b.

Итак, range(0) -> range(0,0,1) генерирует пустое list. Это означает, что внутренняя часть цикла for пропущена, что возвращает True

Спасибо Али Шахривариану за редактирование

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