Уровень: начинающий
Следующий код выведет «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 ответа
Извините, я не совсем уверен, что вы имеете в виду, но здесь подумайте об этом так:
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]
зацикливается так, что это первый элемент справа налево.
В целом функция вашей функции такова: если длина 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]
Я думаю, что вас смущает поведение x[-1]
. Отрицательные индексы массива относятся к концу массива, поэтому в вашем примере x[-1]
== 'b'. Который явно не равен x[0]
== 'a', поэтому функция возвращает False.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.