о возвращаемом выражении - PullRequest
3 голосов
/ 27 августа 2010

level: beginner

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

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

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

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

print isPalindrome('anna')

спасибо Баба

Ответы [ 3 ]

6 голосов
/ 27 августа 2010

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

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] будет первым элементом из «left-» справа налево, так сказать, x[-1] зацикливается так, что это первый элемент справа налево.

1 голос
/ 27 августа 2010

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

0 голосов
/ 27 августа 2010

В целом функция вашей функции такова: если длина 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]
...