Уровень: начинающий

Следующий код выведет «False»

def function(x):
    if len(x) == 5: return True
    else: return x[0] == x[-1]

print function('annb')

Почему строка "else: return x [0] == x [-1]" печатает False? я понимаю, что происходит, но у меня возникают трудности с переводом на простой английский ... как можно описать это поведение?

Это часто используемая техника?

Впервые я столкнулся с этим конкретным синтаксисом при попытке рекурсивно решить упражнение на палиндроме. Кажется, что единственный способ заставить рекурсию работать, это использовать сокращенный подход:

def isPalindrome(s):
 if len(s) <= 1: return True
 else: return s[0] == s[-1] and isPalindrome(s[1:-1])

print isPalindrome('anna')

Спасибо баба

3
user425727 27 Авг 2010 в 03:06

3 ответа

Лучший ответ

Извините, я не совсем уверен, что вы имеете в виду, но здесь подумайте об этом так:

return (x[0] == x[-1])

Если вы рассмотрите только то, что находится в скобках, вы поймете, что это «утверждение» приравнивается к логическому значению, верно? Вот почему вы также можете сделать:

if x[0] == x[-1]

Итак, в основном, здесь возвращается логическое значение, которое говорит, равен или нет x [0] [-1].

Можно было бы быть более явным и расширить это утверждение до чего-то вроде этого:

if x[0] == x[-1]: # if this is true
    return True # then return true
else:
    return False

Но, как вы можете видеть, и условие, и то, что вы хотели бы вернуть, - это одно и то же значение, поэтому достаточно просто сделать это как вы видели:

return x[0] == x[-1]

Извините, если я неправильно понял ваш вопрос.

РЕДАКТИРОВАТЬ : если вы ссылаетесь на отрицательный индекс (x[-1]), в Python отрицательные индексы в основном «оборачиваются», поэтому, поскольку x[0] будет первым элементом из ' слева направо, так сказать, x[-1] зацикливается так, что это первый элемент справа налево.

6
Jorge Israel Peña 26 Авг 2010 в 23:09

В целом функция вашей функции такова: если длина x равна 5, вернуть True, иначе, если последний символ строки равен первому, вернуть True, иначе вернуть False

Этот вид условия else условие ... else return False лучше всего выражать с помощью оператора или, который возвращает False, только если все условия имеют значение False и возвращают значение первого элемента not-False. Другим выбором является любая функция, которая делает то же самое с любой последовательностью. Вот проверка этих альтернатив для всех ветвей оригинального оператора if:

def function(x):
    if len(x) == 5: return True
    else: return x[0] == x[-1]

def funcor(x):
    return (len(x)==5) or (x[0] == x[-1])

def funcany(x):
    return any((len(x)==5, x[0] == x[-1]))

def funcverbal(sequence):
    ## sequence[0] is the first element of zero based indexed sequence
    ## endswith is string specific function so sequence must be string
    ## if it's length is not 5
    return len(sequence)==5 or sequence.endswith(sequence[0])

## function is normal data type in Python, so we can pass it in as variable
def test(func):
    print('Testing %s function' % func)
    for value in ('12345','annb','ansa','23424242',('1','2','1'), 123, '131'):
        try:
            print ("%r -> %r" % (value,func(value)))
        except:
            print ("Failed to call function with " + repr(value))

    print(10 * '-'+'Finished testing '+str(func) + 10 * '-')

for thisfunction in (function, funcor, funcany, funcverbal):
    test(thisfunction)

(функция выделена как зарезервированное слово синим цветом, но это ошибка в процедуре выделения на этом сайте)

В случае функции isPalindrome условие длины не является произвольным, но необходимо распознать примитивные случаи, чтобы остановить рекурсию, в случае 'anna' функция палиндрома выполняет:

Посмотрите, если длина 'anna' меньше 2 (1 или 0), нет, они не сравнивают 'a' с 'a', продолжайте, поскольку они одинаковы, отбрасывайте сравниваемую первую и последнюю букву и вызывайте isPalindrome с 'nn '

Посмотрите, если длина 'nn' меньше 2 (1 или 0), нет, они не сравниваются 'n' с 'n', продолжайте, так как они одинаковы, отбрасывайте сравниваемую первую и последнюю букву и вызывайте isPalindrome с ''

Посмотрите, если длина '' меньше 2 (1 или 0), да. Верните True, как мы нашли палиндром.

Вот альтернативная укороченная функция тестирования палиндрома, основанная на том факте, что реверсивный палиндром такой же, как палиндром.

def isPalindrome(s):
    return s==s[::-1]
0
Tony Veijalainen 27 Авг 2010 в 12:03

Я думаю, что вас смущает поведение x[-1]. Отрицательные индексы массива относятся к концу массива, поэтому в вашем примере x[-1] == 'b'. Который явно не равен x[0] == 'a', поэтому функция возвращает False.

1
zwol 26 Авг 2010 в 23:11