© Яценко Р.Н., 2019-2020
Важным принципом современного программирования является структурный принцип
В структурированной программе отдельные ее части, предназначенные для решения каких-то частных небольших задач, организованы в подпрограммы
Один и тот же фрагмент можно использовать многократно как в одной, так и в разных программах, не набирая его текст заново
Программы лучше писать небольшими частями. Такие программы легче читать, тестировать и отлаживать. У них, как правило, более четкая логическая структура
Она записывается однократно, а в соответствующих местах программы обеспечивается лишь обращение к ней по имени
В Python подпрограммы реализуются с помощью функций
В математике факториал числа n определяется как
\[n! = 1 \cdot 2 \cdot ... \cdot n\]
Например, \(5! = 1 \cdot 2 \cdot 3 \cdot 4 \cdot 5 = 120\)
# вычислим 3! res = 1 for i in range(1, 4): res *= i print(res) # вычислим 5! res = 1 for i in range(1, 6): res *= i print(res)
6
120
def имя_функции(параметры):
# тело_функции
return результат
имя_функции
– это содержательный идентификаторпараметры
– это список специальных переменных, которые используются для передачи данных в функциютело_функции
– набор команд, которые должны быть выполненыreturn результат
– завершает работу функции и возвращает указанное значениеdef factorial(n): res = 1 for i in range(1, n + 1): res *= i return res print(factorial(3)) print(factorial(5))
def max(a, b): if a > b: return a else: return b print(max(3, 5)) print(max(6, 3))
5
6
def max(a, b): if a > b: return a else: return b def max3(a, b, c): return max(max(a, b), c) print(max3(3, 5, 4))
5
def display(message): print(message) def give_me_five(): five = 5 return five def ask_yes_no(question): # Задает вопрос с ответом 'y' или 'n' response = None while response not in ("y", "n"): response = input(question).lower() return response
# основная часть display("Вам сообщение.") number = give_me_five() print("Вот что возвратила функция give_me_five():", number) answer = ask_yes_no("Пожалуйста, введите 'y' или 'n': ") print("Спасибо, что ввели:", answer)
def cylinder(h, r = 1): side = 2 * 3.14 * r * h circle = 3.14 * r**2 full = side + 2 * circle return full figure1 = cylinder(4, 3) figure2 = cylinder(5) print(figure1) print(figure2)
131.88
37.68
def f(): print(a) a = 1 f()
1
def f(): a = 1 f() print(a)
NameError: name 'a' is not defined
def f(): a = 1 print(a) a = 0 f() print(a)
1
0
Если внутри функции модифицируется значение глобальной переменной, то переменная с таким именем становится локальной переменной, и ее модификация не приведет к изменению глобальной переменной
Если ваша функция должна поменять какую-то переменную, пусть лучше она вернёт это значением, и вы сами при вызове функции явно присвоите в переменную это значение
В этом случае функции получаются независимыми от кода, и их можно легко копировать из одной программы в другую
def short_story(): print("У попа была собака, он ее любил.") print("Она съела кусок мяса, он ее убил,") print("В землю закопал и надпись написал:") short_story()
Известно, что 0!=1, 1!=1.
А как вычислить величину n! для большого n?
\[n! = n \cdot (n-1)! = n \cdot (n-1) \cdot (n-2)! = ...\]
В конце концов, мы дойдем до величины 0!, которая равна 1
def factorial(n): if n == 0: return 1 else: return n * factorial(n - 1) print(factorial(5))
Неправильное оформление выхода из рекурсии. Например, если мы в программе вычисления факториала забудем поставить проверку if n == 0
, то factorial(0)
вызовет factorial(-1)
, тот вызовет factorial(-2)
и т.д.
Рекурсивный вызов с неправильными параметрами. Например, если функция factorial(n)
будет вызывать factorial(n)
, то также получится бесконечная цепочка
© Яценко Р.Н., 2019-2020