К содержанию

Анатолий
Анатольевич
Eфремов

Функции


В большинстве языков программирования, в том числе и в Python, реализовано достаточное количество стандартных функций, например функции abs(x) и sqrt(x).

Кроме встроенных и библиотечных функций есть возможность писать собственные функции, предварительно описав их. Это даёт возможность выносить фрагменты кода, которые часто повторяются, в функции, что сокращает объём программы и делает её более понятной. Сначала рассмотрим пример использования стандартных функций:

x = int(input())
print(abs(x))

В этом примере используются четыре функции:input, int, abs и print.

Функции могут принимать какие-то значения в качестве параметров, но могут и не принимать никаких параметров. Например, функция input не получает входных значений.

Также функции могут возвращать какие-то значения, но могут ничего не возвращать. Например, функция print ничего не возвращает.

Описание функции в Python располагается в любом месте программы, но до первого её использования. После описания функции её можно использовать в выражениях наряду со стандартными функциями.

При описании функции указывается служебное слово def, затем после пробела имя функции, после чего в круглых скобках через запятую перечисляются её параметры. Если функция не принимает входных параметров, то в круглых скобках ничего не пишут. После круглых скобок ставится двоеточие, и затем на следующей строке с отступом задаётся тело функции так, как это делается при написании циклов.

Если функция должна вернуть какое-то значение, то для этого используется служебное слово return. Инструкция return завершает работу функции и возвращает значение соответствующей переменной (выражения). Инструкция return может встречаться в произвольном месте функции, её исполнение завершает работу функции и возвращает указанное значение в место вызова. Если функция не возвращает значения, то инструкция return используется без возвращаемого значения или инструкция return может отсутствовать.

Например, функция нахождения максимума из двух чисел будет выглядеть следующим образом:

def max(a, b):
     if a > b:
          return a
     else:
          return b


После того как мы написали такую функцию, мы можем ее использовать, например, вот так:

print(max(3, 8))

В результате эта строчка напечатает число 8.

Мы можем использовать уже написанные функции для реализации других функций. Например, мы можем реализовать функцию max3, находящую максимум трёх чисел, следующим образом:

def max3(a, b, c):
     return max(max(a, b), c)


Функция max3 дважды вызывает функцию max для двух чисел: сначала чтобы найти максимум из a и b, потом чтобы найти максимум из этой величины и c. В программе вызов функции max3 может выглядеть так:

x = -2
y = 5
print(max3(2, -3 * x, y))

или так:

a = int(input())
b = int(input())
m = max3(172, a, b - c)


Для примера напишем функцию min_divisor, которая для заданного натурального числа n > 1 находит его минимальный делитель, больший единицы:

def min_divisor(n):
     for d in range(2, n + 1):
          if n % d == 0:
               return d


Эту же функцию можно реализовать с использованием цикла while следующим образом:

def min_divisor(n):
     d = 2
     while n % d != 0:
          d += 1
     return d


На основании этой функции можно написать функцию is_prime, которая проверяет число на простоту:

def is_prime(n):
     return n == min_divisor(n)

Если число простое, то его минимальный делитель равен самому числу, и в таком случае функция is_prime вернёт True. Если же число составное, то функция вернёт False.

Функцию is_prime можно использовать, например, вот таким образом:

n = int(input())
if is_prime(n):
     print("Простое")
else:
     print("Составное")



Задача 1

Треугольник

Вам даны 4 отрезка. Выведите YES, если среди них найдутся 3, из которых можно составить треугольник, и NO в противном случае.

Для решения напишите функцию triangle(a, b, c), которая будет возвращать True, если из трёх заданных отрезков можно составить треугольник, и False иначе.

Внимание! Не забудьте про отступы при сдаче кода в этой задаче.

Примеры

Ввод Вывод
1
2
3
4
YES

Ввод Вывод
1
2
3
8
NO

ОТВЕТ:
def triangle(a, b, c):
     return a + b > c and a + c > b and b + c > a
a = int(input())
b = int(input())
c = int(input())
d = int(input())
if triangle(a,b,c) or triangle(a,b,d) \
or triangle(a,c,d) or triangle(b,c,d):
     print("YES")
else:
     print("NO")



Задача 2

Ёлочка

Маленький Петя делает новогоднюю открытку. Для этого ему надо нарисовать ёлочку. Однако Пете сложно самому справиться с этой задачей, помогите ему в этом.

Ёлочка состоит из n уровней. Первый (верхний) уровень состоит из двух строк, второй — из трёх, …, n-й — из n + 1 строки. Все строки заполнены одинаковым символом *, при этом длины строк составляют 1, 2, ..., i + 1 на уровне i.

Например, 2-ой уровень ёлочки выглядит так:

*
**
***

Необходимо по введённому натуральному числу n нарисовать ёлочку из n уровней.

Необходимо оформить решение в виде функции для рисования ёлочки tree(n), которая будет вызывать функцию makeLevel(i) для рисования каждого уровня ёлочки при различных значениях i.

Внимание! Не забудьте про отступы при сдаче кода в этой задаче.

Примеры

Ввод Вывод
2 *
**
*
**
***

Ввод Вывод
3 *
**
*
**
***
*
**
***
****

ОТВЕТ:
def makeLevel(n):
     for j in range(1, n + 1):
          print("*" * j)

def tree(n):
     a = 2
     for i in range(1, n + 1):
          makeLevel(a)
          a += 1

n = int(input())
tree(n)



Задача 3

На завод!

У Пети есть X грамм краски, а у Васи — Y грамм краски. Одного грамма краски хватает, чтобы покрасить плитку 1 x 1. На заводе есть неограниченное количество квадратных плиток любых размеров. Петя выберет максимальную плитку, на которую у него хватит краски. Вася поступит аналогично. Таня работает в плановом отделе, и в её интересах сделать так, чтобы суммарно было потрачено как можно больше краски. Поэтому Таня интересуется: а что если Петя отдаст всю свою краску Васе? Получится ли тогда потратить больше краски или нет?

В данной задаче запрещено использовать функцию sqrt, а также операцию возведения в степень.

Входные данные

В двух строках входного файла содержатся натуральные числа x и y — количество краски у Пети и Васи соответственно.

Все числа не превышают 1000.

Выходные данные

Если выгоднее будет отдать всю краску Васе, то выведите на экран «Petya gives paint to Vasya».

Если выгоднее оставить краску у Пети, то выведите на экран «Petya leaves paint to himself».

Если расход краски в обоих случаях одинаков, то выведите «Equal».

Пояснения к тестам

  • В первом тесте, если Петя оставит краску у себя, то Петя и Вася смогут закрасить по плитке стороной 3 метра и потратить 18 граммов краски. Если же Петя отдаст краску Васе, то Вася закрасит плитку стороной 4 метра и потратит 16 граммов краски.
  • Во втором тесте независимо от стратегии Пети получится потратить 25 граммов краски.
  • В третьем тесте Пете выгоднее отдать краску Васе, в этом случае получится потратить 16 граммов краски (вместо 13 в противном случае).

Примеры

Ввод Вывод
10
10
Petya leaves paint to himself

Ввод Вывод
10
20
Equal

Ввод Вывод
10
7
Petya gives paint to Vasya

ОТВЕТ:
n = int(input())
m = int(input())
def rest(n):
     x = 0
     for i in range(n + 1):
          if i * i > n:
               return int(n - x)
          x = i * i
if rest(n) + rest(m) > rest(n + m):
     print("Petya gives paint to Vasya")
elif rest(n) + rest(m) == rest(n + m):
     print("Equal")
else:
     print("Petya leaves paint to himself")



Локальные и глобальные переменные



В описании процедуры или функции задаётся список формальных параметров. Каждый параметр, описанный в этом списке, является локальным по отношению к описываемой функции, то есть на него можно ссылаться по его имени только из данной функции, но не из основной программы или другой функции. Свое начальное значение он получает из соответствующего фактического параметра при вызове функции. Изменения, которые претерпевает формальный параметр, не влияют на значение фактического параметра. Соответствующее фактическое значение параметра должно иметь тип, совместимый с типом формального параметра. В общем случае можно сказать, что областью действия переменной является блок, в котором она описана.

Также в функции можно использовать глобальные переменные (объявленные вне функции, но доступные внутри функции) при условии, что имена этих глобальных переменных не совпадают с именами локальных переменных в функции.

Рассмотрим ряд примеров.

def f():
     print(a)
a = 1
f()

Здесь переменной a присваивается значение 1 вне функции. Переменная a используется в функции f и является глобальной переменной. В момент вызова функции f глобальной переменной a присвоено значение 1, поэтому функция f выведет на экран число 1.

Если инициализировать какую-то переменную внутри функции, то использовать эту переменную вне функции не удастся. Например:

def f():
     a = 1
f()
print(a)

При запуске этой программы получим ошибку во время исполнения:

NameError: name 'a' is not defined.

В этом примере переменная a объявлена внутри функции и является локальной переменной. При выходе из функции f локальная переменная a стала недоступной для использования, поэтому мы получили ошибку.


Интересным получится результат, если попробовать изменить значение глобальной переменной внутри функции:

def f():
     a = 0
     print(a)
a = 1
f()
print(a)

Будут выведены числа 0 и 1. То есть несмотря на то, что значение переменной a изменилось внутри функции, вне функции оно осталось прежним. Это сделано в целях «защиты» глобальных переменных от случайного изменения их внутри функции. Если внутри функции модифицируется значение некоторой переменной, то переменная с таким именем становится локальной переменной, и её модификация не приведёт к изменению глобальной переменной с таким же именем.


Рассмотрим такой пример:

def f():
     print(a)
     a = 0
     print(a)
a = 1
f()

Может показаться, что эта программа сначала напечатает число 1, а потом напечатает число 0. Но это не так. Дело в том, что интерпретатор Python считает переменную локальной, если внутри функции есть хотя бы одна инструкция, модифицирующая значение этой переменной (это может быть оператор =, += и так далее, или использование этой переменной в качестве параметра цикла for). Поэтому такая переменная должна быть инициализирована внутри функции до её первого использования.

Поэтому в примере выше мы получим ошибку во время исполнения:

UnboundLocalError: local variable 'a' referenced before assignment

При этом даже если инструкция, модифицирующая переменную, никогда не будет выполнена, интерпретатор это проверить не сможет, и переменная всё равно будет считаться локальной, например:

def f():
     print(a)
     if False:
          a = 0
a = 1
f()

При запуске этой программы возникает такая же ошибка, как в предыдущем примере:

UnboundLocalError: local variable 'a' referenced before assignment

В функции f есть инструкция a = 0, поэтому переменная a становится локальной переменной, но так как эта переменная не инициализирована перед первым ее использованием, то мы получаем ошибку.


Чтобы функция могла изменить значение глобальной переменной, необходимо объявить эту переменную внутри функции как глобальную при помощи ключевого слова global:

def f():
     global a
     a = 0
     print(a)
a = 1
f()
print(a)

В этом примере на экран будут выведены числа 0 и 0, так как переменная a объявлена как глобальная, и её изменение внутри функции приводит к тому, что и вне функции переменная a будет равна новому значению 0.



Задача 4

В данном коде переменная b в функции локальная или глобальная?

def f(b):
     b += 0
     print(b)
b = 5
f(b)

ОТВЕТ:

Локальная



Задача 5

Не запуская код, ответьте на вопрос: что выведет на экран данная программа?

def f(b):
     global a
     b = 2
     a, b = b, a
     print(a, b, end = " ")
a = 1
b = 2
f()
print(a, b, end = " ")

ОТВЕТ:

2122



Задача 6

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

Python. Функции



Задача 7

Не запуская код, ответьте на вопрос: что выведет на экран данная программа?

def f(b):
     global a
     global b
     b, c = a, b
def g():
     global a
     global d
     c = '0'
     a = d + c
a = '2'
b = '3'
c = '5'
d = '7'
f()
g()
f()
print(a + b + c + d)

ОТВЕТ:

707057