Каппес Даниил Олегович

ПРАКТИКУМ PYTHON · ЗАНЯТИЕ 3

Встроенные функции, строки, модуль math, цикл for

Готовые функции вместо длинных развилок, первое знакомство со строками — и цикл, который повторяет одно и то же нужное число раз.

Чему научимся

Ещё несколько встроенных функций

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

ФункцияЧто делает
min(a, b, …)наименьшее из значений; аргументов сколько угодно
max(a, b, …)наибольшее из значений
abs(x)модуль числа: abs(-7) → 7
len(s)длина строки или списка

round() из прошлого занятия — из той же семьи: все эти функции встроены в язык, и подключать для них ничего не нужно.

3.1

Наименьшее и наибольшее из пяти

Напишите программу, которая находит наименьшее и наибольшее из пяти чисел.

Формат входных данных
Пять целых чисел, каждое на отдельной строке.
Формат выходных данных
Две строки с поясняющими надписями.
Ввод
1
2
3
4
5
Вывод
Наименьшее число = 1
Наибольшее число = 5
Подсказка 1

Развилки тут не нужны вовсе: обе функции принимают сколько угодно аргументов.

Подсказка 2

Пять значений удобно прочитать одной строкой — множественным присваиванием.

Разбор
  1. Читаем пять чисел в пять переменных.
  2. min(a, b, c, d, e) и max(a, b, c, d, e) дают ответы сразу.
Решение
a, b, c, d, e = int(input()), int(input()), int(input()), int(input()), int(input())

print('Наименьшее число =', min(a, b, c, d, e))
print('Наибольшее число =', max(a, b, c, d, e))

Через развилки то же самое заняло бы десяток строк и пару шансов ошибиться. Готовая функция — не «поблажка», а обычный инструмент: важно уметь и то и другое, а писать — короткое.

3.2

Три числа по убыванию

Напишите программу, которая упорядочивает три числа от большего к меньшему.

Формат входных данных
Три целых числа, каждое на отдельной строке.
Формат выходных данных
Три числа по убыванию, каждое на отдельной строке.
Ввод 1
3
1
2
Вывод 1
3
2
1
Ввод 2
5
5
3
Вывод 2
5
5
3
Подсказка 1

Крайние значения находятся сразу: max() и min().

Подсказка 2

Среднее искать сравнениями не нужно — сумма трёх чисел известна, а два из трёх уже найдены.

Разбор
  1. Наибольшее — max(a, b, c), наименьшее — min(a, b, c).
  2. Среднее — это сумма всех трёх минус наибольшее и наименьшее.
  3. Печатаем в порядке: наибольшее, среднее, наименьшее.
Решение
a, b, c = int(input()), int(input()), int(input())

print(max(a, b, c))
# среднее = сумма всех трёх минус крайние
print(a + b + c - min(a, b, c) - max(a, b, c))
print(min(a, b, c))

Приём с суммой работает и когда числа совпадают: у 5, 5, 3 наибольшее 5, наименьшее 3, а среднее 13 − 3 − 5 = 5. Разбор случаев через if дал бы то же самое, но строк в пять раз больше.

3.3

Сумма модулей

Даны пять чисел. Напишите программу, которая вычисляет сумму их модулей.

Попробуйте уложиться в одну строку кода. А потом посмотрите на неё и подумайте: всегда ли стоит «экономить» строки?

Формат входных данных
Пять действительных чисел, каждое на отдельной строке.
Формат выходных данных
Одно число — сумма модулей.
Ввод
1
-2
3
-4
5
Вывод
15.0
Подсказка 1

Модуль каждого числа берётся отдельно, а потом всё складывается.

Подсказка 2

float(input()) можно поставить прямо внутрь abs() — отдельная переменная не обязательна.

Разбор
  1. Каждое слагаемое — это abs(float(input())).
  2. Пять таких слагаемых складываются в одном print().
Решение
print(abs(float(input())) + abs(float(input())) + abs(float(input()))
      + abs(float(input())) + abs(float(input())))

Программа честно уложилась в одну команду — и стала неудобочитаемой. Строка, в которой сложно даже сосчитать скобки, ошибку прячет, а не предотвращает. Вариант с пятью переменными длиннее, но понятнее — и он лучше. Коротко ≠ хорошо.

3.4

Манхэттенское расстояние

Прогуливаясь по Манхэттену, вы не можете попасть из точки А в точку Б по прямой: если только вы не проходите сквозь стены, придётся идти вдоль улиц — вбок и вверх.

Манхэттенское расстояние между точками (p₁; p₂) и (q₁; q₂) считается так: |p₁ − q₁| + |p₂ − q₂|. Напишите программу, которая его вычисляет.

Формат входных данных
Четыре целых числа: p₁, p₂, q₁, q₂ — каждое на отдельной строке.
Формат выходных данных
Одно число — манхэттенское расстояние.
Ввод
1
1
4
5
Вывод
7
Подсказка 1

Вертикальные палочки в формуле — это модуль, то есть abs().

Подсказка 2

Следите за порядком ввода: сначала обе координаты первой точки, потом второй.

Разбор
  1. Разность координат по горизонтали берём по модулю: abs(p1 - q1).
  2. То же по вертикали: abs(p2 - q2).
  3. Складываем.
Решение
p1 = int(input())
p2 = int(input())
q1 = int(input())
q2 = int(input())

# модуль нужен, чтобы порядок точек не влиял на ответ
print(abs(p1 - q1) + abs(p2 - q2))

Без abs() расстояние вышло бы отрицательным, стоит поменять точки местами. Модуль здесь — не украшение формулы, а то, что делает её симметричной.

Строки: длина, сложение, повторение

Строковый тип называется str (от string). Строка — это текст в кавычках, одинарных или двойных: 'Python rocks!' и "Python rocks!" — одно и то же. Две кавычки подряд дают пустую строку: s = ''.

Длина строки — количество символов в ней; её даёт встроенная функция len():

s = 'abcdef'
print(len(s))

Результат

6

Сложение строк называется конкатенацией (сцеплением), а умножение на число повторяет строку:

print('ab' + 'bc')
print('Hi' * 4)

Результат

abbc
HiHiHiHi

Строку из числа делает str() — это обратное к int() и float(). Складывать текст с числом напрямую Python не станет: 'возраст: ' + 27 — ошибка, а 'возраст: ' + str(27) — нет.

Два вида кавычек нужны не для разнообразия: они позволяют вставлять кавычки внутрь текста. 'Он сказал "да"' и "Это же 'Война и мир'" пишутся без всяких ухищрений. А тройные кавычки годятся для текста в несколько строк.

3.5

Hello, %имя%!

Напишите программу, которая считывает имя и фамилию пользователя и выводит фразу «Hello [имя] [фамилия]! You just delved into Python».

Формат входных данных
Две строки: имя и фамилия.
Формат выходных данных
Одна строка в соответствии с условием.
Ввод
Timur
Guev
Вывод
Hello Timur Guev! You just delved into Python
Подсказка 1

Пробелы между словами print() расставит сам — а вот восклицательный знак должен встать вплотную к фамилии.

Подсказка 2

Вплотную — значит, склеить: surname + '!'.

Разбор
  1. Читаем имя и фамилию.
  2. Печатаем четыре значения: слово Hello, имя, фамилию со знаком и остаток фразы.
  3. Знак приклеиваем конкатенацией, иначе print() вставит перед ним пробел.
Решение
name = input()
surname = input()

# '!' приклеиваем к фамилии, иначе print поставит перед ним пробел
print('Hello', name, surname + '!', 'You just delved into Python')

Это первая задача, где видно, зачем нужна конкатенация: print() умеет ставить пробелы, но не умеет их не ставить в одном конкретном месте.

3.6

Самый короткий и самый длинный

Даны названия трёх городов. Напишите программу, которая определяет самое короткое и самое длинное название.

Гарантируется, что длины всех трёх названий различны.

Формат входных данных
Три строки — названия городов.
Формат выходных данных
Две строки: сначала самое короткое название, потом самое длинное.
Ввод
Москва
Санкт-Петербург
Екатеринбург
Вывод
Москва
Санкт-Петербург
Подсказка 1

Сравнивать надо не сами названия, а их длины — len().

Подсказка 2

Вывести нужно название, а не число. Значит, в развилке решается, какую переменную печатать.

Разбор
  1. Если длина первого меньше длин обоих остальных — самое короткое найдено.
  2. Иначе выбор между вторым и третьим — одно сравнение.
  3. Для самого длинного — то же самое, но со знаком «больше».
Решение
a = input()
b = input()
c = input()

# самое короткое
if len(a) < len(b) and len(a) < len(c):
    print(a)
elif len(b) < len(c):
    print(b)
else:
    print(c)

# самое длинное — те же сравнения наоборот
if len(a) > len(b) and len(a) > len(c):
    print(a)
elif len(b) > len(c):
    print(b)
else:
    print(c)

min() и max() здесь не помогут: они сравнивали бы сами строки по алфавиту, а не по длине. Сравнивать надо длины, а печатать — строки, и развилка тут неизбежна.

Оператор in: есть ли внутри

Оператор in проверяет, встречается ли одна строка внутри другой:

s = input()
if 'a' in s:
    print('Введённая строка содержит символ а')
else:
    print('Введённая строка не содержит символ а')

Работает он и с целыми кусками, а не только с одиночными буквами. Вместе с not получается проверка «не содержит»:

if '.' not in s:
    print('В строке нет точки')

Если строка s₁ содержится в строке s₂, говорят, что s₁ — подстрока для s₂. Проверка в in идёт с учётом регистра: 'Синий' in 'синий шар' — это False.

3.7

Цвет настроения синий

Напишите программу, которая считывает строку и выводит «YES», если в ней есть подстрока «синий», и «NO» в противном случае.

Формат входных данных
Одна строка.
Формат выходных данных
YES или NO.
Ввод 1
Какой хороший день!
Вывод 1
NO
Ввод 2
Как называется этот красивый синий камень в Вашем кольце?
Вывод 2
YES
Подсказка 1

Вся задача — одна проверка оператором in.

Подсказка 2

Искомое слово пишется в кавычках, а строка, в которой ищем, лежит в переменной.

Разбор
  1. Читаем строку.
  2. if 'синий' in text: — печатаем YES, иначе NO.
Решение
text = input()

if 'синий' in text:
    print('YES')
else:
    print('NO')

Порядок в записи важен: 'синий' in text — это «ищем синий внутри текста». Написав наоборот, вы будете искать целый текст внутри слова «синий» и почти всегда получите NO.

3.8

Корректный email

Будем считать адрес электронной почты корректным, если в нём есть символ собачки @ и точка. Напишите программу, проверяющую корректность адреса: она выводит «YES» или «NO».

Наличия @ и . для настоящей корректности мало, а вот их отсутствие гарантированно делает адрес неверным.

Формат входных данных
Одна строка — адрес.
Формат выходных данных
YES или NO.
Ввод 1
student@example.com
Вывод 1
YES
Ввод 2
student.example.com
Вывод 2
NO
Подсказка 1

Проверок две, и обе обязательны.

Подсказка 2

«Обе обязательны» — это and.

Разбор
  1. Первая проверка: '@' in address.
  2. Вторая: '.' in address.
  3. Соединяем через and — годится только адрес, где есть и то и другое.
Решение
address = input()

# нужны оба символа сразу, поэтому and
if '@' in address and '.' in address:
    print('YES')
else:
    print('NO')

Такая проверка пропустит и @., и а@б., но задача ровно такая: отсечь заведомо неверное. Настоящая проверка адреса — это уже разбор строки по частям, и он будет на шестом занятии.

Модуль math

Часть функций лежит не «в самом языке», а в модулях — библиотеках, которые подключают по мере надобности. Один из главных — math, всё для вычислений с вещественными числами.

import math

print(math.sqrt(2))     # корень квадратный
print(math.ceil(3.8))   # округление вверх
print(math.floor(3.8))  # округление вниз

Результат

1.4142135623730951
4
3

Писать math. перед каждой функцией не обязательно. Можно подключить содержимое модуля целиком — тогда имена станут доступны напрямую:

from math import *

print(sqrt(2))

Или взять только нужное — тогда остальное так и останется недоступным:

from math import sqrt, ceil

print(sqrt(25))
print(ceil(34.7))
print(floor(12.8))   # ошибка: floor не подключали
ФункцияЧто делает
sqrt(x)квадратный корень
ceil(x)округление вверх («потолок»)
floor(x)округление вниз («пол»)
pow(x, n)возведение в степень
factorial(n)факториал натурального числа
log(x), log10(x), log(x, b)логарифмы: натуральный, десятичный, по основанию b
sin(x), cos(x), tan(x)тригонометрия; угол — в радианах
radians(x), degrees(x)перевод градусов в радианы и обратно
pi, eконстанты π = 3.141592653589793 и e = 2.718281828459045

int(), float(), abs(), min(), max(), round() — встроенные, и math для них подключать не нужно. А sqrt() без подключения работать не будет.

3.9

Евклидово расстояние

Евклидово расстояние между точками (x₁; y₁) и (x₂; y₂) — это обычное расстояние по прямой: корень из (x₁ − x₂)² + (y₁ − y₂)². Напишите программу, которая его вычисляет.

Формат входных данных
Четыре вещественных числа: x₁, y₁, x₂, y₂ — каждое на отдельной строке.
Формат выходных данных
Одно число — расстояние.
Ввод
0
0
3
4
Вывод
5.0
Подсказка 1

Формула переписывается почти буквально: разности, квадраты, сумма и корень.

Подсказка 2

Корень живёт в модуле math, значит, его надо подключить в первой строке.

Разбор
  1. Читаем четыре числа как float — координаты могут быть дробными.
  2. Считаем (x1 - x2) 2 + (y1 - y2) 2.
  3. Берём от суммы корень: math.sqrt(...).
Решение
import math

x1 = float(input())
y1 = float(input())
x2 = float(input())
y2 = float(input())

# теорема Пифагора: корень из суммы квадратов катетов
print(math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2))

Модуль здесь не нужен: квадрат и так делает разность неотрицательной. Сравните с манхэттенским расстоянием из задачи 3.4 — там abs() был обязателен, а здесь его роль играет возведение в квадрат.

3.10

Круг: площадь и длина окружности

Напишите программу, определяющую площадь круга и длину окружности по заданному радиусу R.

Используйте константу math.pi — своё приближение вроде 3.14 писать не нужно.

Формат входных данных
Одно вещественное число R.
Формат выходных данных
Два числа: сначала площадь круга, потом длина окружности.
Ввод
1
Вывод
3.141592653589793
6.283185307179586
Подсказка 1

Площадь круга — πR², длина окружности — 2πR.

Подсказка 2

π берётся из модуля math и пишется как math.pi.

Разбор
  1. Подключаем math, читаем радиус как float.
  2. Площадь: math.pi * R ** 2.
  3. Длина: 2 * math.pi * R.
Решение
import math

R = float(input())

print(math.pi * R ** 2)    # площадь круга
print(2 * math.pi * R)     # длина окружности

math.pi — это π с полной точностью типа float, а 3.14 даёт ошибку уже в третьем знаке. Там, где готовая константа есть, писать её вручную незачем.

3.11

Квадратное уравнение

Даны три вещественных числа a, b, c. Напишите программу, которая находит вещественные корни уравнения ax² + bx + c = 0.

Если корней два, выведите их в порядке возрастания. Если вещественных корней нет — выведите «Нет корней».

Формат входных данных
Три вещественных числа, каждое на отдельной строке.
Формат выходных данных
Корни уравнения или текст «Нет корней».
Ввод 1
1
-7.5
3
Вывод 1
0.4239663260874824
7.076033673912518
Ввод 2
1
2
1
Вывод 2
-1.0
Ввод 3
1
0
1
Вывод 3
Нет корней
Подсказка 1

Всё решает дискриминант D = b² − 4ac: больше нуля — два корня, равен нулю — один, меньше — ни одного.

Подсказка 2

Формула корня — (−b ± √D) / 2a. Который из двух окажется меньше, зависит от знака a, поэтому порядок вывода лучше не угадывать.

Разбор
  1. Считаем дискриминант.
  2. Каскад из трёх веток: D > 0, D == 0, иначе.
  3. При двух корнях печатаем min и max от них — так порядок возрастания получится при любом знаке a.
Решение
import math

a = float(input())
b = float(input())
c = float(input())

D = b ** 2 - 4 * a * c

if D > 0:
    x1 = (-b + math.sqrt(D)) / (2 * a)
    x2 = (-b - math.sqrt(D)) / (2 * a)
    print(min(x1, x2))   # min и max — чтобы порядок не зависел от знака a
    print(max(x1, x2))
elif D == 0:
    print(-b / (2 * a))
else:
    print('Нет корней')

Печатать x1, потом x2 заманчиво, но при отрицательном a больший корень получается первым, и порядок ломается. min и max избавляют от разбора знаков.

3.12

Площадь правильного многоугольника

Правильный многоугольник — выпуклый многоугольник, у которого равны все стороны и все углы. Его площадь при длине стороны a и числе сторон n считается по формуле:

Формула

S = n * a² / (4 * tg(π / n))

Напишите программу, которая находит площадь такого многоугольника.

Формат входных данных
Два числа: натуральное n и вещественное a, каждое на отдельной строке.
Формат выходных данных
Одно вещественное число — площадь.
Ввод
4
10
Вывод
100.00000000000001
Подсказка 1

Формула переносится в код почти буквально; тангенс и π живут в math.

Подсказка 2

Аргумент тангенса — уже в радианах: π/n переводить не нужно.

Разбор
  1. Читаем n как целое, a — как вещественное.
  2. Считаем знаменатель 4 * math.tan(math.pi / n).
  3. Делим на него n * a ** 2.
Решение
import math

n = int(input())
a = float(input())

# π/n уже в радианах — переводить ничего не нужно
print(n * a ** 2 / (4 * math.tan(math.pi / n)))

Квадрат со стороной 10 даёт 100.00000000000001 вместо ровной сотни — тот самый хвост типа float, о котором говорилось на прошлом занятии. Формула верна, просто тангенс 45° вычисляется приближённо.

3.13

Тригонометрическое выражение

Напишите программу, вычисляющую значение выражения sin x + cos x + tg² x по заданному числу градусов x.

Тригонометрические функции принимают аргумент в радианах. Перевести градусы в радианы умеет math.radians(). Отдельной функции для квадрата тангенса нет — его возводят в степень: math.tan(angle) ** 2.

Формат входных данных
Одно вещественное число x — угол в градусах.
Формат выходных данных
Одно число — значение выражения.
Ввод 1
0
Вывод 1
1.0
Ввод 2
45
Вывод 2
2.414213562373095
Ввод 3
30
Вывод 3
1.6993587371177719
Подсказка 1

Сначала перевод в радианы, потом синус, косинус и тангенс — все от уже переведённого значения.

Подсказка 2

Переводить трижды не нужно: заведите переменную с углом в радианах.

Разбор
  1. math.radians(x) даёт угол в радианах.
  2. Считаем math.sin(...), math.cos(...) и math.tan(...) от него.
  3. Тангенс возводим в квадрат — ** 2 — и складываем все три слагаемых.
Решение
import math

x = float(input())
angle = math.radians(x)   # переводим градусы в радианы один раз

print(math.sin(angle) + math.cos(angle) + math.tan(angle) ** 2)

Если забыть перевод, программа не сломается — она посчитает синус угла в радианах и выдаст правдоподобное, но неверное число. Такие ошибки самые неприятные: результат есть, и он неправильный. Проверяйте себя на нуле: sin 0 + cos 0 + tg² 0 = 0 + 1 + 0 = 1.

3.14

Потолок плюс пол

Напишите программу, вычисляющую значение ⌈x⌉ + ⌊x⌋ по заданному вещественному числу x.

⌈x⌉ — «потолок», округление вверх; ⌊x⌋ — «пол», округление вниз.

Формат входных данных
Одно вещественное число x.
Формат выходных данных
Одно число — значение выражения.
Ввод 1
3.8
Вывод 1
7
Ввод 2
5
Вывод 2
10
Подсказка 1

Обе функции есть в math и называются ровно так, как читаются их значки.

Подсказка 2

У целого числа пол и потолок совпадают — проверьте это вторым примером.

Разбор
  1. math.ceil(x) — вверх, math.floor(x) — вниз.
  2. Складываем результаты.
Решение
import math

x = float(input())

print(math.ceil(x) + math.floor(x))

round() тут не подойдёт: он округляет к ближайшему, а нам нужны обе стороны сразу. У 3.8 это 4 и 3, а round() дал бы 4 дважды.

Цикл for: повторить n раз

Циклов в Python два: for — когда заранее известно, сколько раз повторять, и while — когда повторять надо до наступления события. Начнём с первого.

for i in range(10):
    print('Привет')

Двоеточие в конце строки, как и у if, говорит, что дальше идёт блок. В тело цикла входят все строки с отступом — они и повторяются.

print('A')
for i in range(3):
    print('B')
    print('C')
print('D')

Результат

A
B
C
B
C
B
C
D

Переменная цикла — это не просто счётчик повторений, ей на каждом шаге присваивается очередное число:

for i in range(3):
    print(i)

Результат

0
1
2

Считает Python с нуля, и правая граница не включается: range(4) даёт 0, 1, 2, 3. Если нужно начать с единицы, к переменной прибавляют единицу прямо в теле: print(i + 1).

Для переменной цикла обычно берут буквы i, j, k. Так сложилось исторически: программы писались для расчётов, а буквы a, b, c и x, y, z в математике уже заняты. Если переменная в теле не нужна вовсе, вместо имени часто ставят подчёркивание: for _ in range(5).

Строка и цикл: перебор символов

Цикл for умеет идти не только по числам из range(). Если поставить после in строку, переменная цикла на каждом шаге примет очередной её символ:

s = 'Python'
for c in s:
    print(c)

Результат

P
y
t
h
o
n

Имя c взято от английского char — символ. Такой перебор удобен, когда номер символа не нужен, а нужен он сам: посчитать буквы, сложить цифры, проверить, есть ли в строке пробел.

word = input()

count = 0
for c in word:
    if c == 'а':
        count += 1

print('Букв «а»:', count)

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

3.15

Повторить предложение

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

Формат входных данных
Первая строка — предложение, вторая — количество повторений.
Формат выходных данных
Предложение, напечатанное нужное число раз.
Ввод
Привет
3
Вывод
Привет
Привет
Привет
Подсказка 1

Сколько раз повторять — известно заранее, значит, нужен for.

Подсказка 2

Переменная цикла в теле не понадобится: печатается одно и то же.

Разбор
  1. Читаем строку, потом число (его — через int()).
  2. for i in range(n) повторит тело ровно n раз.
Решение
sentence = input()
n = int(input())

for i in range(n):
    print(sentence)

Обратите внимание на порядок чтения: сначала предложение, потом число. Поменяете местами — программа попытается превратить предложение в число и остановится с ошибкой.

3.16

Звёздный прямоугольник

На вход подаётся натуральное число n ∈ [1; 20] — высота звёздного прямоугольника. Напишите программу, которая печатает прямоугольник размерами n × 19.

Для печати звёздной линии используйте умножение строки на число.

Формат входных данных
Натуральное число n.
Формат выходных данных
n строк по 19 звёздочек.
Ввод
3
Вывод
*******************
*******************
*******************
Подсказка 1

Строка из 19 звёздочек получается умножением: '*' * 19.

Подсказка 2

Осталось напечатать её n раз — это цикл.

Разбор
  1. Читаем высоту.
  2. В цикле range(n) печатаем '*' * 19.
Решение
n = int(input())

for i in range(n):
    print('*' * 19)   # ширина одна и та же на каждой строке

Ширина здесь постоянная, поэтому строка внутри цикла не меняется. В следующей задаче она станет зависеть от номера шага — и прямоугольник превратится в треугольник.

3.17

Звёздный треугольник

На вход подаётся натуральное число n (n ≥ 2) — катет прямоугольного равнобедренного треугольника. Напишите программу, которая выводит треугольник по образцу.

Формат входных данных
Одно натуральное число n.
Формат выходных данных
Треугольник из звёздочек.
Ввод 1
2
Вывод 1
**
*
Ввод 2
3
Вывод 2
***
**
*
Подсказка 1

Число звёздочек в строках убывает: n, n−1, …, 1.

Подсказка 2

range() умеет считать в обратную сторону — третьим параметром задаётся шаг, и он может быть отрицательным.

Разбор
  1. Нужны длины от n до 1 включительно.
  2. range(n, 0, -1) даёт ровно их: старт n, стоп 0 (не включается), шаг −1.
  3. На каждом шаге печатаем '*' * i.
Решение
n = int(input())

# range с отрицательным шагом: n, n-1, …, 1
for i in range(n, 0, -1):
    print('*' * i)

Можно было бы идти и вперёд, печатая '*' * (n - i), — но тогда придётся в уме пересчитывать номер шага в длину строки. Обратный отсчёт делает это за нас.

3.18

Популяция

На вход подаются три натуральных числа: m — стартовое количество организмов, p — среднесуточный прирост в процентах, n — количество дней. Напишите программу, которая предсказывает размер популяции и печатает его для каждого дня, с первого по n-й.

Формат входных данных
Три натуральных числа m, p, n, каждое на отдельной строке.
Формат выходных данных
n строк вида «номер дня и размер популяции».
Ввод 1
10
50
3
Вывод 1
1 10.0
2 15.0
3 22.5
Ввод 2
120
25
2
Вывод 2
1 120.0
2 150.0
Подсказка 1

Рост на p процентов — это умножение на (1 + p/100), а не прибавление p.

Подсказка 2

В первый день популяция ещё не выросла: печатать надо до умножения, а не после.

Разбор
  1. Заводим переменную с начальной численностью — вещественную, потому что после первого же роста она перестанет быть целой.
  2. Цикл идёт по номерам дней: range(1, n + 1).
  3. На каждом шаге сначала печатаем день и текущую численность, потом умножаем её на (1 + p/100).
Решение
m = int(input())   # стартовое количество
p = int(input())   # прирост в процентах за сутки
n = int(input())   # сколько дней считаем

population = float(m)   # дальше численность станет дробной

for day in range(1, n + 1):
    print(day, population)
    population = population * (1 + p / 100)

Порядок «сначала напечатать, потом умножить» и даёт первый день без прироста. Поменяйте строки местами — и первый день окажется уже вторым. А float(m) нужен ради вывода: в примере стоит 10.0, а не 10.

Итог занятия

Главное с третьего занятия. min(), max(), abs(), round(), len() — встроенные и всегда под рукой; sqrt(), ceil(), floor(), pi живут в модуле math и требуют import. Строки складываются и умножаются, а оператор in отвечает на вопрос «есть ли внутри». Цикл for i in range(n) повторяет тело n раз, переменная цикла считает от нуля, а третий параметр range() задаёт шаг — в том числе отрицательный.