🐛 Типичные ошибки

⚡ Топ ошибок

  • Путаница с границами range(): забыть +1 для включения последнего значения.
  • Off-by-one при индексации строки: обращение к text[len(text)].
  • Неинициализированный аккумулятор перед циклом.
  • Попытка изменить строку по индексу.
  • Сравнение кодов Unicode без учёта регистра и алфавита.
  • Забытый ввод: input() возвращает строку, а не число.

❌ Ошибка 1: Неправильные границы range()

# Wrong: missing +1, the last code is skipped
start = 65
end = 70
for code in range(start, end):
    print(chr(code), end="")
# Output: ABCDE (F is missing)

Сообщение об ошибке: ошибки нет, но результат короче, чем ожидалось.

Почему возникает: range(start, stop) не включает stop. Чтобы включить end, нужно range(start, end + 1).

✅ Исправление

for code in range(start, end + 1):
    print(chr(code), end="")
# Output: ABCDEF

❌ Ошибка 2: Off-by-one при индексации строки

# Wrong: IndexError
 text = "Python"
 print(text[len(text)])  # IndexError: string index out of range

Сообщение об ошибке: IndexError: string index out of range

Почему возникает: последний допустимый индекс равен len(text) - 1, а не len(text).

✅ Исправление

text = "Python"
print(text[len(text) - 1])  # n
# or
print(text[-1])  # n

❌ Ошибка 3: Неинициализированный аккумулятор

# Wrong: UnboundLocalError
for char in text:
    result += char
print(result)

Сообщение об ошибке: UnboundLocalError: cannot access local variable 'result' where it is not associated with a value

Почему возникает: переменная-аккумулятор должна быть создана до цикла.

✅ Исправление

result = ""
for char in text:
    result += char
print(result)

❌ Ошибка 4: Попытка изменить строку по индексу

# Wrong: TypeError
text = "Python"
text[0] = "J"  # TypeError: 'str' object does not support item assignment

Сообщение об ошибке: TypeError: 'str' object does not support item assignment

Почему возникает: строки в Python неизменяемы. Для изменения символа нужно собирать новую строку.

✅ Исправление

text = "Python"
new_text = "J" + text[1:]
print(new_text)  # Jython

❌ Ошибка 5: Неверное сравнение Unicode-диапазонов

# Wrong: skips uppercase Russian letters
text = "АБВ"
for char in text:
    if "а" <= char <= "я":
        print(char)

Сообщение об ошибке: ошибки нет, но заглавные русские буквы не обрабатываются.

Почему возникает: диапазон "а".."я" включает только строчные буквы. Заглавные находятся в диапазоне "А".."Я".

✅ Исправление

text = "АБВ"
for char in text:
    if ("А" <= char <= "Я") or ("а" <= char <= "я"):
        print(char)

❌ Ошибка 6: Пропуск преобразования input() в число

# Wrong: TypeError
height = input("Введите высоту: ")
for i in range(height, 0, -1):
    print(i)
# TypeError: 'str' object cannot be interpreted as an integer

Сообщение об ошибке: TypeError: 'str' object cannot be interpreted as an integer

Почему возникает: input() всегда возвращает строку. Её нужно преобразовать в число через int().

✅ Исправление

height = int(input("Введите высоту: "))
for i in range(height, 0, -1):
    print(i)

❌ Ошибка 7: Лишний пробел при выводе символов

# Wrong: trailing space
text = "Python"
for char in text:
    print(char, end=" ")
# Output: P y t h o n (with trailing space)

Сообщение об ошибке: ошибки нет, но в конце строки появляется лишний пробел.

Почему возникает: после каждого символа, включая последний, добавляется пробел.

✅ Исправление

text = "Python"
for i in range(len(text)):
    if i == len(text) - 1:
        print(text[i], end="")
    else:
        print(text[i], end=" ")
# Output: P y t h o n

❌ Ошибка 8: Забытый последний элемент при ручном разбиении строки

# Wrong: last word is lost
text = "abc def"
word = ""
for char in text:
    if char != " ":
        word += char
    else:
        print(word)
        word = ""
# Output: abc (def is lost)

Сообщение об ошибке: ошибки нет, но последнее слово не выводится, потому что строка не заканчивается пробелом.

Почему возникает: вывод слова происходит только при встрече пробела. После цикла остаётся непечатанный хвост.

✅ Исправление

text = "abc def"
word = ""
for char in text:
    if char != " ":
        word += char
    else:
        if word:
            print(word)
            word = ""
if word:
    print(word)
# Output: abc\ndef

❌ Ошибка 9: Проверка цифры через isdigit() вместо диапазона

# Wrong: for this exercise the task expects range check, but works fine
char = "5"
if "0" <= char <= "9":
    print("digit")

Примечание: оба способа правильные, но в задачах, где требуется именно сравнение кодов, стоит использовать диапазон. Метод isdigit() более универсален (например, recognizes superscript digits).

✅ Варианты

char = "5"
print("0" <= char <= "9")  # True
print(char.isdigit())      # True