#python #string #function #search #nameerror
#питон #строка #функция #Поиск #ошибка имени
Вопрос:
Это может быть глупый вопрос и, возможно, один из самых простых вопросов в SO. Рассмотрим следующий код, который пытается найти индекс заданного символа в строке:
def find(s ,ch, start=0):
index = start
while index <= end:
if s[index] == ch:
return index
index = index 1
return -1
print(find("apple","p"))
Это прекрасно работает. Теперь, в этом коде я хочу добавить параметр по умолчанию end
, который будет указывать функции, до какой длины строки мы должны искать в данной строке. Вот так:
def find(s, ch, start=0,end=len(s)):
index = start
while index <= end:
if s[index] == ch:
return index
index = index 1
return -1
print(find("apple","p"))
Однако, когда я запускаю этот код, я получаю сообщение об ошибке в строке 1 приведенного выше кода:
NameError: Name s is not defined
Я пытался прочитать что-нибудь об этом в каком-нибудь учебнике. Я обнаружил, что когда функция определена, s
она все еще не определена (для чего я понятия не имею, почему это так). Следовательно, len(s) не поддается определению.
Я знаю, что есть встроенная функция, которая реализует это, но я хочу написать свой собственный алгоритм для этого.
Кто-нибудь может помочь или дать подсказку?
Комментарии:
1. Аргументы по умолчанию вычисляются один раз во время определения, поэтому невозможно получить динамическое значение для end на основе s . Вы могли бы иметь значение по умолчанию
end = None
, а затем иметьif end is None: end = len(s)
внутри функции.
Ответ №1:
Более питоническим выбором для итерации списка будет for
цикл, поскольку он проще и удобен для чтения:
def find(s, ch):
index = None
for i in range(0, len(s)):
if s[i] == ch:
index = i 1
return (index)
print(find("auhkle","a"))
print(find("auhkle","h"))
print(find("auhkle","e"))
Вывод:
1
3
6