Практикум по 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().
Декоратор 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