Как прописать пограничный случай в коде?

В коде проходит проверка на букву в строке независимо от регистра. Если открыть проверку на букву вне строки - цикл не корр работает: upper и lower проходят как вне строки:
def has_char(string, char):
    i = 0
    # if char != string[i]:
        # return char in string
    while i <= len(string):
        if char == string[i]:
            return True
        if char == string[i].lower():
            return True
        if char == string[i].upper():
            return True
        i += 1
    return
string = 'Hello'
print(has_char(string, 'h'))
  • Вопрос задан
  • 146 просмотров
Решения вопроса 1
Mike_Ro
@Mike_Ro Куратор тега Python
Python, JS, WordPress, SEO, Bots, Adversting
def has_char(string, char):
    i = 0
    while i < len(string):
        if char == string[i].lower():
            return True
        if char == string[i].upper():
            return True
        i += 1
    return False

print(has_char('Hello', 'h'))  # True
print(has_char('Hello', 'H'))  # True
print(has_char('Hello', 'ё'))  # False, ;)

Сравнение char с string[i] без учета регистра?
def has_char(string, char):
    for i in range(len(string)):
        if char == string[i]:
        # if char.lower() == string[i].lower():
            return True
    return False

print(has_char("Привет", "п"))  # True? False!

И да, в Вашем случае, for будет лучше while, т.к. цикл не предполагает неопределенное количество итераций, читается лучше, да и сами проверки можно упростить:
def has_char(string, char):
  for _char in string:
    if _char.lower() == char.lower():
      return True
  return False

print(has_char('Hello', 'h'))  # True
print(has_char('Hello', 'H'))  # True
print(has_char('Hello', 'ё'))  # False, ;)
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@chemdev
В коде много лишнего, но из ошибок только условие цикла, при такой реализации там должно быть <, а не <=. Ты также лукавишь, говоря, что код работает некорректно. Для данного примера результат будет правильным. Вызов has_char('abc', 'd') упадёт с ошибкой. Даже если исправить условие цикла, функция не будет возвращать логично ожидаемый False.
Ответ написан
Комментировать
@Artyom_Moshkoff
А чем .find() не нравится для поиска?
Ответ написан
Комментировать
@Drill
def has_char(string, char):
    return char.lower() in string.lower()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы