⚖️ Старый и современный подход

⚡ Различия в двух словах

Классический: явные циклы, флаги all_ascii = True, конкатенация строк через += и ручная проверка диапазонов символов — понятно новичкам, но многословно.

Современный: встроенные методы строк (isascii(), isalpha(), lower()), all()/any(), str.join(), распаковка в print(), множества set и генераторные выражения.

Вывод: современный стиль короче и читаемее. Классический подход оставьте для понимания алгоритма, а в реальных проектах используйте встроенные инструменты Python.

📜 Классический подход из практикума

Исходные решения используют явные циклы, флаги и ручную сборку строк. Это помогает понять, как работает алгоритм «под капотом».

ASCII через цикл и флаг

📄 examples/classic_ascii.py
text = input("Введите текст: ")
all_ascii = True
for char in text:
    if ord(char) > 127:
        all_ascii = False
        break
print("Все символы ASCII:", all_ascii)

Сборка строки из диапазона Unicode

📄 examples/classic_unicode_string.py
start = int(input("Введите начальный код: "))
end = int(input("Введите конечный код: "))

result = ""
for code in range(start, end + 1):
    result += chr(code)

print("Символы:", result)

Вывод символов через пробел

📄 examples/classic_spaced_output.py
text = input("Введите строку: ")
for i in range(len(text)):
    if i == len(text) - 1:
        print(text[i], end="")
    else:
        print(text[i], end=" ")

✅ Рекомендуемый современный вариант

1. ASCII через str.isascii()

📄 examples/modern_isascii.py
text = input("Введите текст: ")
print("Все символы ASCII:", text.isascii())

2. ASCII через all()

Если нужно оставить явную проверку кодов, можно заменить цикл + флаг на all():

📄 examples/modern_all_ascii.py
text = input("Введите текст: ")
print("Все символы ASCII:", all(ord(c) < 128 for c in text))

3. Строка из диапазона Unicode через join()

📄 examples/modern_unicode_join.py
start = int(input("Введите начальный код: "))
end = int(input("Введите конечный код: "))

result = "".join(chr(code) for code in range(start, end + 1))
print("Символы:", result)

4. Символы через пробел через print(*text, sep=" ")

📄 examples/modern_spaced_output.py
text = input("Введите строку: ")
print(*text, sep=" ")

5. Палиндром через isalpha() + lower()

📄 examples/modern_palindrome.py
text = input("Введите строку: ")
filtered = "".join(char.lower() for char in text if char.isalpha())
print("Палиндром?", filtered == filtered[::-1])

6. Уникальные символы через set

📄 examples/modern_unique_chars.py
str1 = input("Введите первую строку: ")
str2 = input("Введите вторую строку: ")

len1 = len(set(str1))
len2 = len(set(str2))

if len1 > len2:
    print("Больше уникальных символов в строке:", str1)
elif len1 < len2:
    print("Больше уникальных символов в строке:", str2)
else:
    print("Количество уникальных символов одинаковое.")
Преимущества современного стиля:
  • Меньше кода — меньше возможностей для off-by-one ошибок.
  • Используются оптимизированные встроенные методы и функции.
  • str.join() и генераторные выражения работают быстрее, чем конкатенация в цикле.
  • Множества set автоматически убирают дубликаты.

🕰️ Когда классический подход всё ещё полезен

  • На начальном этапе обучения — чтобы понять, как устроен алгоритм.
  • Когда нужно явно контролировать каждую итерацию и ранний выход.
  • В задачах, где важен именно процесс перебора, а не результат.

Даже в этих случаях стоит знать современные альтернативы и применять их там, где они не скрывают логику.

🔧 Как распознать устаревший код

В legacy-проектах можно встретить конструкции вида:

result = ""
for char in text:
    if condition:
        result += char

Если условие простое, безопасно замените на:

result = "".join(char for char in text if condition)

Если нужна проверка «все ли» через цикл + флаг, используйте:

if all(condition for char in text):
    ...
Проверить по документации: метод str.isascii(), функции all(), set(), генераторные выражения и распаковка аргументов * выходят за рамки исходной практики. Подробности — в разделе Ресурсы.