Основы Python — кратко. Часть 5. Определение функций, основы.
Начав писать главу про ООП, понял что совсем забыл освятить такой большой и нужный раздел Пайтона как функции. Тема это большая и обширная, потому, чтобы не сильно растягивать паузу между уроками, решил разделить ее на 2 части. Сначала расскажу основы, потом уже углубленные особенности Пайтоновского функциестроения.
Функции в Пайтоне объявляются не просто, а очень просто. Вот пример самой простой:
def empty_func(): pass
Начинается объявление с ключевого слова def, что как не сложно догадаться является сокращением от define. После него идет имя функции. После имени в круглых скобках задается список параметров, в данном случае отсутствующих.
Тело функции пишется с отступом со следующей строки. учтите, что в Пайтоне функции с пустым телом запрещены, потому в качестве тела приведенной выше функции используется «пустой оператор» pass.
Теперь рассмотрим пример посерьезнее.
def safe_div(x, y): """Do a safe division :-) for fun and profit""" if y != 0: z = x / y print z return z else: print "Yippie-kay-yay, motherf___er!"
В этом примере есть несколько нововведений. первое, что бросается в глаза — это строка документации (docstring), идущая сразу после тела функции.
Обычно эта строка занимает не одну строку исходного текста (простите за каламбур) и потому задается в тройных кавычках. Она предназначена для описания функции, ее предназначения, параметров и т.п. Все хорошие ИДЕ умеют с этой строкой работать. Получить к ней доступ можно и из самой программы, используя свойство __doc__:
print safe_div.__doc__
Этим свойством (да, да, именно свойством, в Пайтоне даже функции на самом деле — классы) удобно пользоваться во время сеансов работы интерактивной консоли.
>>> from ftplib import FTP >>> print FTP.__doc__ An FTP client class. To create a connection, call the class using these argument: host, user, passwd, acct These are all strings, and have default value ''. Then use self.connect() with optional host and port argument. # дальнейшее почикано мною :-)
Вернемся к нашей исходной функции. Суть ее очень проста, она принимает 2 параметра: х и у. Если у не равен 0, она делит х на у, выводит результат на экран и возвращает свое частное в виде результата. Результат функции возвращают с помощью команды return. Благодаря механизму кортежей, описанному в прошлом уроке, функции в Пайтоне могут возвращать одновременно множество объектов.
Если же делитель все-таки равен нулю, функция выводит сообщение об ошибке. Неверно было бы предположить что в этом случае функция ничего не вернет. Правильнее будет сказать что функция вернет «ничего» 🙂 Иначе говоря, если в функции отсутствует оператор return, или же он вызван без параметров, то функция возвращает специальное значение None. В этом легко убедиться вызвав что-то типа print safe_div(10, 0).
Вот пример слегка посложнее, он взят из доклада-презентации Гвидо ван Россума.
def gcd(a, b): "Нахождение НОД" while a != 0: a,b = b%a,a # параллельное определение return b
Данная функция находит наибольший общий делитель двух чисел.
В общем, следует учитывать, что параметры в функции Пайтоном передаются по ссылке. Еще одним, возможно нетривиальным фактом к которому придется привыкать — является тот факт что сами функции являются значением, которое можно присваивать. Если воспользоваться нашей функцией safe_div для дальнейших экспериментов, то можно написать следующий код.
mystic_function = safe_div print mystic_function(10, 4)
Вот на этот раз и все, «за бортом» осталось еще много аспектов определения функций в Пайтоне, которые будут освещены в следующий раз.
Упражнения для проверки.
1. На основе существующей функции нахождения НОД, напишите функцию поиска НОК двух чисел.
2. Напишите подпрограмму табулирования функции, переданной в качестве аргумента. Так же аргументами задается начальное, конечное значение и шаг табуляции.
PS кстати, каков оптимальный объем «урока»? Что лучше — реже выходящие большие главы, или «лучше меньше да чаще».
Функции в Python
Функция — это именованный блок кода, к которому можно обратиться из любого места программы. У функции есть имя и список входных параметров, а также возвращаемое значение.
Функция позволяет использовать в программе один и тот же фрагмент кода несколько раз.
Oбъявление функции в Python выглядит так:
def function_name ( argument1 , argument2 , . ):
# код функции
# def — DEclare Function — «объявить функцию»
# function_name — имя функции
# (argument1, argument2, . ) — список аргументов, поступающих на вход функции при ее вызове
# тело функции — это весь код, который идет после двоеточия
# Объявление функции
def hello (name):
print ( ‘Hello, ‘ + name)
# Вызовы функции
hello ( ‘Max’ )
hello ( ‘Ivan’ )
hello ( ‘Alex’ )
hello ( ‘Kate’ )
# Вывод
>> Hello, Max
>> Hello, Ivan
>> Hello, Alex
>> Hello, Kate
Оператор return возвращает значение из функции.
Представьте себе обычный калькулятор. Вы вводите первое число, операцию и второе число. Калькулятор возвращает нам результат операции над этими числами. Всё просто, не так ли? Функции точно так же умеют возвращать значение с помощью специального оператора return.
# Объявление функции
def sum2 ( a , b ):
return a + b
# Вызовы функции
s1 = sum2 ( 10 , 2 )
s2 = sum2 ( 108 , 100 )
s3 = sum2 ( 3 , 1 )
print ( f ‘s1 = ‘ )
print ( f ‘s2 = ‘ )
print ( f ‘s3 = ‘ )
>> s1 = 12
>> s2 = 208
>> s3 = 4
# Функция умножения двух чисел
def mult2 ( a , b ):
return a * b
# Вызовем нашу функцию
m1 = mult2 ( 10 , 2 )
m2 = mult2 ( 108 , 100 )
m3 = mult2 ( 3 , 1 )
print ( f ‘m1 = ‘ )
print ( f ‘m2 = ‘ )
print ( f ‘m3 = ‘ )
>> m1 = 20
>> m2 = 10800
>> m3 = 3
Для параметров функции можно указывать значения по умолчанию. Это дает возможность вызывать функцию с меньшим числом параметров.
# Аргумент name по умолчанию равен ‘world’
def hello ( name = ‘world’ ):
print ( ‘Hello, ‘ + name)
hello ()
hello ( ‘Ivan’ )
>> Hello, world
>> Hello, Ivan
Примеры
# Написать функцию square(), вычисляющую квадрат числа.
def square ( number ):
return number * number # Возвращаем результат работы функции обратно в программу
a = square ( 2 )
print (a)
# Напишите функцию perimetr, вычисляющую периметр прямоугольника со сторонами a и b.
def perimetr ( a , b ):
return 2 * (a + b)
p = perimetr ( 4 , 3 )
print (p)
# Напишите функцию isEven, возвращающую True, если число четное, и False, если — нечетное.
def isEven ( x ):
return x % 2 == 0
print ( isEven ( 10 ))
print ( isEven ( 11 ))
# Напишите функцию amountList, которая возвращает сумму всех элементов списка.
def amountList ( lst ):
amount = 0
f or x in lst:
amount += x
return amount
print ( amountList ([ 1 , 2 , 3 ]))
mylist = [ 1 , 2 , 4 , 8 , 16 ]
s = amountList (mylist)
print ( f ‘Сумма списка равна ‘ )
>> 6
>> Сумма списка [ 1 , 2 , 4 , 8 , 16 ] равна 31
# Напишите функцию fib, которая возвращает n-ное число Фибоначчи.
# Последовательность Фибоначчи выглядит так: 1 1 2 3 5 8 13 21 34
def fib ( n ):
a, b = 0 , 1
if n == 0 : return 0
f or i in range ( 1 , n):
a, b = b, a + b
return b
print ( fib ( 2 ))
print ( fib ( 3 ))
print ( fib ( 4 ))
print ( fib ( 5 ))
print ( fib ( 10 ))
# Напишите функцию fact, вычисляющую значение факториала числа N.
# Факториал числа — это произведение всех чисел от 1 до N.
# Например, факториал числа 5 равен 120 (5! = 120).
def fact ( n ):
result = 1
while n > 1 :
result *= n
n -= 1
return result
print ( fact ( 2 ))
print ( fact ( 3 ))
print ( fact ( 4 ))
print ( fact ( 5 ))
Решение задач
1. Площадь круга
Напишите функцию, которая получает в качестве аргумента радиус круга и находит его площадь.
# Не забудьте написать функцию circle.
print ( circle ( 4 ))
print ( circle ( 1 ))
Напишите функцию, которая возвращает True, если число делится на 3, и False, если — нет.
# Не забудьте написать функцию three.
print ( three ( 4 ))
print ( three ( 3 ))
3. Максимум в списке
Напишите функцию, которая возвращает максимальный элемент из переданного в нее списка.
# Напишите функцию maxList.
mylist = [ 1 , 3 , 2 ]
print ( maxList (mylist))
4. Сколько четных
Напишите функцию, которая возвращает количество четных элементов в списке.
# Напишите функцию evenCounter.
mylist = [ 1 , 10 , 2 , 4 , 6 ]
evens = evenCounter (mylist)
print (even)
Напишите функцию, которая возвращает список с уникальными (неповторяющихся) элементам.
# Напишите функцию unique.
mylist = [ 1 , 1 , 2 , 1 , 3 , 2 , 3 ]
print ( unique (mylist))
# Вывод:
>> [ 1 , 2 , 3 ]
При подготовке материала использовались источники:
https://habr.com/ru/articles/30633/
https://pymanual.github.io/func.html