Def multiply что это
Перейти к содержимому

Def multiply что это

  • автор:

Def multiply что это

В Python функция фактически представляет отдельный тип. Так мы можем присвоить переменной какую-нибудь функцию и затем, используя переменную, вызывать данную функцию. Например:

def say_hello(): print("Hello") def say_goodbye(): print("Good Bye") message = say_hello message() # Hello message = say_goodbye message() # Good Bye

В данном случае переменной message присваивается одна из функций. Сначала ей передается функция say_hello() :

message = say_hello

После этого переменная message будет указывать на данную функцию, то есть фактически представлять функцию say_hello. А это значит, что мы можем вызывать переменную message как обычную функцию:

message() # Hello

Фактически это приведет к выполнению функции say_hello, и на консоль будет выведена строка «Hello». Затем подобным образом мы можем передать переменной message другую функцию и вызвать ее.

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

def sum(a, b): return a + b def multiply(a, b): return a * b operation = sum result = operation(5, 6) print(result) # 11 operation = multiply print(operation(5, 6)) # 30

Функция как параметр функции

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

def do_operation(a, b, operation): result = operation(a, b) print(f"result = ") def sum(a, b): return a + b def multiply(a, b): return a * b do_operation(5, 4, sum) # result = 9 do_operation(5, 4, multiply) # result = 20

В данном случае функция do_operation имеет три параметра, причем третий параметр, как предполагается, будет представлять функцию, которая принимает два параметра и возвращает некоторый результат. Иными словами третий параметр — operation представляет некоторую операцию, но на момент определения функции do_operation мы точно не знаем, что это будет за операция. Мы только знаем, что она принимает два параметр и возвращает какой-то результат, который потом выводится на консоль.

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

do_operation(5, 4, sum)

То есть в данном случае параметр operation фактически будет представлять функцию sum и будет возвращать сумму дву чисел.

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

do_operation(5, 4, multiply) # result = 20

Таким образом, более гибкие по функциональности функции, которые через параметры принимают другие функции.

Функция как результат функции

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

def sum(a, b): return a + b def subtract(a, b): return a - b def multiply(a, b): return a * b def select_operation(choice): if choice == 1: return sum elif choice == 2: return subtract else: return multiply operation = select_operation(1) # operation = sum print(operation(10, 6)) # 16 operation = select_operation(2) # operation = subtract print(operation(10, 6)) # 4 operation = select_operation(3) # operation = multiply print(operation(10, 6)) # 60

В данном случае функция select_operation в зависимости от значения параметра choice возвращает одну из трех функций — sum, subtract и multiply. Затем мы мы можем получить результат функции select_operation в переменную operation:

operation = select_operation(1)

Так, в данном случае в функцию select_operation передается число 1, соответственно она будет возвращать функцию sum. Поэтому переменная operation фактически будет указывать на функцию sum, которая выполняет сложение двух чисел:

print(operation(10, 6)) # 16 - фактически равно sum(10, 6)

Аналогичным образом можно получить и выполнить другие функции.

Чистые функции — Python: Функции

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

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

Что такое детерминированность

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

Рассмотрим пример функции, которая не является детерминированной:

import random def get_random_number(): return random.randint(1, 10) 

Эта функция возвращает случайное число от 1 до 10 при каждом вызове. Если мы вызываем функцию несколько раз, то получим разные результаты:

get_random_number() # 3 get_random_number() # 7 get_random_number() # 1 

Теперь рассмотрим пример детерминированной функции:

def multiply(a, b): return a * b 

Функция multiply всегда возвращает результат умножения двух переданных ей аргументов. Если мы передадим одни и те же значения, то получим один и тот же результат:

multiply(2, 3) # 6 multiply(2, 3) # 6 multiply(2, 3) # 6 

Это делает функцию multiply детерминированной, так как она всегда возвращает один и тот же результат для одного и того же набора входных данных.

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

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

Что такое побочные эффекты

Побочный эффект или side effects — это любые взаимодействия с внешней средой. Они включают в себя изменения глобальных переменных и операции с файлами. Например, запись в файл, чтение из файла, отправка или прием данных по сети и вывод в консоль.

Рассмотрим пример функции, которая имеет побочный эффект:

def print_hello(): print("Hello, world!") 

Эта функция выводит сообщение в консоль, значит, она имеет побочный эффект. Если мы вызываем функцию print_hello , то она изменяет состояние программы путем вывода сообщения в консоль. Но она не возвращает никакого значения:

print_hello() # Hello, world! 

Побочные эффекты составляют одну из самых больших сложностей при разработке. Они затрудняют логику кода и тестирование. Это приводит к большому числу ошибок.

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

Без побочных эффектов невозможно написать ни одной полезной программы. Результат любых вычислений должен быть продемонстрирован. В самом простом случае его нужно вывести на экран, что автоматически приводит к побочным эффектам.

В реальных приложениях побочные эффекты могут быть полезны. Например, когда нужно записать данные в файл или отправить запрос на сервер. Но в программировании рекомендуется минимизировать количество функций с побочными эффектами. Это сделает программу более предсказуемой и легко тестируемой.

Что такое чистые функции

Чистые функции или pure functions — это функции, которые при вызове не влияют на состояние программы и не имеют побочных эффектов. Они возвращают значения только на основе входных аргументов и не изменяют их.

Признаки чистых функций:

  • Всегда возвращают одинаковые значения для одинаковых аргументов
  • Не имеют побочных эффектов — не изменяют состояние программы за пределами своей области видимости. Таким образом они не модифицируют глобальные переменные, не изменяют содержимое файлов, не выводят на экран и не изменяют содержимое баз данных
  • Не зависят от состояния программы, поэтому не используют глобальные переменные или переменные, которые могут изменяться во время выполнения программы
  • Не имеют побочных эффектов на аргументы, которые переданы им по ссылке — не изменяет их содержимое

Примеры чистых функций в Python:

def add_numbers(x, y): return x + y def multiply_numbers(x, y): return x * y def is_even(x): return x % 2 == 0 

Эти функции возвращают значение только на основе переданных им аргументов и не влияют на другие переменные в программе.

У чистых функций есть несколько преимуществ:

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

Что такое грязные функции

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

Рассмотрим несколько примеров.

Функции, которые изменяют глобальные переменные

count = 0 def increment(): global count count += 1 return count increment() # 1 increment() # 2 count # 2 

В этом примере функция increment() увеличивает значение глобальной переменной count на единицу при каждом вызове. Это может привести к неожиданным результатам в других частях программы.

Функции, которые изменяют аргументы

def append_list(my_list, element): my_list.append(element) return my_list a = [1, 2, 3] append_list(a, 4) # [1, 2, 3, 4] a # [1, 2, 3, 4] 

В примере функция append_list() добавляет элемент в конец переданного ей списка my_list . Это часто приводит к ошибкам в расчетах в других частях программы.

Функции, которые работают с файлами

def write_file(text): with open("test.txt", "w") as file: file.write(text) write_file("Hello, world!") 

В приведенном примере функция write_file() записывает строку в файл test.txt . Это может иметь побочные эффекты, такие как изменение содержимого файла или его положения в файле.

Функции, которые имеют побочный эффект вывода на экран

def print_and_return(value): print(value) return value print_and_return(10) # 10 # 10 

В данном примере функция print_and_return() выводит переданный ей аргумент и возвращает его. Это также может привести к неожиданным результатам в виде излишнего вывода на экран.

Выводы

Чистые и грязные функции имеют разные особенности и применения.

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

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

def (функция/метод)

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

Для возврата значения из функции используется инструкция return . Допускается использование нескольких return , в том числе для раннего выхода из функции.

Функции без инструкции return (равно как и с нею, но без указания аргумента) всё равно возвращают результат — None .

Определение функции

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

Первой инструкцией в теле может быть литерал строки, который будет являться документацией для данной функции (строка документации — «docstring»). Некоторые утилиты и среды разработки используют такие строки для формирования интерактивной справки. Документировать код считается хорошим тоном.

def do_work(work, reverse=False): 
"""Выполняет работу.

В случае удачного выполнения, возвращает True,
иначе - False.

:param list work: Список для работы.
:param bool reverse: Флаг. Следует ли сделать
работу в обратном порядке
:rtype: bool
"""

В примере выше объявляется функция do_work , с формальными параметрами work и reverse . Функция задокументирована (испольузется формат описания сигнатуры reStructuredText). Кроме строки документации тело функции не содержит инструкций, тем не менее функция возвращает None .

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

Само определение функции не вызывает исполнения кода из тела функции. Код исполняется только при вызове функции.

 def print_yes(): 
print('yes')


print_yes() # yes

print_yes_alias = print_yes

print_yes_alias() # yes

Более того, ничто не мешает использовать «объект функции» как любой другой объект (например: передавать в функцию, использовать в качестве значения в словаре и т.п.).

 def print_yes(): 
print('yes')

def print_no():
print('no')


my_functions = [print_yes, print_no]

for function in my_functions:
# Переменная function будет содержать объект
# функции. Его-то мы и вызываем в следующей строке.
function()

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

Ввиду вышесказанного ссылаться на глобальные переменные внутри функции можно, а присвоить им значение (без использования инструкции global ) нельзя.

 MY_GLOBAL = 1


def set_global_1():
MY_GLOBAL = 2


def set_global_2():
global MY_GLOBAL
MY_GLOBAL = 2


print(MY_GLOBAL) # 1

set_global_1()
print(MY_GLOBAL) # 1

set_global_2()
print(MY_GLOBAL) # 2

Аргументы, с которыми была вызвана функция, также оказываются в её локальной символьной таблице.

В Питоне используется передача аргументов «по значению» (значением при этом всегда является ссылка на сам объект, но не на его значение). Однако, ввиду того, что в случаях, когда передаются изменяемые объекты, вызвавший увидит все изменения, сделанные вызываемым (например, при добавлении элементов в список), возможно лучше было бы назвать данный вид передачи «передачей по ссылке на объект».

 def mutate_list(a_list): 
a_list.append(0)
return True


my_list = [1]
print(my_list) # [1]

mutate_list(my_list) # True
print(my_list) # [1, 0]

Когда функция вызывает другую функцию, для вызова создаётся новая локальная символьная таблица.

Вложенные определения

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

 def outer_func():

# Определение функции внутри другой
# функции.
def inner_func():
return 'some'

return inner_func()


print(outer_func()) # some


def get_my_class():

# Определение класса внутри определения
# функции.
class MyClass:

my_attr = 1

return MyClass


my_class = get_my_class()
print(my_class.my_attr) # 1

Синонимы поиска: def (функция/метод), function, define, return, функции, procedure, вуа

Статьи раздела
Decorator (декоратор) Функция, возвращающая другой объект, поддерживающий вызов.
Generator (генератор) Функция, возвращающая подвид итератора, генерирующий значения.

Функции Python: 7 примеров. Базовые, встроенные и пользовательские функции

В этой статье мы просто приведём практические примеры работы функций в Python. Рассмотрим базовые, встроенные и пользовательские функции, а также функции с параметрами, возвращаемым значением и типом данных.

Функции в Python представляют собой фрагменты кода в блоке, который имеет назначенное имя. Функции принимают ввод, осуществляют вычисления либо какое-нибудь действие и возвращают вывод. И, разумеется, функции упрощают работу с кодом, делая возможным его повторное использование.

Базовые функции Python

Давайте рассмотрим пример функции Python, принимающей 2 параметра, а также вычисляющей сумму и возвращающей вычисленное значение:

 
#определяем и объявляем функцию def calculate_sum(a,b): sum = a+b return sum #инструкция, приведённая ниже, называется вызовом функции print(calculate_sum(2,3)) # 5

Кроме того, в Python есть встроенные и пользовательские функции.

Пользовательские функции Python

Объявление пользовательской функции осуществляется с применением ключевого слова def. При этом оно должно сопровождаться именем пользовательской функции:

 
def calculate_si_amount(principal, rate, time): interest = (principal*rate*time)/100 return principal+interest

В данной функции окончательная сумма может быть рассчитана посредством использования простого процента к основной сумме. Именем функции является Calculate_si_amount. Что касается principal, time и rate — то это параметры, а функция возвращает рассчитанные данные.

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

 
from random import seed, random from random import random def generate_random_number(): seed(10) return random()

Встроенные функции Python

В Python существует много встроенных функций. Одна из наиболее часто используемых — print() . Её работа чрезвычайно проста:

 
print("Всем привет") print(len("Меня зовут Андрей"))

Ещё популярны такие функции, как len() , abs() , sum() , str() , int() и другие.

Параметры функции в Python

В языке программирования Python функция может иметь параметры по умолчанию:

 
def multiply(a, b=10): return a*b multiply(12) # 120 multiply(2, 3) # 6 multiply(b=9) # Ошибка: None*9 недопустимо

В вышеописанной функции, когда пользователь не задает 2-й параметр b, он предполагает, что параметр равен 10, однако при этом нужно предоставить 1-й параметр.

Неизвестное количество параметров в функции Python

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

Когда число параметров неизвестно, тогда в определение функции в качестве одного из параметров добавляется *args . Данный параметр ожидает кортеж. В нашем случае звёздочка (*) очень важна, т. к. название args просто является соглашением, то есть можно дать любое другое имя.

 
def calculate_sum(a, *args): sum = a for i in args: sum += i return sum calculate_sum(10) # 10 calculate_sum(10, 11, 12) # 33 calculate_sum(1, 2, 94, 6, 2, 8, 9, 20, 43, 2) # 187

Так же **kwargs ожидает словарь в качестве параметра.

 
def print_names(f1, l1, **kwargs): print(f1, l1, end=' ') for key in kwargs: print(key, kwargs[key], end=' ') print_names("andrey", "master") print_names("andrey", "master", alex="john", leon="elene") # andrey master andrey master alex john leon elene

Обратите внимание, что фрагмент выше имеет ссылку на цикл for.

Тип данных для возвращаемого значения и параметров в Python

Определение типов данных для параметров функции в Python может быть полезным:

 
def prime_numbers(x:int) -> (int, list): l=[] for i in range(x+1): if checkPrime(i): l.append(i) return len(l), l

В нашем примере определение функции указывает, что нужен 1 параметр типа int и вернёт два значения типа list и int соответственно.

Возвращаемое значение функции в Python

Язык программирования Python даёт возможность функции возвращать несколько значений.

 
def prime_numbers(x): l=[] for i in range(x+1): if checkPrime(i): l.append(i) return len(l), l no_of_primes, primes_list = prime_numbers(100)

Python_Pro_970x550-20219-0846c7.png

В нашем случае возвращаются 2 значения. Если данная функция вызывается, то возвращаемые значения сохраняются одновременно в 2-х переменных. Если же функция не возвращает ничего, то она неявно возвращает None.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *