Практикум по Python: задачи и их решения

Раздел: Python -> Учебные задачи

Основные тестовые задачи по Python

Задача FizzBuzz

Каким образом реализовать классическую задачу FizzBuzz?

Эффективное решение с одним циклом и проверкой условий.

for i in range(1, 101):
    if i % 15 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)

алгоритм решения задачи python (алгоритм решения задачи на python)

Порядок проверки важен: сначала деление на 15, затем на 3 и 5 по отдельности. Если поменять местами, результат будет неверным. Такой подход выполняется за O(n) и прост для понимания.

Как решить FizzBuzz с помощью конкатенации строк?

Вариант, при котором строка формируется на каждой итерации.

def fizzbuzz(n):
    for i in range(1, n + 1):
        out = ''
        if i % 3 == 0:
            out += 'Fizz'
        if i % 5 == 0:
            out += 'Buzz'
        print(out or i)

базовые задачи python (базовые задачи python)

Такой подход позволяет избежать вложенных условий. Если ни одно условие не сработало, печатается число.

Типичная ошибка – использование elif вместо второго if при формировании строки. В таком случае для чисел, кратных 15, напечатается только 'Fizz' или 'Buzz', но не 'FizzBuzz'.

Задача проверки палиндрома

Как проверить, является ли строка палиндромом?

Базовое решение – сравнение строки с её перевёрнутой копией.

def is_palindrome(s: str) -> bool:
    s = s.lower().replace(' ', '')
    return s == s[::-1]

задачи для обучения python (задачи для обучения python)

Приведение к нижнему регистру и удаление пробелов позволяет обрабатывать фразы. Срезы [::-1] дают обратную строку. Такой метод корректен для любых строк, но копирует строку в памяти.

Как проверить палиндром без создания обратной строки?

Решение с двумя указателями, двигающимися от начала и конца.

def is_palindrome(s: str) -> bool:
    s = s.lower().replace(' ', '')
    left, right = 0, len(s) - 1
    while left < right:
        if s[left] != s[right]:
            return False
        left += 1
        right -= 1
    return True

задачи на классы в python (задачи на классы в python)

Этот вариант использует O(1) дополнительной памяти и останавливается при первом несовпадении.

Частая проблема – неучёт знаков препинания или регистра. Строки 'A man, a plan, a canal: Panama' требуют дополнительной очистки от всех небуквенных символов. Можно применить filter(str.isalnum, s).

Подсчёт частоты символов

Какими способами посчитать, сколько раз встречается каждый символ в строке?

Стандартное решение с использованием словаря и метода get.

def char_frequency(text: str) -> dict:
    freq = {}
    for ch in text:
        freq[ch] = freq.get(ch, 0) + 1
    return freq

множество python задачи (задачи на множества в python)

Метод get возвращает текущее значение или 0, если ключа нет. Такой код работает за O(n) и легко читается.

Как посчитать частоту символов с помощью collections.Counter?

Использование встроенного счётчика из модуля collections.

from collections import Counter
def char_frequency(text: str) -> Counter:
    return Counter(text)

задачи на модули python (задачи на модули в python)

Counter возвращает объект, похожий на словарь, с дополнительными методами, например most_common(3).

Проблема: если нужно учитывать только буквы, необходимо предварительно отфильтровать строку. Игнорирование регистра выполняется через text.lower().

Проверка анаграмм

Каким образом определить, являются ли две строки анаграммами?

Эффективное решение – сравнение отсортированных версий строк.

def is_anagram(s1: str, s2: str) -> bool:
    s1 = s1.replace(' ', '').lower()
    s2 = s2.replace(' ', '').lower()
    return sorted(s1) == sorted(s2)

задачи на операторы в python (задачи на операторы в python)

Сортировка преобразует строки в списки символов, упорядоченные одинаково, если строки содержат одинаковые символы. Сложность O(n log n).

Как проверить анаграммы без сортировки, используя частотный словарь?

Подсчёт количества каждого символа и сравнение словарей.

from collections import Counter
def is_anagram(s1: str, s2: str) -> bool:
    s1 = s1.replace(' ', '').lower()
    s2 = s2.replace(' ', '').lower()
    return Counter(s1) == Counter(s2)

Этот вариант работает за O(n) и не изменяет исходные строки. Подходит для длинных строк.

Ошибка – сравнение строк без учёта пробелов, знаков препинания и регистра. Для точной проверки необходимо нормализовать обе строки одинаково. Также следует обработать случай разной длины: если строки разной длины, они не могут быть анаграммами.

- пробелы python задача (задача на пробелы в строке python)
- задачи на if else python (задачи на условные операторы if-else в python)
- задачи на работу с файлами python (задачи на работу с файлами в python)

Расширенные примеры к тестовым задачам

FizzBuzz: генерация списка с помощью map и lambda

Пример, в котором результат создаётся в виде списка строк.

Пример
def fizzbuzz_list(n):
    def transform(x):
        if x % 15 == 0:
            return 'FizzBuzz'
        if x % 3 == 0:
            return 'Fizz'
        if x % 5 == 0:
            return 'Buzz'
        return str(x)
    return list(map(transform, range(1, n + 1)))

result = fizzbuzz_list(20)
print(result[:10])  # первые 10 элементов
['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', '7', '8', 'Fizz', 'Buzz']

Палиндром: рекурсивная проверка

Рекурсивная функция, которая проверяет только крайние символы.

Пример
def is_palindrome_rec(s: str) -> bool:
    s = ''.join(ch for ch in s if ch.isalnum()).lower()
    if len(s) <= 1:
        return True
    if s[0] != s[-1]:
        return False
    return is_palindrome_rec(s[1:-1])

print(is_palindrome_rec('A man, a plan, a canal: Panama'))
print(is_palindrome_rec('race a car'))
True
False

Частота символов: получение топ-N символов

Решение с Counter и методом most_common.

Пример
from collections import Counter
text = "Hello, world! Programming in Python is fun."
freq = Counter(text.lower())
top_three = freq.most_common(3)
print(top_three)
[(' ', 6), ('o', 4), ('l', 3)]

Анаграммы: работа с файлом и поиск пар

Чтение списка слов из файла и поиск анаграмматических пар.

Пример
from collections import defaultdict

def find_anagrams(words):
    anagrams = defaultdict(list)
    for word in words:
        key = ''.join(sorted(word.lower()))
        anagrams[key].append(word)
    return {k: v for k, v in anagrams.items() if len(v) > 1}

words = ['listen', 'silent', 'enlist', 'python', 'typhon', 'code', 'deco']
result = find_anagrams(words)
for key, group in result.items():
    print(f'{key}: {group}')
eilnst: ['listen', 'silent', 'enlist']
hinopty: ['python', 'typhon']
cdeo: ['code', 'deco']

Тестовые задачи по Python - comments

En
тест задачи python (python)