Циклы и арифметика
for i in range(a, b, c) перебирает $i = a, a+c, a+2c, \dots$ пока $i \lt b$. Цикл while выполняется, пока условие истинно.
s = 0
for i in range(1, 6):
s += i * i
print(s) # 1 + 4 + 9 + 16 + 25 = 55
| Выражение | Значение |
|---|---|
| 17 // 5 | 3 |
| 17 % 5 | 2 |
| 17 / 5 | 3.4 (всегда дробное) |
| −17 // 5 | −4 (округляет вниз!) |
| 2 ** 5 | 32 |
range(2, 20, 3) даёт 2, 5, 8, 11, 14, 17 — число 20 не входит и даже 19 не достигается: шаг 3 «перескакивает».Проверь себя. Сколько раз выполнится тело цикла for i in range(2, 20, 3)?
Ответ: 6
Строки и списки
Нумерация с нуля. Срез s[a:b] берёт символы с номерами от $a$ до $b-1$. Отрицательные индексы считают с конца.
s = "информатика"
print(s[2:6]) # форм
print(s[-3:]) # ика
print(len(s)) # 11
a = [3, 1, 4, 1, 5, 9, 2, 6]
a.sort()
print(a[2]) # 2 (список стал 1 1 2 3 4 5 6 9)
sort() меняет сам список, а sorted(a) возвращает новый. Список [x*x for x in range(5) if x % 2 == 0] — «генератор списка»: получится [0, 4, 16].Цифры числа и делители
n = 1234
s = 0
while n > 0:
s += n % 10 # последняя цифра
n //= 10 # убираем её
print(s) # 10
Число делителей считаем циклом: d = sum(1 for k in range(1, n + 1) if n % k == 0). Для чисел до нескольких миллионов перебирают $k$ только до $\sqrt{n}$, учитывая пары $(k,\ n/k)$.
Типичное ЕГЭ-25. Сколько чисел из отрезка [1000; 1100] имеют ровно 4 делителя? Перебираем $n$, считаем делители, увеличиваем счётчик: ответ 23.
Как читать чужой код
Заведите таблицу значений переменных и выполняйте программу по шагам. Обращайте внимание на: границы range, различие = и ==, отступы (тело цикла/условия), порядок операций.
s = 0
i = 1
while s < 50:
s += i
i += 2
print(s, i) # 64 17 (суммы 1, 4, 9, …, 64 — квадраты)