Практикум по Python: от простых операций к сложным

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

Базовые задачи Python

Как перевернуть строку?

Наиболее эффективное решение - срез с шагом -1:

s = 'Привет, мир!'
reversed_s = s[::-1]
print(reversed_s)  # !рим ,тевирП

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

Этот способ использует встроенные возможности Python и работает за O(n).

Как перевернуть строку с помощью цикла?

s = 'Python'
result = ''
for char in s:
    result = char + result
print(result)  # nohtyP

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

Цикл понятен, но конкатенация строк в цикле неэффективна из-за создания новых строк.

Как перевернуть строку с помощью reversed и join?

s = '12345'
reversed_str = ''.join(reversed(s))
print(reversed_str)  # 54321

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

Типичные ошибки при перевороте строки:

  • Вызов метода .reverse() у строки - AttributeError, так как этот метод есть только у списков.
  • Попытка изменить строку по индексу: s[0] = 'a' - TypeError, строки неизменяемы.
  • Использование s[::-1] для строки, содержащей Unicode-символы (например, эмодзи) - срез работает корректно, так как Python учитывает кодовые точки Unicode, но может разбить составные символы.

Как отсортировать список чисел по возрастанию?

Встроенная функция sorted возвращает новый отсортированный список:

nums = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_nums = sorted(nums)
print(sorted_nums)  # [1, 1, 2, 3, 4, 5, 6, 9]
print(nums)         # [3, 1, 4, 1, 5, 9, 2, 6]

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

Как отсортировать список на месте?

nums = [3, 1, 4, 1, 5, 9, 2, 6]
nums.sort()
print(nums)  # [1, 1, 2, 3, 4, 5, 6, 9]

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

Метод sort() изменяет исходный список и возвращает None.

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

nums = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_desc = sorted(nums, reverse=True)
print(sorted_desc)  # [9, 6, 5, 4, 3, 2, 1, 1]

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

Возможные проблемы:

  • Попытка отсортировать список с разнотипными элементами (например, числа и строки) вызовет TypeError.
  • Использование .sort() и присвоение его результата переменной: nums = nums.sort() приведет к тому, что nums станет None.

Как подсчитать частоту символов в строке?

Самый простой способ - использовать collections.Counter:

from collections import Counter
text = 'hello world'
counter = Counter(text)
print(counter)  # Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

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

Как подсчитать частоту вручную с помощью словаря?

text = 'hello world'
freq = {}
for char in text:
    freq[char] = freq.get(char, 0) + 1
print(freq)  # {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}

задачи на последовательности python (задачи на последовательности в python)

Метод .get() позволяет избежать проверки наличия ключа.

Как подсчитать частоту с использованием defaultdict?

from collections import defaultdict
text = 'hello world'
freq = defaultdict(int)
for char in text:
    freq[char] += 1
print(dict(freq))

Распространенные ошибки:

  • Использование dict[char] = dict[char] + 1 без проверки существования ключа вызовет KeyError.
  • Забывание импортировать Counter или defaultdict.
  • Подсчет с учетом регистра - по умолчанию регистр учитывается, для безрегистрового подсчета нужно привести строку к lower().
- задачи на if else python (задачи на условные операторы if-else в python)
- задачи на работу с файлами python (задачи на работу с файлами в python)
- задачи на функции в python (задачи на функции в python)

Декоратор lru_cache для рекурсивных функций

Пример
from functools import lru_cache

@lru_cache(maxsize=128)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(40))  # 102334155
102334155

lru_cache автоматически сохраняет результаты вызовов, предотвращая повторные вычисления.

Создание контекстного менеджера для замера времени

Пример
import time

class Timer:
    def __enter__(self):
        self.start = time.time()
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.end = time.time()
        print(f'Время выполнения: {self.end - self.start:.4f} сек')

with Timer():
    sum(range(1000000))
Время выполнения: 0.0123 сек

Использование itertools.chain для объединения итераторов

Пример
from itertools import chain

list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = [7, 8, 9]
combined = list(chain(list1, list2, list3))
print(combined)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Генератор бесконечной последовательности простых чисел

Пример
def primes():
    yield 2
    odd_nums = 3
    primes_list = [2]
    while True:
        is_prime = True
        for p in primes_list:
            if p * p > odd_nums:
                break
            if odd_nums % p == 0:
                is_prime = False
                break
        if is_prime:
            primes_list.append(odd_nums)
            yield odd_nums
        odd_nums += 2

gen = primes()
for _ in range(15):
    print(next(gen), end=' ')
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

Базовые задачи Python - comments

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