Создание функции python: Как вызвать функцию в python? — 3 варианта, 5 примеров кода

Содержание

Как вызвать функцию в python? — 3 варианта, 5 примеров кода

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

Основные особенности функций в Python:

  • Используются чтобы избегать повторений в коде,
  • Используются для разделения кода на мелкие модули
  • Позволяют скрывать код и создавать ясность для понимания модулей,
  • Позволяют повторно использовать код и сохранять память,
  • Код из функции можно выполнить только по ее имени,
  • Простой синтаксис: def имя_функции(параметры):.

Правила создания функций:

  1. Для объявления функции в Python используется ключевое слово def.
  2. Название функции должно начинаться с символа латинского алфавита в любом регистре или нижнего подчеркивания.
  3. В каждой функции есть двоеточие и отступ, после которого записывается сам код программы.
  4. Зарезервированные ключевые слова не могут использоваться в качестве названия функции.
  5. Функция может содержать несколько параметров или не иметь их совсем.

Создание функции в Python

Для создания нужно написать ключевое слово def. Синтаксис следующий:

def function_name():
    # логика функции
    return result # возврат значения

Создадим и вызовем реальную функцию в Python:

def my_fun():
    print("Как вызвать функцию в Python?")


my_fun()  # вызов функции

Вывод: Как вызвать функцию в Python?.

Вызов функции в Python

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

def my_fun():
    x = 22 ** 5
    return x

# 1. Вызов функции
my_fun()
# 2. Вызов функции и присвоение результат переменной
a = my_fun()
# 3. Вызов функции и вывод результат в консоль
print(my_fun())

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

def my_fun():  
    print("Hello World")  
    print("Функция вызвана")  
  
my_fun()

Вывод:

Hello World
Функция вызвана

В этом примере вызов функции my_fun() привел к выводу двух строк.

Вызов вложенных функций в Python

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

def out_fun():
    print("Привет, это внешняя функция")  
      
    def in_fun():
        print("Привет, это внутренняя функция")  
    in_fun() 
  
out_fun()

Вывод:

Привет, это внешняя функция
Привет, это внутренняя функция

Здесь функция in_fun() определена внутри out_fun(). Для вызова in_fun() нужно сперва вызвать out_fun(). После этого out_fun() начнет выполняться, что приведет к вызову in_fun().

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

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

def fun1():
    a = 6
    
    def fun2(b):
        a = 4
        print ("Сумма внутренней функции", a + b)
    
    print("Значение внешней переменной a", a)
    fun2(4)

fun1()

Вывод:

Значение внешней переменной a 6
Сумма внутренней функции 8

Функции как объекты первого класса

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

Особенности функций как объектов первого класса:

  1. Функции можно присваивать переменным.
  2. Функция может быть примером объекта.
  3. Функцию можно вернуть из функции.
  4. У функций те же свойства и методы, что и у объектов.
  5. Функцию можно передать в качестве аргумента при вызове другой функции.

Разберем на примере:

def my_object(text):
    return text.upper()  
  

print(my_object("Вызов my_object"))  
  
upper = my_object  
print(upper("Вызов upper"))  

Вывод:

ВЫЗОВ MY_OBJECT
ВЫЗОВ UPPER

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

class Student:  
    no = 101  
    name = "Владимир"
    
    def show(self):  
        print("№ {}\nИмя {}".format(self.no, self.name))  
  
stud = Student()
stud.show()

Вывод:

№ 101
Имя Владимир

Pythonicway — Функции в Python

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

Создание функции

Существуют некоторые правила для создания функций в Python.

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

Пример функции в Python:

def my_function(argument):
    print argument

 Вызов функции

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

Например:

my_function("abracadabra")

Аргументы функции в Python

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

  • Обязательные аргументы (Required arguments)
  • Аргументы-ключевые слова (Keyword argument)
  • Аргументы по умолчанию (Default argument)
  • Аргументы произвольной длины (Variable-length argumens)

Обязательные аргументы функции:

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

Например:

def bigger(a,b):
    if a > b:
        print a
    else:
       print b

# В описании функции указано, что она принимает 2 аргумента

# Корректное использование функции
bigger(5,6)

# Некорректное использование функции
bigger()
bigger(3)
bigger(12,7,3) 

Аргументы — ключевые слова

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

Например:

def person(name, age):
    print name, "is", age, "years old"

# Хотя в описании функции первым аргументом идет имя, мы можем вызвать функцию вот так

person(age=23, name="John")

Аргументы, заданные по-умолчанию

Аргумент по умолчанию, это аргумент, значение для которого задано изначально, при создании функции.

Например:

def space(planet_name, center="Star"):
    print planet_name, "is orbiting a", center

# Можно вызвать функцию space так:
space("Mars")
# В результате получим: Mars is orbiting a Star

# Можно вызвать функцию space иначе:
space("Mars", "Black Hole")
# В результате получим: Mars is orbiting a Black Hole

Аргументы произвольной длины

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

Например:

def unknown(*args):
    for argument in args:
        print argument

unknown("hello","world") # напечатает оба слова, каждое с новой строки
unknown(1,2,3,4,5) # напечатает все числа, каждое с новой строки
unknown() # ничего не выведет

Ключевое слово

return

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

Например:

def bigger(a,b):
    if a > b:
        return a # Если a больше чем b, то возвращаем a и прекращаем выполнение функции
    return b # Незачем использовать else. Если мы дошли до этой строки, то b, точно не меньше чем a

# присваиваем результат функции bigger переменной num
num = bigger(23,42)

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

В Python две базовых области видимости переменных:

  • Глобальные переменные
  • Локальные переменные

Переменные объявленные внутри тела функции имеют локальную область видимости, те что объявлены вне какой-либо функции имеют глобальную область видимости.

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

Например:

# глобальная переменная age
age = 44

def info():
    print age # Печатаем глобальную переменную age

def local_info():
    age = 22 # создаем локальную переменную age 
    print age

info() # напечатает 44
local_info() # напечатает 22

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

Например:

# глобальная переменная age
age = 13

# функция изменяющая глобальную переменную
def get_older():
    global age
    age += 1

print age # напечатает 13
get_older() # увеличиваем age на 1
print age # напечатает 14

Рекурсия

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

Напомним, что факториалом числа, например, 5 является произведение всех натуральных (целых) чисел от 1 до 5. То есть, 1 * 2 * 3 * 4 * 5

Рекурсивная функция вычисления факториала на языке Python будет выглядеть так:

def fact(num):
    if num == 0: 
        return 1 # По договоренности факториал нуля равен единице
    else:
        return num * fact(num - 1) # возвращаем результат произведения num и результата возвращенного функцией fact(num - 1)

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

Рецепт создания функции в Python

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

  1. Начинать следует с примеров того, что делает функция, и подобрать подходящее название. В нашем случае это будет выглядеть так:
    # На данном этапе мы еще не указываем имена переменных
    def rectangle_area_finder( ):
        """
        >>> rectangle_area_finder(3, 5)
        15
        >>> rectangle_area_finder(17.2, 6)
        103.2
        """

  2. Указать типы данных, которые принимает функция и тип данных, который она возвращает
    # функция принимает два числа, а возвращает одно
    def rectangle_area_finder( ):
        """
        (num, num) -> num    
    
        >>> rectangle_area_finder(3, 5)
        15
        >>> rectangle_area_finder(17.2, 6)
        103.2
        """

  3. Подобрать подходящие названия для переменных
    # Поскольку это математическая функция нам вполне подойдут имена a и b
    def rectangle_area_finder(a, b):
        """
        (num, num) -> num
        
        >>> rectangle_area_finder(3, 5)
        15
        >>> rectangle_area_finder(17.2, 6)
        103.2
        """

  4. Написать краткое, но содержательное описание функции
    def rectangle_area_finder(a, b):
        """
        (num, num) -> num
    
        Returns an area of a rectangle with given sides a and b.    
    
        >>> rectangle_area_finder(3, 5)
        15
        >>> rectangle_area_finder(17.2, 6)
        103.2
        """

  5. Написать собственно тело функции
    def rectangle_area_finder(a, b):
        """
        (num, num) -> num
    
        Returns an area of a rectangle with given sides a and b.    
    
        >>> rectangle_area_finder(3, 5)
        15
        >>> rectangle_area_finder(17.2, 6)
        103.2
        """
        return a * b

  6. Функция готова! Осталось вызвать ее с указанными в примерах аргументами

Как видно, при вызове команды help() с именем нашей функции в качестве аргумента мы получаем написанную нами документацию.

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

Python. Урок 10. Функции в Python

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

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

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

def fun():
    pass

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

>>> def fun():
    return 1
>>> fun()
1

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

>>> def summa(a, b):
    return a + b
>>> summa(3, 4)
7

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

Вычисление числа Фибоначчи.

>>> def fibb(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    elif n == 2:
        return 1
    else:
        return fibb(n-1) + fibb(n-2)
>>> print(fibb(10))
55

Вычисление факториала.

>>> def factorial(n):
    prod = 1
    for i in range(1, n+1):
        prod *= i
    return prod

>>> print(factorial(5))
120

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

>>> import math
>>> f = math.factorial
>>> print(f(5))
120

Lambda-функция – это безымянная функция с произвольным числом аргументов и вычисляющая одно выражение. Тело такой функции не может содержать более одной инструкции (или выражения). Данную функцию можно использовать в рамках каких-либо конвейерных вычислений (например внутри filter(), map() и reduce()) либо самостоятельно, в тех местах, где требуется произвести какие вычисление, которые удобно “завернуть” в функцию.

 >>> (lambda x: x**2)(5)
25

Lambda-функцию можно присвоить какой-либо переменной и в дальнейшем использовать ее в качестве имени функции.

>>> sqrt = lambda x: x**0.5
>>> sqrt(25)
5.0

Списки можно обрабатывать lambda-функциями внутри таких функций как map(), filter(), reduce(), о них мы ещё поговорим, а пока рассмотрим пример с map(). Функция map принимает два аргумента, первый – это функция, которая будет применена к каждому элементу списка, а второй – это список, который нужно обработать.

>>> l = [1, 2, 3, 4, 5, 6, 7]
>>> list(map(lambda x: x**3, l))
[1, 8, 27, 64, 125, 216, 343]

P.S.

Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. На нашем сайте вы можете найти вводные уроки по этой теме. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.

<<< Python. Урок 9. Словари (dict)   Python. Урок 11. Работа с исключениями>>>

Создание (определение) функции | Python

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

Вот шаблон определения простой функции:

def имя_функции():
    # тело функции, т.е. код
    print("abc")

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

from some-email-package import send

email = '[email protected]'
title = 'Помогите'
body = 'Я написал историю успеха, как я могу получить скидку?'

# Один маленький вызов — и много логики внутри
send(email, title, body)

Здесь мы в первый раз сталкиваемся с новым элементом синтаксиса — блоками инструкций. В Python несколько инструкций, объединённых по смыслу в некотоpyю группу — блок — записываются с отступом в четыре пробела. Блок всегда заканчивается перед первой строчкой, которая имеет отступ меньший, чем строчки блока. В примере выше тело функции — это блок.

Создадим нашу первую функцию. У неё будет одна задача: выводить на экран текст Today is: December 5.

Нужно назвать функцию так, чтобы из названия была понятна её задача. Давайте дадим ей имя show_date():

# Определение функции
# Определение не вызывает функцию
# Мы лишь говорим, что теперь такая функция существует
def show_date():
    text = 'Today is: December 5'
    print(text)

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

Чтобы на 100% понять происходящее, обязательно сделайте следующее:

  1. Зайдите на https://repl.it/languages/python3. Это онлайн-интерпретатор Python.
  2. В левой части введите код примера выше.
  3. Запустите программу нажатием на «RUN ▶».
  4. Программа выполнится, но на экран ничего не выведется, потому что в программе есть только определение функции, но не запуск.
  5. Чтобы запустить функцию, нужно вызвать её. Добавьте к программе вызов:
  show_date()  # => Today is: December 5
  1. Запустите программу снова и удостоверьтесь, что в правой части на экран вывелся текст.

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

def show_date():
    text = 'Today is: December 5'
    print(text)

show_date()
Today is: December 5

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

Задание

Реализуйте функцию print_motto(), которая печатает на экран фразу Winter is coming.

print_motto()  # => Winter is coming

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


Советы

Функции в Python для начинающих

Функции в Python для начинающих

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

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

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

f(x) = x * 2

Левая часть определяет функцию f, принимающую один параметр, x. А правая часть — это определение функции, которое использует переданный параметр x, чтобы произвести вычисление и вернуть результат. В этом случае значением функции является ее параметр, умноженный на два.

Как в Python функция записывается следующим образом: имя_функции (параметры_через_запятую). Чтобы вызвать функцию, после ее имени нужно указать круглые скобки и поместить внутрь параметры, отделив каждый из них запятой. Для создания функций в Python выберите ее имя, определите параметры, укажите, что функция должна делать и какое значение возвращать.

def имя\_функции(параметры) :
    определениие _функции

Математическая функция f(x) = x * 2 в Python будет выглядеть вот так:

def f(x):
    return x * 2

Ключевое слово def сообщает Python, что вы определяете функцию. После def вы указываете имя функции; оно должно отвечать тем же правилам, что и имена переменных. Согласно конвенции, в имени функции нельзя использовать заглавные буквы, а слова должны быть разделены подчеркиванием вот_так.

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

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

return x * 2

Ключевое слово return используется для определения значения, которое функция возвращает при вызове.

Чтобы вызвать функцию в Python, мы используем синтаксис имя_функции (параметры, через, запятую).

Ниже описан вызов функции f из предыдущего примера с параметром 2.

f(2)

Консоль ничего не вывела. Можно сохранить вывод вашей функции в переменной и передать ее функции print.

# Продолжение
# предыдущего примера
def f(x):
    return x * 2
result = f(2)
print(result)  # 4

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

def f(x):
    return x + 1

z = f(4)
if z == 5:
    print("z равно 5")
else:
    print ("z не равно 5")

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

def f():
    return 1 + 1

result = f()
print(result)  # 2

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

def f(x, y, z):
    return x + y + z

result = f(1, 2, 3)
print(result)  # 6

Наконец, функция не обязана содержать инструкцию return. Если функции нечего возвращать, она возвращает значение None.

def f():
    z = 1 + 1
result = f()
print (result)  # None

Обязательные и необязательные параметры

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

В Python есть и другой вид параметров — опциональные. Опциональные параметры определяются с помощью следующего синтаксиса: имя_функции(имя_параметра = значение_параметра). Как и обязательные, опциональные параметры нужно отделять запятыми. Ниже приведен пример функции, в коде которой используется опциональный параметр.

def f(x=2):
    return x**x

print (f())  # 4
print (f(4))  # 16

Сначала функция вызывается без передачи параметра. Так как параметр необязательный, x автоматически становится равен 2, и функция возвращает 4.

Затем та же функция вызывается с параметром 4. То есть x будет равен 4 и функция вернет 16. Вы можете определить функцию, которая принимает как обязательные, так и опциональные параметры, но обязательные нужно определять в первую очередь.

def add(x, y=10):
    return x + y
result = add(2)
print(result)

Python вызов функции из пользовательского ввода

Можете ли вы вызывать функции из пользовательского ввода? Что-то вроде этого:

def testfunction(function):
    function()

a = raw_input("fill in function name: "
testfunction(a)

Поэтому, если вы заполните существующую функцию, она ее выполнит.

python

Поделиться

Источник


Henkhooft    

27 февраля 2011 в 16:52

3 ответа


  • Emacs функции для чтения пользовательского ввода

    Мне нужны функции для запроса пользовательского ввода как в: 1) графической, так и в 2) Неграфической среде в emacs. я обнаружил, что могу сделать что-то подобное для неграфического случая: (defun query-friends-phone (name) … (interactive sEnter friend’s name: ) (message Name: %s name) ) Мне нужно…

  • Вызов функции Python из MATLAB

    Возможный Дубликат : Вызов функции Python из MATLAB Мне нужно вызвать функцию Python из среды MATLAB. Возможно ли это? Предположим, у меня есть следующий код Python: def squared(x): y = x * x return y Как позвонить в квадрате(3) от MATLAB рабочее место/код и вам 9?



3

То, что вы делаете, плохо, плохо, плохо 😛 Однако это вполне возможно.

a = raw_input("Fill in function name:")
if a in locals().keys() and callable(locals()['a']):
    locals()['a']()
else:
    print 'Function not found'

locals() возвращает словарь всех доступных в данный момент объектов и их имен. Поэтому, когда мы говорим a in locals().keys() , мы говорим: «Есть ли какой-либо объект, называемый «. Если есть, то мы получим его, выполнив locals()['a'] , а затем проверим, является ли это функцией с использованием callable . Если это True , то мы вызываем функцию. Если это не так, мы просто печатаем "Function not found" .

Поделиться


Blue Peppers    

27 февраля 2011 в 16:59



2

Да, вы можете, хотя это, как правило, плохая идея и большой риск для безопасности.

def testfunc(fn):
    fn()

funcname = raw_input('Enter the name of a function')
if callable(globals()[funcname]):
    testfunc(globals()[funcname])

Поделиться


Chinmay Kanchi    

27 февраля 2011 в 16:57



2

Я бы, вероятно, инкапсулировал такое поведение в классе:

class UserExec(object):
    def __init__(self):
        self.msg = "hello"
    def get_command(self):
        command = str(raw_input("Enter a command: "))
        if not hasattr(self, command):
            print "%s is not a valid command" % command
        else:
            getattr(self, command)()
    def print_msg(self):
        print self.msg
a = UserExec()
a.get_command()

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

Поделиться


senderle    

27 февраля 2011 в 17:01


Похожие вопросы:

Как преобразовать строку даты из пользовательского ввода в date.today() python

Python новичок, мне нужно преобразовать строку из пользовательского ввода в формат dd/mm/yyyy и проверить, есть ли она в будущем?, нужно ли мне переупорядочить формат ввода для сравнения и…

Вызов метода из пользовательского ввода

В настоящее время я работаю над проектом, и меня попросили создать игру типа головоломки, основанную на массиве 2d. Я создал методы, которые все работают нормально, но я не совсем знаю, как сделать…

Очистка пользовательского ввода с помощью Python

Каков наилучший способ очистки пользовательского ввода для веб-приложения на базе Python? Существует ли одна функция для удаления HTML символов и любых других необходимых комбинаций символов для…

Emacs функции для чтения пользовательского ввода

Мне нужны функции для запроса пользовательского ввода как в: 1) графической, так и в 2) Неграфической среде в emacs. я обнаружил, что могу сделать что-то подобное для неграфического случая: (defun…

Вызов функции Python из MATLAB

Возможный Дубликат : Вызов функции Python из MATLAB Мне нужно вызвать функцию Python из среды MATLAB. Возможно ли это? Предположим, у меня есть следующий код Python: def squared(x): y = x * x return…

Как отключить все виджеты пользовательского ввода (кнопки, записи..) из родительского виджета?

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

Как передать результат из функции, которая требует ввода GUI (python)?

Я пишу сценарий python, который принимает пользовательский ввод через GUI, а затем передает его функции, которая в основном читает текстовые файлы и проверяет, что запрошенное пользователем…

C++: вызов функции из пользовательского ввода

В python, когда у меня есть несколько различных функций, которые вызываются на основе пользовательского ввода, у меня есть словарь с пользовательским вводом в качестве ключа и именем функции в…

Вызов функции java из python-Chaquopy

Я просмотрел документы Chaquopy и нашел; с помощью Chaquopy код java и python можно вызывать по желанию пользователя. Я просмотрел примеры приложений и нашел примеры либо вызова python из java, либо…

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

Я искал в интернете и на этом веб-сайте, но подобные сообщения, которые создают функцию, которая вычисляет производную функции в точке x, не являются функциями пользовательского ввода. Например, у…

Как сделать функции на Python еще лучше / Хабр

Собственно, заголовок этой замечательной статьи от Джеффа Кнаппа (Jeff Knupp), автора книги «

Writing Idiomatic Python

» полностью отражает ее суть. Читайте внимательно и не стесняйтесь комментировать.

Поскольку очень не хотелось оставлять в тексте важный термин латиницей, мы позволили себе перевести слово «docstring» как «докстрока», обнаружив этот термин в нескольких русскоязычных источниках.


В Python, как и в большинстве современных языков программирования, функция – это основной метод абстрагирования и инкапсуляции. Вы, будучи разработчиком, вероятно, написали уже сотни функций. Но функции функциям – рознь. Причем, если писать «плохие» функции, это немедленно скажется на удобочитаемости и поддержке вашего кода. Итак, что же такое «плохая» функция, а еще важнее – как сделать из нее «хорошую»?

Освежим тему

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

f(x) = 2x + 3

. Это функция под названием

f

, принимающая аргумент

x

, а затем «возвращающая» дважды

x + 3

. Хотя, она и не слишком похожа на те функции, к которым мы привыкли в Python, она совершенно аналогична следующему коду:

def f(x):
    return 2*x + 3

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

Секреты хорошей функции

Что отличает «хорошую» функцию Python от посредственной? Вы удивитесь, как много трактовок допускает слово «хорошая». В рамках этой статьи я буду считать функцию Python «хорошей», если она удовлетворяет

большинству

пунктов из следующего списка (выполнить все пункты для конкретной функции порой невозможно):

  • Она внятно названа
  • Соответствует принципу единственной обязанности
  • Содержит докстроку
  • Возвращает значение
  • Состоит не более чем из 50 строк
  • Она идемпотентная и, если это возможно, чистая

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

Именование

Вот моя любимая цитата на эту тему, часто ошибочно приписываемая Дональду, а на самом деле принадлежащая Филу Карлтону:

В компьютерных науках есть две сложности: инвалидация кэша и именование.

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

def get_knn_from_df(df):

Теперь плохие названия попадаются мне практически повсюду, но данный пример взят из области Data Science (точнее, машинного обучения), где практикующие специалисты обычно пишут код в блокноте Jupyter, а потом пытаются собрать из этих ячеек удобоваримую программу.

Первая проблема с названием этой функции – в нем используются аббревиатуры. Лучше использовать полные английские слова, а не аббревиатуры и не малоизвестные сокращения. Единственная причина, по которой хочется сокращать слова — не тратить сил на набор лишнего текста, но в любом современном редакторе есть функция автозавершения, поэтому вам придется набрать полное название функции всего один раз. Аббревиатура – это проблема, поскольку зачастую она специфична для предметной области. В вышеприведенном коде knn означает «K-ближайшие соседи», а df означает «DataFrame», структуру данных, повсеместно используемую в библиотеке pandas. Если код будет читать программист, не знающий этих сокращений, то он практически ничего не поймет в названии функции.

Еще в названии этой функции есть два более мелких недочета. Во-первых, слово "get" избыточно. В большинстве грамотно поименованных функций сразу понятно, что данная функция что-то возвращает, что конкретно – отражено в имени. Элемент from_df также не нужен. Либо в докстроке функции, либо (если она находится на периферии) в аннотации типа будет описан тип параметра, если эта информация и так не очевидна из названия параметра.

Так как же нам переименовать эту функцию? Просто:

def k_nearest_neighbors(dataframe):

Теперь даже неспециалисту понятно, что вычисляется в этой функции, а имя параметра

(dataframe)

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

Единственная ответственность

Развивая мысль Боба Мартина, скажу, что

Принцип единственной ответственности

касается функций не меньше, чем классов и модулей (о которых изначально и писал господин Мартин). Согласно этому принципу (в нашем случае) у функции должна быть единственная ответственность. То есть, она должна делать одну и только одну вещь. Один из самых веских доводов в пользу этого: если функция делает всего одну вещь, то и переписывать ее придется в единственном случае: если эту самую вещь придется делать по-новому. Также становится ясно, когда функцию можно удалить; если, внеся изменения где-то в другом месте, мы поймем, что единственная обязанность функции более не актуальна, то мы от нее просто избавимся.

Здесь лучше привести пример. Вот функция, делающая более одной «вещи»:

def calculate_and print_stats(list_of_numbers):
    sum = sum(list_of_numbers)
    mean = statistics.mean(list_of_numbers)
    median = statistics.median(list_of_numbers)
    mode = statistics.mode(list_of_numbers)

    print('-----------------Stats-----------------')
    print('SUM: {}'.format(sum)
    print('MEAN: {}'.format(mean)
    print('MEDIAN: {}'.format(median)
    print('MODE: {}'.format(mode)

А именно две: вычисляет набор статистических данных о списке чисел и выводит их в

STDOUT

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

Функцию (вернее, наличие у нее двух обязанностей) с потрохами выдает слово and в ее названии

.

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

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

Докстроки

Казалось бы, все в курсе, что есть документ

PEP-8

, где даются рекомендации по стилю кода на Python, но гораздо меньше среди нас тех, кто знает

PEP-257

, в котором такие же рекомендации даются по поводу докстрок. Чтобы не пересказывать содержание PEP-257, отсылаю вас самих к этому документу – почитайте в свободное время. Однако, основные его идеи таковы:

  • Для каждой функции нужна докстрока
  • В ней следует соблюдать грамматику и пунктуацию; писать законченными предложениями
  • Докстрока начинается с краткого (в одно предложение) описания того, что делает функция
  • Докстрока формулируется в предписывающем, а не в описательном стиле

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

Возвращаемые значения

Функции можно (и

следует

) трактовать как маленькие самодостаточные программы. Они принимают некоторый ввод в форме параметров и возвращают результат. Параметры, конечно, опциональны.

А вот возвращаемые значения обязательны с точки зрения внутреннего устройства Python

. Если вы даже попытаетесь написать функцию, которая не возвращает значения – не сможете. Если функция даже не станет возвращать значения, то интерпретатор Python «принудит» ее возвращать

None

. Не верите? Попробуйте сами:

❯ python3
Python 3.7.0 (default, Jul 23 2018, 20:22:55)
[Clang 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def add(a, b):
...   print(a + b)
...
>>> b = add(1, 2)
3
>>> b
>>> b is None
True

Как видите, значение

b

– по сути

None

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

тестировать

такую программу?

Я даже не побоюсь утверждать следующее: каждая функция должна возвращать полезное значение, хотя бы ради тестируемости. Код, который я пишу, должен быть протестирован (это не обсуждается). Только представьте, каким корявым может получится тестирование вышеприведенной функции add (подсказка: вам придется перенаправлять ввод/вывод, после чего вскоре все пойдет наперекосяк). Кроме того, возвращая значение, мы можем выполнять сцепление методов и, следовательно, писать код вот так:

with open('foo.txt', 'r') as input_file:
    for line in input_file:
        if line.strip().lower().endswith('cat'):
            # ... делаем с этими строками что-нибудь полезное

Строка

if line.strip().lower().endswith('cat'):

работает, поскольку каждый из строковых методов (

strip()

,

lower()

,

endswith()

) в результате вызова функции возвращает строку.

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

«Она всего лишь [какая-то операция, связанная с вводом/выводом, например, сохранение значения в базе данных]. Здесь я не могу вернуть ничего полезного.»

Не соглашусь. Функция может вернуть True, если операция завершилась успешно.

«Здесь мы изменяем один из имеющихся параметров, используем его как ссылочный параметр.»»»

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

True

, если операция завершилась успешно».

«Мне нужно возвращать несколько значений. Нет такого единственного значения, которое в данном случае было бы целесообразно возвращать.»

Этот аргумент немного надуманный, но мне доводилось его слышать. Ответ, разумеется, как раз в том, что автор и хотел сделать – но не знал как:

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

.

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

Длина функции

Я не раз признавался, что довольно туп. Могу одновременно держать в голове примерно три вещи. Если вы дадите мне прочесть 200-строчную функцию и спросите, что она делает, я, вероятно, буду таращиться на нее не менее 10 секунд.

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

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

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

Итак, что же делать, если ваша функция получилась слишком длинной? РЕФАКТОРИТЬ! Вероятно, вам приходится заниматься рефакторингом постоянно, даже если вы не знаете этого термина. Рефакторинг – это попросту изменение структуры программы, без изменения ее поведения. Поэтому, извлечение нескольких строк кода из длинной функции и превращение их в самостоятельную функцию – это один из типов рефакторинга. Оказывается, это еще и наиболее распространенный, и самый быстрый способ продуктивного укорачивания длинных функций. Поскольку вы даете этим новым функциям подходящие имена, получающийся у вас код гораздо проще читать. Я написал целую книгу о рефакторинге (на самом деле, я им постоянно занимаюсь), так что здесь вдаваться в детали не буду. Просто знайте, что, если у вас есть слишком длинная функция – то ее следует рефакторить.

Идемпотентность и функциональная чистота

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

add_three(number)

идемпотентна:

def add_three(number):
    """вернуть *число* + 3."""
    return number + 3

Независимо от того, сколько раз мы вызовем

add_three(7)

, ответ всегда будет равен 10. А вот другой случай – функция, не являющаяся идемпотентной:

def add_three():
    """Вернуть 3 + число, введенное пользователем."""
    number = int(input('Enter a number: '))
    return number + 3

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

add_three()

возвращаемые значения будут отличаться. Если мы дважды вызовем эту функцию, то пользователь в первом случае может ввести 3, а во втором – 7, и тогда два вызова

add_three()

вернут 6 и 10 соответственно.

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

Почему идемпотентность так важна

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

Что такое «чистая» функция?

В функциональном программировании функция считается чистой, если она,

во-первых

, идемпотентна, а

во-вторых

– не вызывает наблюдаемых

побочных эффектов

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

add_three(number)

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

print()

– это просто

побочный эффект

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

Давайте немного разовьем наш пример с add_three(number). Можно написать следующий код, чтобы определить, сколько раз была вызвана add_three(number):

add_three_calls = 0

def add_three(number):
    """Вернуть *число* + 3."""
    global add_three_calls
    print(f'Returning {number + 3}')
    add_three_calls += 1
    return number + 3

def num_calls():
    """Вернуть, сколько раз была вызвана *add_three*."""
    return add_three_calls

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

Чистая функция не оказывает побочных эффектов. Она не только не использует никаких «внешних данных» при расчете значения, но и не взаимодействует с остальной программой/системой, только вычисляет и возвращает указанное значение. Следовательно, хотя наше новое определение add_three(number) остается идемпотентным, эта функция уже не чистая.

В чистых функциях нет инструкций логирования или вызовов print(). При работе они не обращаются к базе данных и не используют соединений с интернетом. Не обращаются к нелокальным переменным и не изменяют их. И не вызывают других не-чистых функций.

Короче говоря, они не оказывают «жуткого дальнодействия», выражаясь словами Эйнштейна (но в контексте информатики, а не физики). Они не изменяют каким-либо образом остальные части программы или системы. В императивном программировании (а именно им вы и занимаетесь, когда пишете код на Python), такие функции – самые безопасные. Они известны своей тестируемостью и удобством в поддержке; более того, поскольку они идемпотентны, тестирование таких функций гарантированно будет столь же быстрым, как и выполнение. Сами тесты также просты: не приходится подключаться к базе данных либо имитировать какие-либо внешние ресурсы, готовить стартовую конфигурацию кода, а по окончании работы не нужно ничего подчищать.

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

Заключение

Вот и все. Оказывается, секрет создания новых функций – никакой не секрет. Просто нужно придерживаться некоторых выверенных наилучших практик и железных правил. Надеюсь, статья вам понравилась. А теперь идите – и перескажите ее друзьям! Давайте договоримся везде и во всех случаях писать отличный код. Или, как минимум, прилагать максимум усилий, чтобы не плодить в этом мире «плохой код». С этим я смогу жить.

Python-функций: как вызывать и писать функции

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

Вот почему этот пост познакомит вас с функциями в Python.Вы затронете следующие темы:

(Для дальнейшей практики попробуйте курс DataCamp Python Data Science Toolbox (часть 1)!)

Функции в Python

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

В Python есть три типа функций:

  • Встроенные функции, такие как help () для запроса помощи, min () для получения минимального значения, print () для печати объекта на терминале,… Вы можете найти обзор с больше этих функций здесь.
  • Пользовательские функции (UDF), которые представляют собой функции, которые пользователи создают, чтобы помочь им; И
  • Анонимные функции, которые также называются лямбда-функциями, потому что они не объявлены со стандартным ключевым словом def .

Функции и методы

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

Рассмотрим этот пример, где вы сначала определяете функцию plus () , а затем класс суммирования с методом sum () :

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGEgZnVuY3Rpb24gYHBsdXMoKWBcbmRlZiBwbHVzKGEsYik6XG4gIHJldHVybiBhICsgYlxuICBcbiMgQ3JlYXRlIGEgYFN1bW1hdGlvbmAgY2xhc3NcbmNsYXNzIFN1bW1hdGlvbihvYmplY3QpOlxuICBkZWYgc3VtKHNlbGYsIGEsIGIpOlxuICAgIHNlbGYuY29udGVudHMgPSBhICsgYlxuICAgIHJldHVybiBzZWxmLmNvbnRlbnRzICJ9

Если теперь вы хотите вызвать метод sum () , который является частью класса Sumutation , вам сначала нужно определить экземпляр или объект этого класса.Итак, давайте определим такой объект:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZGVmIHBsdXMoYSxiKTpcbiAgcmV0dXJuIGEgKyBiXG4gIFxuY2xhc3MgU3VtbWF0aW9uKG9iamVjdCk6XG4gIGRlZiBzdW0oc2VsZiwgYSwgYik6XG4gICAgc2VsZi5jb250ZW50cyA9IGEgKyBiXG4gICAgcmV0dXJuIHNlbGYuY29udGVudHMgIiwic2FtcGxlIjoiIyBJbnN0YW50aWF0ZSBgU3VtbWF0aW9uYCBjbGFzcyB0byBjYWxsIGBzdW0oKWBcbnN1bUluc3RhbmNlID0gU3VtbWF0aW9uKClcbnN1bUluc3RhbmNlLnN1bSgxLDIpIn0 =

Помните, что в этом экземпляре нет необходимости, если вы хотите вызвать функцию plus () ! Вы сможете без проблем выполнить plus (1,2) в фрагменте кода DataCamp Light!

Параметры против аргументов

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

Рассмотрим следующий пример и вернемся к приведенному выше фрагменту DataCamp Light: вы передаете два аргумента методу sum () класса Sumutation , даже если вы ранее определили три параметра , а именно, self , a и b .

Что случилось с и ?

Первым аргументом каждого метода класса всегда является ссылка на текущий экземпляр класса, которым в данном случае является Суммирование . По соглашению этот аргумент называется self .

Все это означает, что в данном случае вы не передаете ссылку на self , потому что self — это имя параметра для неявно переданного аргумента, который ссылается на экземпляр, через который вызывается метод.Он неявно вставляется в список аргументов.

Как определить функцию: определяемые пользователем функции (UDF)

Четыре шага для определения функции в Python следующие:

  1. Используйте ключевое слово def , чтобы объявить функцию, а затем укажите имя функции.
  2. Добавьте параметры к функции: они должны быть в скобках функции. Завершите строку двоеточием.
  3. Добавить операторы, которые должны выполняться функциями.
  4. Завершите вашу функцию оператором return, если функция должна что-то выводить. Без оператора return ваша функция вернет объект None .

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRlZiBoZWxsbygpOlxuICBwcmludChcIkhlbGxvIFdvcmxkXCIpIFxuICByZXR1cm4g

Конечно, ваши функции будут усложняться по мере продвижения: вы можете добавить к нему циклы for, управление потоком и т. Д., Чтобы сделать его более детализированным:

  def привет ():
  name = str (input ("Введите свое имя:"))
  если имя:
    print ("Привет" + str (имя))
  еще:
    print ("Привет, мир")
  возвращение
  
привет ()  

В приведенной выше функции вы просите пользователя указать имя.Если имя не указано, функция распечатает «Hello World». В противном случае пользователь получит персональный ответ «Привет».

Помните также, что вы можете определить один или несколько параметров функции для своей UDF. Вы узнаете об этом больше, когда займетесь разделом «Аргументы функций». Кроме того, вы можете или не можете вернуть одно или несколько значений в результате своей функции.

Возврат

Заявление

Обратите внимание, что когда вы что-то печатаете в своем UDF hello () , вам действительно не нужно его возвращать.Не будет никакой разницы между приведенной выше функцией и этой:

.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRlZiBoZWxsb19ub3JldHVybigpOlxuICBwcmludChcIkhlbGxvIFdvcmxkXCIpICJ9

Однако, если вы хотите продолжить работу с результатом вашей функции и опробовать некоторые операции с ним, вам нужно будет использовать оператор return , чтобы фактически вернуть значение, такое как String, целое число,…. Рассмотрим следующий сценарий, где hello () возвращает строку "hello" , а функция hello_noreturn () возвращает None :

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRlZiBoZWxsbygpOlxuICBwcmludChcIkhlbGxvIFdvcmxkXCIpIFxuICByZXR1cm4oXCJoZWxsb1wiKVxuXG5kZWYgaGVsbG9fbm9yZXR1cm4oKTpcbiAgcHJpbnQoXCJIZWxsbyBXb3JsZFwiKVxuICBcbiMgTXVsdGlwbHkgdGhlIG91dHB1dCBvZiBgaGVsbG8oKWAgd2l0aCAyIFxuaGVsbG8oKSAqIDJcblxuIyAoVHJ5IHRvKSBtdWx0aXBseSB0aGUgb3V0cHV0IG9mIGBoZWxsb19ub3JldHVybigpYCB3aXRoIDIgXG5oZWxsb19ub3JldHVybigpICogMiJ9

Вторая функция выдает ошибку, потому что вы не можете выполнять какие-либо операции с Нет .Вы получите TypeError , в котором говорится, что вы не можете выполнить операцию умножения для NoneType ( None , который является результатом hello_noreturn () ) и int ( 2 ).

Подсказка Функции немедленно завершают работу, когда сталкиваются с оператором return , даже если это означает, что они не возвращают никакого значения:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRlZiBydW4oKTpcbiAgZm9yIHggaW4gcmFuZ2UoMTApOlxuICAgICBpZiB4ID09IDI6XG4gICAgICAgcmV0dXJuXG4gIHByaW50KFwiUnVuIVwiKVxuICBcbnJ1bigpIn0 =

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

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

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

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgXG5kZWYgcGx1cyhhLGIpOlxuICBzdW0gPSBhICsgYlxuICByZXR1cm4gKHN1bSwgYSlcblxuIyBDYWxsIGBwbHVzKClgIGFuZCB1bnBhY2sgdmFyaWFibGVzIFxuc3VtLCBhID0gcGx1cygzLDQpXG5cbiMgUHJpbnQgYHN1bSgpYFxucHJpbnQoc3VtKSJ9

Обратите внимание на , что return statement return sum, будет иметь тот же результат, что и return (sum, a) : первый фактически упаковывает sum и a в кортеж под капотом!

Как вызвать функцию

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

Вызовите новую функцию hello () , просто выполнив hello () , как в фрагменте DataCamp Light ниже:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZGVmIGhlbGxvKCk6XG4gIHByaW50KFwiSGVHsbG8gV29YBGRCIik

Как добавить строки документации к функции Python

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

Строки документации функции помещаются в строку сразу после заголовка функции и заключаются в тройные кавычки. Подходящей строкой документации для функции hello () является «Печать« Hello World »».

  def привет ():
"" "Печать" Hello World ".

Возврат:
    Никто
"" "
  print ("Привет, мир")
  возврат  

Обратите внимание, , что строки документации могут быть более длинными, чем та, которая приведена здесь в качестве примера. Если вы хотите изучить строки документации более подробно, вам лучше всего проверить некоторые репозитории Github библиотек Python, такие как scikit-learn или pandas, где вы найдете множество примеров!

Аргументы функций в Python

Ранее вы узнали о разнице между параметрами и аргументами.Короче говоря, аргументы — это вещи, которые передаются при вызове любой функции или метода, в то время как код функции или метода ссылается на аргументы по их именам параметров. UDF-функции Python могут принимать четыре типа аргументов:

  • Аргументы по умолчанию
  • Обязательные аргументы
  • Аргументы ключевого слова
  • Переменное количество аргументов

Аргументы по умолчанию

Аргументы по умолчанию — это те, которые принимают значение по умолчанию, если во время вызова функции значение аргумента не передается.Вы можете присвоить это значение по умолчанию с помощью оператора присваивания = , как в следующем примере:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIGZ1bmN0aW9uXG5kZWYgcGx1cyhhLGIgPSAyKTpcbiAgcmV0dXJuIGEgKyBiXG4gIFxuIyBDYWxsIGBwbHVzKClgIHdpdGggb25seSBgYWAgcGFyYW1ldGVyXG5wbHVzKGE9MSlcblxuIyBDYWxsIGBwbHVzKClgIHdpdGggYGFgIGFuZCBgYmAgcGFyYW1ldGVyc1xucGx1cyhhPTEsIGI9MykifQ ==

Обязательные аргументы

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

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIHdpdGggcmVxdWlyZWQgYXJndW1lbnRzXG5kZWYHIhlxGx1lbnRzXG5kZWyhIgxRXXGxG5kZWyhIhXRXXGxG5kZWyhIhxRXXGxG5kZWyhIgXRX

Вам нужны аргументы, которые сопоставляются с параметрами a , а также с параметрами b для вызова функции без получения каких-либо ошибок. Если вы поменяете местами на и b , результат не будет отличаться, но это может быть, если вы измените plus () на следующее:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIHdpdGggcmVxdWlyZWQgYXJndW1lbnRzXG5kZWyhlxGx1lbnRzXG5kZWYhlcGx1lbnRzXG5kZWYhxRX1

Аргументы ключевого слова

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

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIGZ1bmN0aW9uXG5kZWYgcGx1cyhhLGIpOlxuICByZXR1cm4gYSArIGJcbiAgXG4jIENhbGwgYHBsdXMoKWAgZnVuY3Rpb24gd2l0aCBwYXJhbWV0ZXJzIFxucGx1cygyLDMpXG5cbiMgQ2FsbCBgcGx1cygpYCBmdW5jdGlvbiB3aXRoIGtleXdvcmQgYXJndW1lbnRzXG5wbHVzKGE9MSwgYj0yKSJ9

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

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIGZ1bmN0aW9uXG5kZWYgcGx1cyhhLGIpOlxuICByZXR1cm4gYSArIGJcbiAgXG4jIENhbGwgYHBsdXMoKWAgZnVuY3Rpb24gd2l0aCBrZXl3b3JkIGFyZ3VtZW50c1xucGx1cyhiPTIsIGE9MSkifQ ==

Переменное количество аргументов

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

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIGZ1bmN0aW9uIHRvIGFjY2VwdCBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHNcbmRlZiBwbHVzKCphcmdzKTpcbiAgcmV0dXJuIHN1bShhcmdzKVxuXG4jIENhbGN1bGF0ZSB0aGUgc3VtXG5wbHVzKDEsNCw1KSJ9

Звездочка ( * ) помещается перед именем переменной, которая содержит значения всех аргументов переменных, не являющихся ключевыми словами.Обратите внимание, что вы также могли передать * varint , * var_int_args или любое другое имя функции plus () .

Совет : попробуйте заменить * args другим именем, содержащим звездочку. Вы увидите, что приведенный выше код продолжает работать!

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

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIGZ1bmN0aW9uIHRvIGFjY2VwdCBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHNcbmRlZiBwbHVzKCphcmdzKTpcbiAgdG90YWwgPSAwXG4gIGZvciBpIGluIGFyZ3M6XG4gICAgdG90YWwgKz0gaVxuICByZXR1cm4gdG90YWxcblxuIyBDYWxjdWxhdGUgdGhlIHN1bSAgXG5wbHVzKDIwLDMwLDQwLDUwKSJ9

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

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

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgR2xvYmFsIHZhcmlhYmxlIGBpbml0YFxuaW5pdCA9IDFcblxuIyBEZWZpbmUgYHBsdXMoKWAgZnVuY3Rpb24gdG8gYWNjZXB0IGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50c1xuZGVmIHBsdXMoKmFyZ3MpOlxuICAjIExvY2FsIHZhcmlhYmxlIGBzdW0oKWBcbiAgdG90YWwgPSAwXG4gIGZvciBpIGluIGFyZ3M6XG4gICAgdG90YWwgKz0gaVxuICByZXR1cm4gdG90YWxcbiAgXG4jIEFjY2VzcyB0aGUgZ2xvYmFsIHZhcmlhYmxlXG5wcmludChcInRoaXMgaXMgdGhlIGluaXRpYWxpemVkIHZhbHVlIFwiICsgc3RyKGluaXQpKVxuXG4jIChUcnkgdG8pIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVcbnByaW50KFwidGhpcyBpcyB0aGUgc3VtIFwiICsgc3RyKHRvdGFsKSkifQ ==

Когда вы попытаетесь распечатать локальную переменную total , которая была определена внутри тела функции, вы увидите, что вы получите NameError , в котором говорится, что имя 'total' не определено .С другой стороны, переменную init можно без проблем распечатать.

Анонимные функции в Python

Анонимные функции также называются лямбда-функциями в Python, потому что вместо их объявления со стандартным ключевым словом def вы используете ключевое слово lambda .

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRvdWJsZSA9IGxhbWJkYSB4OiB4KjJcblxuZG91YmxlKDUpIn0 =

В приведенном выше фрагменте DataCamp Light lambda x: x * 2 является анонимной или лямбда-функцией. x — это аргумент, а x * 2 — это выражение или инструкция, которые вычисляются и возвращаются. Особенностью этой функции является то, что у нее нет имени, как в примерах, которые вы видели в первой части этого руководства по функциям. Если бы вам пришлось написать указанную выше функцию в UDF, результат был бы следующим:

  def double (x):
  возврат x * 2  

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

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgYHN1bSgpYCBsYW1iZGEgZnVuY3Rpb25cbnN1bSA9IGxhbWJkYSB4LCB5OiB4ICsgeTtcblxuIyBDYWxsIHRoZSBgc3VtKClgIGFub255bW91cyBmdW5jdGlvblxuc3VtKDQsNSlcblxuIyBcIlRyYW5zbGF0ZVwiIHRvIGEgVURGXG5kZWYgc3VtKHgsIHkpOlxuICByZXR1cm4geCt5In0 =

Вы используете анонимные функции, когда вам требуется безымянная функция на короткий период времени, которая создается во время выполнения.Конкретные контексты, в которых это будет актуально, — это когда вы работаете с filter () , map () и reduce () :

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImZyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2VcblxubXlfbGlzdCA9IFsxLDIsMyw0LDUsNiw3LDgsOSwxMF1cblxuIyBVc2UgbGFtYmRhIGZ1bmN0aW9uIHdpdGggYGZpbHRlcigpYFxuZmlsdGVyZWRfbGlzdCA9IGxpc3QoZmlsdGVyKGxhbWJkYSB4OiAoeCoyID4gMTApLCBteV9saXN0KSlcblxuIyBVc2UgbGFtYmRhIGZ1bmN0aW9uIHdpdGggYG1hcCgpYFxubWFwcGVkX2xpc3QgPSBsaXN0KG1hcChsYW1iZGEgeDogeCoyLCBteV9saXN0KSlcblxuIyBVc2UgbGFtYmRhIGZ1bmN0aW9uIHdpdGggYHJlZHVjZSgpYFxucmVkdWNlZF9saXN0ID0gcmVkdWNlKGxhbWJkYSB4LCB5OiB4K3ksIG15X2xpc3QpXG5cbnByaW50KGZpbHRlcmVkX2xpc3QpXG5wcmludChtYXBwZWRfbGlzdClcbnByaW50KHJlZHVjZWRfbGlzdCkifQ ==

Функция filter () фильтрует, как следует из названия, исходный список ввода my_list на основе критерия > 10 .С другой стороны, с помощью map () вы применяете функцию ко всем элементам списка my_list . В этом случае вы умножаете все элементы на 2 .

Обратите внимание, что функция reduce () является частью библиотеки functools . Вы используете эту функцию кумулятивно для элементов списка my_list слева направо и сокращаете последовательность до одного значения, 55 , в этом случае.

Использование

main () как функции

Если у вас есть опыт работы с другими языками программирования, такими как Java, вы знаете, что для выполнения функций требуется основная функция .Как вы видели в приведенных выше примерах, это не обязательно для Python. Однако включение функции main () в вашу программу Python может быть полезным для логической структуры вашего кода — все наиболее важные компоненты содержатся в этой функции main () .

Вы можете легко определить функцию main () и вызвать ее так же, как вы это делали со всеми другими функциями, указанными выше:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZGVmIGhlbGxvKCk6XG4gIHByaW50KFwiSGVsbG8gV29ybGRcIikgXG4gIHJldHVybiAiLCJzYW1wbGUiOiIjIERlZmluZSBgbWFpbigpYCBmdW5jdGlvblxuZGVmIG1haW4oKTpcbiAgaGVsbG8oKVxuICBwcmludChcIlRoaXMgaXMgYSBtYWluIGZ1bmN0aW9uXCIpXG5cbm1haW4oKSJ9

Однако в нынешнем виде код вашей функции main () будет вызываться, когда вы импортируете ее как модуль.Чтобы этого не произошло, вы вызываете функцию main () , когда __name__ == '__main__' .

Это означает, что код вышеупомянутого фрагмента кода становится:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZGVmIGhlbGxvKCk6XG4gIHByaW50KFwiSGVsbG8gV29ybGRcIikgXG4gIHJldHVybiAiLCJzYW1wbGUiOiIjIERlZmluZSBgbWFpbigpYCBmdW5jdGlvblxuZGVmIG1haW4oKTpcbiAgaGVsbG8oKVxuICBwcmludChcIlRoaXMgaXMgYSBtYWluIGZ1bmN0aW9uXCIpXG4gIFxuIyBFeGVjdXRlIGBtYWluKClgIGZ1bmN0aW9uIFxuaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzpcbiAgICBtYWluKCkifQ ==

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

  класс Собака:
    "" "
    Требует:
    ноги - Ноги, чтобы собака могла ходить.
    color - цвет меха.
    "" "

    def __init __ (я, ноги, цвет):
        себя.ноги = ноги
        self.color = цвет
        
    def кора (сам):
        bark = "кора" * 2
        ответный лай

если __name__ == "__main__":
    dog = Собака (4, «коричневый»)
    лай = dog.bark ()
    печать (кора)  

Хотите практиковаться дальше?

Поздравляю! Вы прошли это короткое руководство по функциям в Python. Если вы хотите пересмотреть другие базовые материалы по программированию на Python, не пропустите курс Data Types for Data Science, в котором вы обобщите и попрактикуетесь в своих знаниях о списках, словарях, кортежах, наборах и датах.

Как создать функцию в Python

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

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

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

Основная цель функции —

  1. Чтобы сделать программу более читаемой и организованной и,
  2. Уменьшить повторяющийся код.

Содержание

  1. Определение функции
  2. Вызов функции
  3. Функция с параметром
  4. Функция с возвратом
  5. Значение по умолчанию
  6. Несколько параметров

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

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

Функциональный блок начинается с двоеточия (:) символа.

Синтаксис —

 def имя-функции (параметр):
  # утверждение

 

Пример

 def callMe ():
  print («Функция вызывается»)

 

В приведенном выше примере я создал функцию callMe () , которая не принимает никаких аргументов.Он печатает текст на экране при вызове.


2. Вызов функции

Укажите имя функции и укажите параметры в круглых скобках (), если оно принимает значения. После выполнения задания возвращается обратно в программу.

Синтаксис —

 def имя-функции (параметр): # определение функции
  # утверждение

имя-функции (параметр) # вызов функции 

Пример

 def callMe ():
  print («Функция вызывается»)

позвони мне()
позвони мне()
 

Выход

 Функция называется
Функция называется
 

3.Функция с параметром

Укажите параметр в функции, если вы хотите выполнить задачу с разными-разными параметрами.

Синтаксис —

 def имя-функции (параметр):
  # утверждение

имя-функции (параметр) 

Пример

 def checkevenOrodd (число):
  если число% 2 == 0:
  print ("Четное число")
  еще:
  print ("Нечетное число")

checkevenOrodd (2)
checkevenOrodd (5)
checkevenOrodd (8)
 

Выход

 Четное число
Нечетное число
Четное число 

4.Функция с возвратом

Используйте оператор return для возврата значения из функции вызывающей стороне.

Синтаксис —

 def имя-функции (параметр):
  # утверждение
  возвращаемое значение

 

Пример

 def maxlist (список1):
  max = list1 [0]
  для l в list1:
  если l> max:
  макс = l
  возврат макс

list1 = [1,55,23,2]
list2 = [4,24,78,6,21]

print ("максимальное значение в списке1 равно", maxlist (list1))
print ("максимальное значение в списке2 равно", maxlist (list2))

 

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

Выход

 максимальное значение в списке 1 - 55
максимальное значение в списке 2 - 78 

5. Значение по умолчанию

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

Синтаксис —

 def имя-функции (переменная = значение, переменная = значение, ...):
  # утверждение

 

Пример

 def displayInfo (fname, lname = "Singh", age = 22):
  print ("имя:", fname, ", фамилия:", lname, ", возраст:", возраст)

displayInfo ("Йогеш")
displayInfo ("Vishal", age = 24) # Изменение значения возраста по умолчанию
displayInfo («Мохит», «Шарма»)

 

Выше я указываю значение по умолчанию в переменной lname и age .Если эти значения переменных не определены при вызове, будет использоваться значение по умолчанию.

Выход

 имя: Йогеш, фамилия = Сингх, возраст: 22
имя: Вишал, фамилия = Сингх, возраст: 24 года
имя: Мохит, фамилия = Шарма, возраст: 22 года
 

6. Несколько параметров

Для обработки неизвестного количества элементов в функции мы используем символ звездочки (*) в функции. Он содержит столько значений в одном аргументе.

Синтаксис —

 def имя-функции (* аргумент):
  # утверждение

 

Пример

 def display (имя, * друзья):
  print ("имя:", имя)
  print ("друзья:", друзья)

дисплей («Йогеш сингх», «Сонарика», «Вишал», «Виджай»)
дисплей («Джитен сингх», «Мохит», «Аджай», «Абхилаш», «Ганеш», «Адитья»)

 

Я определил звездочку (*) для второго аргумента. Когда функция вызывается, первый параметр переходит в переменную name , а все остальные параметры идут в переменную friends .

Преобразует аргумент друзей в кортеж.

Выход

 имя: Йогеш Сингх
друзья: ('Sonarika', 'Vishal', 'Vijay')
имя: Джитен Сингх
друзья: ('Мохит', 'Аджай', 'Абхилаш', 'Ганеш', 'Адитья')

 

Если вы нашли этот учебник полезным, не забудьте поделиться им.

Вызов, отступ, аргументы и возвращаемые значения

Что такое функция в Python?

Функция в Python — это фрагмент кода, который запускается при обращении к нему.Он используется для использования кода более чем в одном месте программы. Его также называют методом или процедурой. Python предоставляет множество встроенных функций, таких как print (), input (), compile (), exec () и т. Д., Но также дает свободу создавать свои собственные функции.

В этом уроке мы изучим

Как определить и вызвать функцию в Python

Функция в Python определяется оператором def , за которым следует имя функции и круглые скобки (())

Пример:

Давайте определим функцию с помощью команды «def func1 ():» и вызовем эту функцию.Результатом функции будет «Я изучаю функцию Python».

Функция print func1 () вызывает нашу def func1 (): и выводит команду « Я изучаю функцию Python None.

В Python есть набор правил для определения функции.

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

  • Код в каждой функции начинается с двоеточия (:) и должен иметь отступ (пробел)
  • Оператор return (выражение) завершает функцию, опционально передавая значение вызывающей стороне.Оператор return без аргументов аналогичен return None.

Значение отступа (пробела) в Python

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

Python следует определенному стилю отступа для определения кода, поскольку функции Python не имеют явного начала или конца, например фигурных скобок, чтобы указать начало и конец функции, они должны полагаться на этот отступ .Вот простой пример с командой «печать». Когда мы пишем функцию «print» прямо под def func 1 (): она покажет «ошибку отступа : ожидается блок с отступом ».

Теперь, когда вы добавляете отступ (пробел) перед функцией «print», она должна печататься должным образом.

Для успешной работы кода достаточно хотя бы одного отступа. Но лучше всего оставить 3-4 отступа для вызова функции .

Также необходимо, чтобы при объявлении отступа вы сохранили тот же отступ для остальной части кода . Например, на снимке экрана ниже, когда мы вызываем другой оператор «все еще в func1» и когда он не объявлен сразу под первым оператором печати, отображается ошибка отступа «Undent не соответствует никакому другому уровню отступа».

Теперь, когда мы применяем одинаковый отступ для обоих операторов и выравниваем их в одной строке, это дает ожидаемый результат.

Как функция возвращает значение?

Команда возврата в Python указывает, какое значение вернуть вызывающему объекту функции.

Давайте разберемся с этим на следующем примере

Шаг 1) Здесь — мы видим, когда функция не «возврат». Например, нам нужен квадрат 4, и он должен дать ответ «16» при выполнении кода. Что он дает, когда мы просто используем код «print x * x», но когда вы вызываете функцию «print square», в качестве вывода выдает «None».Это связано с тем, что при вызове функции рекурсия не происходит и выпадает из конца функции. Python возвращает «Нет» в случае сбоя в конце функции.

Шаг 2) Чтобы прояснить это, мы заменим команду печати на команду присваивания. Давайте проверим вывод.

Когда вы запускаете команду «print square (4)», она фактически возвращает значение объекта, поскольку у нас нет какой-либо конкретной функции для выполнения здесь, она возвращает «None».

Шаг 3) Теперь мы увидим, как получить вывод с помощью команды «return». Когда вы используете функцию «return» и выполняете код, он выдаст на выходе «16».

Шаг 4) Функции в Python сами по себе являются объектами, а объект имеет некоторое значение. Здесь мы увидим, как Python обрабатывает объект. Когда вы запускаете команду «печать квадрата», она возвращает значение объекта. Поскольку мы не передали никаких аргументов, у нас нет какой-либо конкретной функции для выполнения здесь, она возвращает значение по умолчанию (0x021B2D30), которое является местоположением объекта. В практических программах на Python вам, вероятно, никогда не понадобится это делать.

Аргументы в функциях

Аргумент — это значение, которое передается функции при ее вызове.

Другими словами, на вызывающей стороне это аргумент, а на стороне функции — параметр.

Давайте посмотрим, как работает Python Args —

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

Шаг 2) Чтобы объявить значение аргумента по умолчанию, присвойте ему значение при определении функции.

Пример: x не имеет значений по умолчанию. Значения по умолчанию y = 0. Когда мы предоставляем только один аргумент при вызове функции умножения, Python присваивает предоставленное значение x, сохраняя значение y = 0. Следовательно, умножение x * y = 0

Шаг 3) На этот раз мы изменим значение на y = 2 вместо значения по умолчанию y = 0, и он вернет результат как (4 × 2) = 8.

Шаг 4) Вы также можете изменить порядок, в котором аргументы могут быть переданы в Python.Здесь мы изменили порядок значений x и y на x = 4 и y = 2.

Шаг 5) Несколько аргументов также могут передаваться в виде массива. В этом примере мы вызываем несколько аргументов (1,2,3,4,5), вызывая функцию (* args).

Пример: мы объявили несколько аргументов как число (1,2,3,4,5), когда вызываем функцию (* args); вывод выводится как (1,2,3,4,5)

Советы :

  • В Python 2.7. Перегрузка функции не поддерживается в Python.Перегрузка функций — это возможность создавать несколько методов с одним и тем же именем с разной реализацией. Перегрузка функций полностью поддерживается в Python 3
  • Существует большая путаница между методами и функциями. Методы в Python связаны с экземплярами объектов, а функции — нет. Когда Python вызывает метод, он связывает первый параметр этого вызова с соответствующей ссылкой на объект. Проще говоря, автономная функция в Python — это «функция», тогда как функция, которая является атрибутом класса или экземпляра, является «методом».

Вот полный код Python 3

 # определить функцию
def func1 ():
   print («Я изучаю функцию Python»)
   print ("все еще в функции")
   
func1 ()

def квадрат (x):
  вернуть х * х
печать (квадрат (4))

def multiply (x, y = 0):
print ("значение x =", x)
print ("значение y =", y)
    
вернуть x * y
  
print (умножить (y = 2, x = 4))
 

Вот полный код Python 2

 # определить функцию
def func1 ():
   print "Я изучаю функцию Python"
   напечатать "все еще в func1"
   
func1 ()

def квадрат (x):
  вернуть х * х
квадрат для печати (4)

def multiply (x, y = 0):
print "значение x =", x
print "значение y =", y
    
вернуть x * y
  
напечатать умножить (y = 2, x = 4)
 

Резюме:

Функция

в Python — это фрагмент повторно используемого кода, который используется для выполнения одного связанного действия.В этой статье мы увидим

  • Функция, определенная оператором def
  • Блок кода в каждой функции начинается с двоеточия (:) и должен иметь отступ (пробел)
  • Любые аргументы или входные параметры должны быть заключены в эти круглые скобки и т. Д.
  • После объявления функции перед кодом должен быть оставлен хотя бы один отступ.
  • Следует поддерживать одинаковый стиль отступа во всем коде в функции def
  • В соответствии с передовой практикой оптимальными считаются три или четыре отступа перед выпиской
  • Вы можете использовать команду «return», чтобы вернуть значения в вызов функции.
  • Python напечатает случайное значение, например (0x021B2D30), если аргумент не передан вызывающей функции. Пример «функция печати».
  • На вызывающей стороне это аргумент, а на стороне функции — параметр
  • Значение по умолчанию в аргументе — когда мы предоставляем только один аргумент при вызове функции умножения или любой другой функции, Python назначает другой аргумент по умолчанию
  • Python позволяет вам также изменить порядок аргументов

Руководство по функциям Python с примерами

Введение в функции в Python

Функция позволяет вам определять многократно используемый блок кода, который может выполняться много раз в вашей программе.

Функции позволяют создавать более модульные и СУХИЕ решения сложных проблем.

Хотя Python уже предоставляет множество встроенных функций, таких как print () и len () , вы также можете определить свои собственные функции для использования в ваших проектах.

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

Синтаксис

В Python определение функции имеет следующие особенности:

  1. Ключевое слово def
  2. имя функции
  3. paranthesis ‘()’ и в параметрах ввода paranthesis, хотя входные параметры по желанию.
  4. двоеточие ’:’
  5. некоторый блок кода для выполнения
  6. оператора возврата (необязательно)
  # функция без параметров или возвращаемых значений
def sayHello ():
  print ("Привет!")

sayHello () # вызывает функцию 'Hello!' выводится на консоль

# функция с параметром
def helloWithName (имя):
  print («Привет» + имя + «!»)

helloWithName ("Ada") # вызывает функцию 'Hello Ada!' выводится на консоль

# функция с несколькими параметрами с оператором возврата
def multiply (val1, val2):
  вернуть val1 * val2

multiply (3, 5) # выводит 15 на консоль  

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

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

Функция всегда возвращает значение. Ключевое слово return используется функцией для возврата значения. Если вы не хотите возвращать какое-либо значение, будет возвращено значение по умолчанию None .

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

  # это базовая функция суммы
def sum (a, b):
  вернуть a + b

результат = сумма (1, 2)
# result = 3  

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

  def sum (a, b = 3):
  вернуть a + b

результат = сумма (1)
# result = 4  

Параметры можно передавать в желаемом порядке, используя имя параметра.

  результат = сумма (b = 2, a = 2)
# result = 4  

Однако невозможно передать аргумент ключевого слова перед единицей без ключевого слова

  result = sum (3, b = 2)
#result = 5
результат2 = сумма (b = 2, 3)
# Будет вызывать SyntaxError  

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

  с = сумма
результат = s (1, 2)
# result = 3  

Примечания

Если определение функции включает параметры, вы должны указать такое же количество параметров при вызове функции.

  print (multiply (3)) # TypeError: multiply () принимает ровно 2 аргумента (задано 0)

print (multiply ('a', 5)) # 'aaaaa' выводится на консоль

print (multiply ('a', 'b')) # TypeError: Python не может умножить две строки  

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

  def myFunc ():
print ('это напечатает')
print ('так будет')

х = 7
# присвоение x не является частью функции, поскольку оно не имеет отступа  

Переменные, определенные в функции, существуют только в пределах этой функции.

  def double (число):
х = число * 2
вернуть х

print (x) # error - x не определен
print (double (4)) # печатает 8  

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

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

max () функция

max () — встроенная функция в Python 3.Он возвращает самый большой элемент в итерации или самый большой из двух или более аргументов.

Аргументы

Эта функция принимает в качестве аргумента два или более числа или любой итерируемый объект. Предоставляя итерацию в качестве аргумента, мы должны убедиться, что все элементы в итерации имеют один и тот же тип. Это означает, что мы не можем передать список, в котором хранятся как строковые, так и целочисленные значения. Синтаксис: max (iterable, * iterables [, key, default]) max (arg1, arg2, * args [, key])

Допустимые аргументы:

  max (2, 3)
макс ([1, 2, 3])
max ('a', 'b', 'c')  

Недействительные аргументы:

  max (2, 'a')
max ([1, 2, 3, 'a'])
max ([])  

Возвращаемое значение

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

Пример кода

  print (max (2, 3)) # Возвращает 3, поскольку 3 является наибольшим из двух значений
print (max (2, 3, 23)) # Возвращает 23, поскольку 23 - наибольшее из всех значений

list1 = [1, 2, 4, 5, 54]
print (max (list1)) # Возвращает 54, поскольку 54 - наибольшее значение в списке

list2 = ['a', 'b', 'c']
print (max (list2)) # Возвращает 'c', поскольку 'c' является самым большим в списке, потому что c имеет значение ascii больше, чем 'a', 'b'.list3 = [1, 2, 'abc', 'xyz']
print (max (list3)) # Выдает TypeError, поскольку значения в списке имеют другой тип

# Исправьте ошибку TypeError, упомянутую выше, прежде чем переходить к следующему шагу

list4 = []
print (max (list4)) # Выдает ValueError, поскольку аргумент пуст.  

Run Code

Official Docs

min () function

min () — встроенная функция в Python 3. Она возвращает наименьший элемент в итерации или наименьший из двух или более аргументов.

Аргументы

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

Допустимые аргументы:

  мин (2, 3)
мин ([1, 2, 3])
min ('a', 'b', 'c')  

Недействительные аргументы:

  min (2, 'a')
min ([1, 2, 3, 'a'])
min ([])  

Возвращаемое значение

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

Пример кода

  print (min (2, 3)) # Возвращает 2, поскольку 2 является наименьшим из двух значений
print (min (2, 3, -1)) # Возвращает -1, поскольку -1 - наименьшее из двух значений

list1 = [1, 2, 4, 5, -54]
print (min (list1)) # Возвращает -54, поскольку -54 - наименьшее значение в списке

list2 = ['a', 'b', 'c']
print (min (list2)) # Возвращает 'a', поскольку 'a' является наименьшим в списке в алфавитном порядке

list3 = [1, 2, 'abc', 'xyz']
print (min (list3)) # Выдает TypeError, поскольку значения в списке имеют другой тип

# Исправьте ошибку TypeError, упомянутую выше, прежде чем переходить к следующему шагу

list4 = []
print (min (list4)) # Выдает ValueError, поскольку аргумент пуст.  

Run Code

Official Docs

divmod () — встроенная функция в Python 3, которая возвращает частное и остаток при делении номер а по номеру б .В качестве аргументов он принимает два числа: , и , . Аргумент не может быть комплексным числом.

Аргумент

Требуется два аргумента: a и b — целое или десятичное число. Оно не может быть комплексным числом.

Возвращаемое значение

Возвращаемое значение будет парой положительных чисел, состоящей из частного и остатка, полученных путем деления a на b . В случае смешанных типов операндов будут применяться правила для бинарных арифметических операторов.
Для Целочисленные аргументы возвращаемое значение будет таким же, как (a // b, a% b) .
Для Decimal number arguments , возвращаемое значение будет таким же, как (q, a% b) , где q обычно равно math.floor (a / b) , но может быть на 1 меньше, чем что.

Пример кода

  print (divmod (5,2)) # prints (2,1)
print (divmod (13.5,2.5)) # выводит (5.0, 1.0)
q, r = divmod (13.5,2.5) # Назначает q = частное & r = остаток
print (q) # печатает 5.0, потому что math.floor (13,5 / 2,5) = 5,0
print (r) # выводит 1.0, потому что (13.5% 2.5) = 1.0  

REPL It!

Official Docs

Hex (x) function

hex (x) — это встроенная функция в Python 3 для преобразования целого числа в строчную шестнадцатеричную строку с префиксом «0x».

Аргумент

Эта функция принимает один аргумент x , который должен быть целочисленного типа.

Return

Эта функция возвращает шестнадцатеричную строку в нижнем регистре с префиксом «0x».

Пример

  print (hex (16)) # выводит 0x10
print (hex (-298)) # выводит -0x12a
print (hex (543)) # печатает 0x21f  

Код выполнения

Официальная документация

Функция len ()

len () является встроенной функцией в Python 3. Этот метод возвращает длину (число пунктов) объекта. Требуется один аргумент x .

Аргументы

Требуется один аргумент, x . Этот аргумент может быть последовательностью (например, строкой, байтами, кортежем, списком или диапазоном) или коллекцией (например, словарем, набором или замороженным набором).

Возвращаемое значение

Эта функция возвращает количество элементов в аргументе, который передается в функцию len () .

Пример кода

  list1 = [123, 'xyz', 'zara'] # list
print (len (list1)) # выводит 3, поскольку в списке 3 элемента

str1 = 'баскетбол' # строка
print (len (str1)) # выводит 10, поскольку str1 состоит из 10 символов

tuple1 = (2, 3, 4, 5) # кортеж
print (len (tuple1)) # печатает 4, так как в кортеже 4 элемента

dict1 = {'name': 'John', 'age': 4, 'score': 45} # словарь
print (len (dict1)) # печатает 3, поскольку в dict1 есть 3 пары ключей и значений  

Run Code

Official Docs

Ord function

ord () — встроенная функция в Python 3 для преобразования строки, представляющей один символ Unicode, в целое число, представляющее код Unicode символа.

Примеры:

  >>> ord ('d')
100
>>> ord ('1')
49  

chr function

chr () — это встроенная функция в Python 3 для преобразования целого числа, представляющего код Unicode, в строку, представляющую соответствующий символ.

Примеры:

  >>> chr (49)
'1'  

Следует отметить, что, если целочисленное значение, переданное в chr () , выходит за пределы допустимого диапазона, возникает ошибка ValueError.

  >>> chr (-10)
'Traceback (последний вызов последний):
  Файл "", строка 1, в 
    chr (-1)
ValueError: chr () arg not in range (0x110000) ' 

input () functions

Часто в программе нам нужен ввод данных от пользователя. Получение информации от пользователя делает программу интерактивной. В Python 3 для приема ввода от пользователя у нас есть функция input () . Если вызывается функция ввода, выполнение программы будет остановлено до тех пор, пока пользователь не введет ввод и не завершит ввод с помощью клавиши возврата.Давайте посмотрим на несколько примеров:

Когда мы просто хотим принять ввод:

inp = input ()

Код запуска

Чтобы дать подсказку с сообщением:

prompt with message = input (»)

Код запуска

3. Если мы хотим ввести целочисленный ввод:

  число = int (ввод ('Введите число:'))  

Код запуска

Если вы вводите нецелое значение, тогда Python выдаст ошибку ValueError . Поэтому всякий раз, когда вы используете это, убедитесь, что вы тоже его поймали. В противном случае ваша программа неожиданно остановится после запроса.

  число = int (input ('Пожалуйста, введите число:'))
# Пожалуйста, введите число: как
# Введите строку, и она выдаст эту ошибку
# ValueError: недопустимый литерал для int () с основанием 10 'как'  

4. Если нам нужен строковый ввод:

  string = str (input ('Пожалуйста, введите строку:'))  

Run Code

Тем не менее, входные данные по умолчанию сохраняются в виде строки.Использование функции str () дает понять читателю кода, что ввод будет «строкой». Рекомендуется заранее указать, какой тип ввода будет сделан.

Официальная документация

Как вызвать функцию в Python

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

  >>> def say_hello ():
... print ('Привет')
...
>>> say_hello ()
Привет  

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

  >>> а = 1
>>> b = 10
>>> def fn ():
... print (a) # local a не назначено, включающая функция не указана, глобальный a не указан.
... b = 20 # локальный b назначается в локальной таблице символов для функции.
... print (b) # ссылка на локальный b.
...
>>> fn ()
1
20
>>> b # global b не изменяется при вызове функции.
10  

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

  >>> def greet (s):
... s = "Hello" + s # s в локальной таблице символов переназначены.
... печать (и)
...
>>> person = "Боб"
>>> приветствую (человек)
Привет Боб
>>> person # человек, которого раньше звонил, остается привязанным к исходному объекту, 'Bob'.
'Bob'  

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

  >>> def fn (arg):
... arg.append (1)
...
>>> a = [1, 2, 3]
>>> fn (a)
>>> а
[1, 2, 3, 1]  

функций Python — работа с функциями в Python

СОДЕРЖАНИЕ
Предыдущий
Следующий

последнее изменение 6 июля 2020 г.

В этой части руководства по программированию на Python мы рассмотрим функции на Python.

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

Функция — это блок многократно используемого кода, который используется для выполнения
конкретное действие. Преимущества использования функций:

  • Уменьшение дублирования кода
  • Разложение сложных проблем на более простые
  • Повышение четкости кода
  • Повторное использование кода
  • Скрытие информации

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

Типы функций Python

Есть два основных типа функций: встроенные функции и пользовательские.
определенные функции. Встроенные функции являются частью языка Python;
например dir () , len () или abs () .
Пользовательские функции — это функции, созданные с помощью ключевого слова def .

Функции создания Python

Функция создается с ключевым словом def . В
Операторы в блоке функции должны иметь отступ.

функция def ():
    проходить
 

За ключевым словом def следует имя функции в круглых скобках и
двоеточие. Операторы с отступом образуют тело функции.

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

myfunc ()
 

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

рет.py

#! / usr / bin / env python

"" "
Скрипт ret.py показывает, как работать с
функции в Python.
Автор: Ян Боднар
ZetCode, 2019
"" "


def show_module_name ():

    печать (__ doc__)


def get_module_file ():

    вернуть __file__


a = имя_показа_модуля ()
б = get_module_file ()

печать (а, б)
 

Строка в верхней части скрипта называется строкой документации.Он документирует текущий сценарий. Файл, в который мы помещаем код Python
называется модулем .

Мы определяем две функции. Первая функция печатает документацию модуля
нить. Второй возвращает путь к модулю. Функция может или
не может возвращать значение. Если функция не возвращает значение, она
неявно возвращает Нет . Модель __doc__
и __file__ — специальные атрибуты состояния.
Обратите внимание, что с обеих сторон атрибута есть два символа подчеркивания.

$ ./ret.py

Скрипт ret.py показывает, как работать с
функции в Python.
Автор: Ян Боднар
ZetCode, 2019

Нет C: /Users/Jano/PycharmProjects/Simple/simple.py
 

Это результат работы программы.

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

func_prec.py

#! / usr / bin / env python

# func_prec.py


def f1 ():
    print ("f1 ()")


f1 ()
# f2 ()


def f2 ():
    print ("f2 ()")
 

В приведенном выше примере у нас есть два определения функций.Прокомментирована одна строка. Вызов функции не может опережать
определение.

# f2 ()


def f2 ():
    print ("f2 ()")
 

Мы можем назвать f2 () только после его определения. Раскомментировать
в строке мы получаем NameError .

Где определять функции

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

defining.py

#! / usr / bin / env python

# определение.ру


class Some ():

    @staticmethod
    def f ():
        print ("метод f ()")


def f ():
    print ("функция f ()")


def g ():
    def f ():
        print ("внутренняя функция f ()")
    f ()


Some.f ()
f ()
грамм()
 

В этом примере мы определяем функцию f () в трех разных
места.

# defining.py

class Some ():

    @staticmethod
    def f ():
        print ("метод f ()")
 

Статический метод определяется с помощью декоратора в классе Some .

def f ():
    print ("функция f ()")
 

Функция определена в модуле.

def g ():
    def f ():
        print ("внутренняя функция f ()")
    f ()
 

Здесь функция f () определена внутри другого g ()
функция. Это внутренняя функция.

Some.f ()
f ()
грамм()
 

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

$ ./defining.py
f () метод
f () функция
f () внутренняя функция
 

Это результат.

Функции Python являются объектами

Функции в Python — это объекты. Им можно манипулировать, как и другими объектами.
в Python. Поэтому функции называются первоклассными гражданами. Это не
true для других языков ООП, таких как Java или C #.

fun_obj.py

#! / usr / bin / env python

# fun_obj.py


def f ():
    "" "Эта функция печатает сообщение" ""

    print («Сегодня пасмурный день»)


print (isinstance (f, объект))
печать (id (f))

печать (ф.__doc__)
print (f .__ name__)
 

В этом скрипте мы показываем, что наша функция тоже является объектом.

def f ():
    "" "Эта функция печатает сообщение" ""

    print («Сегодня пасмурный день»)
 

Мы определяем функцию f () . Он выводит сообщение на консоль. Это также
имеет строку документации.

print (isinstance (f, объект))
 

Функция isinstance () проверяет, работает ли функция f ()
является экземпляром объекта .Все объекты в Python наследуются
из этой базовой сущности.

печать (id (f))
 

Каждый объект в Python имеет уникальный идентификатор. Функция id () возвращает
идентификатор объекта.

печать (f .__ doc__)
print (f .__ name__)
 

Объекты могут иметь атрибуты; печатаем два атрибута функции: __doc__
и __name__ .

$ ./fun_obj.py
Правда
140353774014536
Эта функция печатает сообщение
ж
 

Это результат работы программы.

Функции можно хранить в коллекциях и передавать другим функциям.

fun_coll.py

#! / usr / bin / env python

# fun_coll.py


def f ():
    проходить


def g ():
    проходить


def h (f):
    печать (id (f))


а = (е, г, з)

для я в:
    печать (я)

h (f)
ч (г)
 

Мы определяем три функции. Мы помещаем их в кортеж и передаем функции.

а = (е, г, з)

для я в:
    печать (я)
 

Мы помещаем три функциональных объекта в кортеж и просматриваем его с помощью цикла for.

h (f)
ч (г)
 

Мы передаем функции f () и g () в
ч () функция.

$ ./fun_coll.py
<функция f в 0x0000015B998E9D08>
<функция g в 0x0000015B998E9E18>
<функция h в 0x0000015B998E9840>
14

2
14

4

Это результат работы программы fun_coll.py .

Три вида функций в Python

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

three_kinds.py

#! / usr / bin / env python

из математического импорта sqrt


def cube (x):
    вернуть x * x * x


печать (абс (-1))
печать (куб (9))
печать (sqrt (81))
 

В приведенном выше коде присутствуют три вида функций.

из математического импорта sqrt
 

Функция sqrt () импортируется из математического модуля.

def cube (x):
    вернуть x * x * x
 

Функция cube () - это функция, определяемая пользователем.

печать (абс (-1))
 

Функция abs () является встроенной функцией.
доступный. Это часть ядра языка.

Ключевое слово возврата Python

Функция создается для выполнения конкретной задачи. Часто там
является результатом такой задачи. Ключевое слово return :
используется для возврата значений из функции. Функция может возвращать или не возвращать значение.Если функция не имеет ключевого слова return, она отправит None .

Return.py

#! / usr / bin / env python

# return.py


def show_message (сообщение):
    печать (сообщение)


def cube (x):
    вернуть x * x * x


х = куб (3)
печать (х)

show_message ("Вычисление завершено.")
print (show_message ("Готово."))
 

У нас есть две определенные функции. Один использует возврат
ключевое слово, другое - нет.

def show_message (сообщение):
    печать (сообщение)
 

Функция show_message () не возвращает значение явно.Это
показывает сообщение на консоли.

def cube (x):
    вернуть x * x * x
 

Функция cube () вычисляет выражение и возвращает его результат.
с ключевым словом return .

х = куб (3)
 

В этой строке мы вызываем функцию cube () . Результат
вычисление функции cube () возвращается и назначается
в переменную x . Теперь он содержит значение результата.

show_message ("Вычисление завершено.")
 

Мы вызываем функцию show_message () с сообщением в качестве параметра.
Сообщение выводится на консоль. Мы не ожидаем выгоды от
эта функция.

print (show_message ("Готово."))
 

Этот код создает две строки. Один - это сообщение, напечатанное функцией show_message () .
функция. Другой - это значение None , которое неявно отправляется.
функциями без оператора return .

$. / возврат.ру
27
Расчет завершен.
Готовый.
Никто
 

Это пример вывода.

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

return2.py

#! / usr / bin / env python

# return2.py

n = [1, 2, 3, 4, 5]


def stats (x):

    _mx = макс (х)
    _mn = min (x)
    _ln = len (x)
    _sm = сумма (х)

    возврат _mx, _mn, _ln, _sm


mx, mn, ln, sm = статистика (n)
печать (статистика (n))

печать (mx, mn, ln, sm)
 

Есть определение функции stats () .Эта функция
возвращает четыре значения.

возврат _mx, _mn, _ln, _sm
 

Ключевое слово return возвращает четыре числа. В
числа разделены запятой. Фактически мы отправили
кортеж, содержащий эти четыре значения. Мы также можем вернуть список
вместо кортежа.

mx, mn, ln, sm = статистика (n)
 

Возвращенные значения присваиваются локальным переменным.

$ ./returning2.py
(5, 1, 5, 15)
5 1 5 15
 

Это результат.

Переопределение функции Python

Python по своей природе динамичен. Можно переопределить уже
определенная функция.

redefinition.py

#! / usr / bin / env python

# redefinition.py

from time import gmtime, strftime


def show_message (сообщение):
    печать (сообщение)


show_message ("Готово.")


def show_message (сообщение):
    print (strftime ("% H:% M:% S", gmtime ()))
    печать (сообщение)


show_message ("Обработка.")
 

Мы определяем функцию show_message () .Позже мы представим новый
определение той же функции.

from time import gmtime, strftime
 

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

def show_message (сообщение):
    печать (сообщение)
 

Это первое определение функции. Он только печатает сообщение
к консоли.

def show_message (сообщение):
    print (strftime ("% H:% M:% S", gmtime ()))
    печать (сообщение)
 

Позже в исходном коде мы установили новое определение showMessage () .
функция.Сообщению предшествует отметка времени.

$ ./redefinition.py
Готовый.
23:49:33 Обработка.
 

Это результат.

Аргументы функции Python

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

fahrenheit.py

#! / usr / bin / env python

# fahrenheit.py


def C2F (c):
    возврат c * 9/5 + 32


печать (C2F (100))
печать (C2F (0))
печать (C2F (30))
 

В нашем примере мы переводим температуру по Цельсию в градусы Фаренгейта.Функция C2F () принимает один аргумент c, который является
Температура по Цельсию.

$ ./fahrenheit.py
212
32
86
 

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

fun_implicit.py

#! / usr / bin / env python

# fun_implicit.py


def power (x, y = 2):

    г = 1

    для i в диапазоне (y):
        г = г * х

    вернуть г


печать (мощность (3))
печать (мощность (3, 3))
печать (мощность (5, 5))
 

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

$ ./fun_implicit.py
9
27
3125
 

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

fun_keywords.py

#! / usr / bin / env python

# fun_keywords.py

def display (имя, возраст, пол):

    print ("Имя:", имя)
    print ("Возраст:", возраст)
    print ("Секс:", секс)


дисплей («Лары», 43, «М»)
дисплей («Жанна», 24, «Ж»)
 

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

$ ./fun_keywords.py
Имя: Лари
Возраст: 43 года
Пол: M
Имя: Джоан
Возраст: 24
Пол: Ж
 

fun_keywords2.py

#! / usr / bin / env python

# fun_keywords2.py


def display (имя, возраст, пол):

    print ("Имя:", имя)
    print ("Возраст:", возраст)
    print ("Секс:", секс)


дисплей (возраст = 43, name = "Lary", sex = "M")
display (name = "Joan", age = 24, sex = "F")
 

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

display ("Joan", sex = "F", age = 24)
 

Это законная конструкция.Аргумент без ключевого слова может быть
за которым следуют аргументы ключевого слова.

display (age = 24, name = "Joan", "F")
 

Это закончится синтаксической ошибкой. Аргумент без ключевого слова
может не следовать за аргументами ключевого слова.

Функции в Python могут принимать произвольное количество аргументов.

random_args.py

#! / usr / bin / env python

# random_args.py


def do_sum (* аргументы):
    "" "Функция возвращает сумму
всех значений "" "

    г = 0

    для i в аргументах:
        г + = я

    вернуть г


печать (do_sum.__doc__)
печать (do_sum (1, 2, 3))
печать (do_sum (1, 2, 3, 4, 5))
 

Мы используем оператор * , чтобы указать, что функция принимает
произвольное количество аргументов. Функция do_sum () возвращает
сумма всех аргументов. Первая строка в теле функции называется
строка документации функции. Он используется для документирования функции.
Строка должна быть заключена в тройные кавычки.

$ ./arbitrary_args.py
Функция возвращает сумму
всех ценностей
6
15
 

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

details.py

#! / usr / bin / env python

# details.py


def display (** подробности):

    для i в деталях:
        print (f "{i}: {подробности [i]}")


display (name = "Larry", age = 43, sex = "M")
 

Этот пример демонстрирует такой случай. Мы можем предоставить произвольное количество
аргументы ключ-значение. Функция обработает их все.

$./details.py
возраст: 43
имя: Ларри
пол: M
 

Python передает параметры по ссылке

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

pass_by_reference.py

#! / usr / bin / env python

# pass_by_reference.ру

n = [1, 2, 3, 4, 5]

print ("Исходный список:", n)


def f (x):

    x.pop ()
    x.pop ()
    x.insert (0, 0)
    print ("Внутри f ():", x)


f (n)

print ("После вызова функции:", n)
 

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

def f (x):

    x.pop ()
    x.pop ()
    x.insert (0, 0)
    print ("Внутри f ():", x)
 

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

$ ./passing_by_reference.py
Исходный список: [1, 2, 3, 4, 5]
Внутри f (): [0, 1, 2, 3]
После вызова функции: [0, 1, 2, 3]
 

После того, как список был изменен, он был изменен навсегда.

Глобальные и локальные переменные Python

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

local_variable.py

#! / usr / bin / env python

# local_variable.ру

name = "Джек"


def f ():
    name = "Роберт"
    print ("Внутри функции", имя)


print ("Внешняя функция", имя)
f ()
 

Переменная, определенная в теле функции, имеет локальную область . это
действует только в теле функции.

$ ./local_variable.py
Внешняя функция Джек
В рамках функции Роберт
 

Это пример вывода.

global_variable.py

#! / usr / bin / env python

# global_variable.py

name = "Джек"


def f ():
    print ("Внутри функции", имя)


print ("Внешняя функция", имя)
f ()
 

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

$ ./global_variable.py
Внешняя функция Джек
Внутри функции Джек
 

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

global_variable2.py

#! / usr / bin / env python

# global_variable2.py

name = "Джек"


def f ():

    глобальное имя
    name = "Роберт"
    print ("Внутри функции", имя)


print ("Внешняя функция", имя)
f ()
print ("Внешняя функция", имя)
 

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

глобальное имя
name = "Роберт"
 

Используя ключевое слово global , мы ссылаемся на переменную
определены вне тела функции. Переменной присваивается
новое значение.

$ ./global_variable2.py
Внешняя функция Джек
В рамках функции Роберт
Вне функции Роберт
 

Анонимные функции Python

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

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

lambda_fun.py

#! / usr / bin / env python

# lambda_fun.py

у = 6

z = лямбда x: x * y
печать (z (8))
 

Это небольшой пример лямбда-функции.

z = лямбда x: x * y
 

Ключевое слово lambda создает анонимную функцию. Размер x
- параметр, который передается лямбда-функции. Параметр
за которым следует символ двоеточия. Код рядом с двоеточием:
выражение, которое выполняется при вызове лямбда-функции.
Лямбда-функция присваивается переменной z .

печать (z (8))
 

Лямбда-функция выполняется. Число 8 передается анонимному
функция и возвращает 48 в качестве результата.Обратите внимание, что z не
имя для этой функции. Это только переменная, к которой анонимная функция
был назначен.

$ ./lambda_fun.py
48
 

Это результат примера.

Лямбда-функцию можно элегантно использовать с другими функциями.
части языка Python, например map () или filter ()
функции.

lambda_fun2.py

#! / usr / bin / env python

# lambda_fun2.py

cs = [-10, 0, 15, 30, 40]

ft = map (лямбда t: (9.0/5) * t + 32, cs)
печать (список (футы))
 

В этом примере у нас есть список температур по Цельсию. Создаем новый
список, содержащий температуры в градусах Фаренгейта.

ft = map (лямбда t: (9.0 / 5) * t + 32, cs)
 

Функция map () применяет анонимную функцию
к каждому элементу списка cs . Он возвращает итерацию из
вычисленные температуры по Фаренгейту.

$ ./lambda_fun2.py
[14.0, 32.0, 59.0, 86.0, 104.0]
 

Это пример вывода.

Эта глава была о функциях в Python.

СОДЕРЖАНИЕ
Предыдущий
Следующий
Документация

Learning with Python 2nd Edition

3.1. Определения и использование

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

 def НАЗВАНИЕ (СПИСОК ПАРАМЕТРОВ):
    ЗАЯВЛЕНИЯ
 

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

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

  1. Заголовок , который начинается с ключевого слова и заканчивается двоеточием.
  2. Тело , состоящее из одного или нескольких операторов Python, каждый
    с отступом такое же количество - 4 пробела - это стандарт Python - от
    заголовок.

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

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

 def new_line ():
    print # оператор печати без аргументов печатает новую строку
 

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

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

 печать «Первая линия».
новая линия()
напечатайте «Вторая строка».
 

Результат этой программы:

Дополнительный пробел между двумя строками является результатом new_line ()
вызов функции. Что, если бы нам нужно было больше места между строками? Мы могли позвонить
та же функция повторно:

 печать "Первая строка."
новая линия()
новая линия()
новая линия()
напечатайте «Вторая строка».
 

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

 def three_lines ():
    новая линия()
    новая линия()
    новая линия()

напечатайте «Первая строка».
three_lines ()
напечатайте «Вторая строка».
 

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

Вы должны обратить внимание на эту программу:

  • Вы можете повторно вызывать одну и ту же процедуру.На самом деле это довольно часто и
    полезно это сделать.
  • Вы можете заставить одну функцию вызывать другую функцию; в этом случае three_lines
    вызывает new_line.

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

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

Объединение фрагментов кода из предыдущего раздела в скрипт
с именем tryme1.py вся программа выглядит так:

 def new_line ():
    Распечатать

def three_lines ():
    новая линия()
    новая линия()
    новая линия()

напечатайте «Первая строка».
three_lines ()
печать "Вторая строка."
 

Эта программа содержит два определения функций: new_line и
три_строчки. Определения функций выполняются так же, как и другие операторы,
но в результате создается новая функция. Заявления внутри
функция не выполняется до тех пор, пока функция не будет вызвана, а функция
определение не генерирует вывода.

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

3.2. Ход выполнения

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

Выполнение всегда начинается с первого оператора программы. Заявления
выполняется по одному, в порядке сверху вниз.

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

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

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

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

Какова мораль этой грязной сказки? Когда вы читаете программу, не читайте
сверху вниз.Вместо этого следите за ходом выполнения.

3.3. Параметры, аргументы и оператор импорта

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

 >>> абс (5)
5
>>> абс (-5)
5
 

В этом примере аргументы функции abs - 5 и -5.

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

 >>> pow (2, 3)
8
>>> pow (7, 4)
2401
 

Другая встроенная функция, которая принимает более одного аргумента, - max.

 >>> макс (7, 11)
11
>>> макс (4, 1, 17, 2, 12)
17
>>> макс (3 * 11, 5 ** 3, 512 - 9, 1024 ** 0)
503
 

max может быть отправлено любое количество аргументов, разделенных запятыми, и будет
вернуть максимальное отправленное значение.Аргументы могут быть простыми значениями или
выражения. В последнем примере возвращается 503, поскольку оно больше 33,
125 и 1.

Вот пример пользовательской функции с параметром:

 def print_twice (параметр):
    параметр печати, параметр
 

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

Интерактивная оболочка Python предоставляет нам удобный способ тестирования наших
функции. Мы можем использовать оператор import , чтобы вывести функции, которые у нас есть
определены в сценарии в сеанс интерпретатора. Чтобы увидеть, как это работает, предположим
функция print_twice определена в скрипте chap03.ру. Мы можем
теперь протестируйте его в интерактивном режиме, импортировав в наш сеанс оболочки Python:

 >>> из импорта chap03 *
>>> print_twice ('Спам')
Спам Спам
>>> print_twice (5)
5 5
>>> print_twice (3.14159)
3,14159 3,14159
 

При вызове функции значение аргумента присваивается соответствующему
параметр в определении функции. Фактически, это если param = 'Spam'
выполняется при вызове print_twice ('Spam'), param = 5 в
print_twice (5) и param = 3.14159 в print_twice (3.14159).

Любой тип аргумента, который может быть напечатан, может быть отправлен в print_twice.
первый вызов функции, аргумент - строка. Во втором - целое число.
В третьем - поплавок.

Как и для встроенных функций, мы можем использовать выражение в качестве аргумента для
print_twice:

 >>> print_twice ('Спам' * 4)
СпамСпамСпамСпам СпамСпамСпамСпам
 

«Спам» * 4 сначала оценивается как «SpamSpamSpamSpam», а затем
передается как аргумент print_twice.

3,4. Композиция

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

 >>> print_twice (абс (-7))
7 7
>>> print_twice (макс (3, 1, абс (-11), 7))
11 11
 

В первом примере abs (-7) оценивается как 7, которое затем становится
аргумент print_twice. Во втором примере у нас есть два уровня
состав, так как abs (-11) сначала оценивается как 11 перед max (3,
1, 11, 7) оценивается как 11, а print_twice (11) затем отображает
результат.

Мы также можем использовать переменную в качестве аргумента:

 >>> sval = 'Эрик, половинка пчелы.'
>>> print_twice (свал)
Эрик, наполовину пчела. Эрик, наполовину пчела.
 

Обратите внимание на кое-что очень важное. Имя переменной, которую мы передаем как
аргумент (sval) не имеет ничего общего с именем параметра
(параметр). Опять же, как будто param = sval выполняется, когда
print_twice (sval) вызывается. Неважно, какое значение было названо в
вызывающий, в print_twice его имя - param.

3,5. Переменные и параметры локальные

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

 def cat_twice (часть1, часть2):
    кошка = часть1 + часть2
    print_twice (кошка)
 

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

 >>> chant1 = "Доминирующий пирог,"
>>> chant2 = "Dona eis Requiem."
>>> cat_twice (chant1, chant2)
Pie Jesu domine, Dona eis Requiem. Pie Jesu domine, Dona eis Requiem.
 

Когда cat_twice завершается, переменная cat уничтожается. Если мы
пытаемся распечатать, получаем ошибку:

 >>> печать кота
NameError: имя 'кошка' не определено
 

Параметры также локальные. Например, вне функции print_twice,
не существует такой вещи, как param. Если вы попытаетесь его использовать, Python будет
жаловаться.

3,6. Диаграммы стека

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

Каждая функция представлена ​​кадром . Рамка - это коробка с названием
функция рядом с ним и параметры и переменные функции внутри
Это. Диаграмма стека для предыдущего примера выглядит так:

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

Каждый параметр ссылается на то же значение, что и соответствующий ему аргумент. Так,
part1 имеет то же значение, что и chant1, part2 имеет то же значение, что и
chant2, а param имеет то же значение, что и cat.

Если во время вызова функции возникает ошибка, Python печатает имя
функции, и имя функции, которая ее вызвала, и имя
функция, которая вызвала , что , вплоть до самой верхней функции.

Чтобы увидеть, как это работает, создайте сценарий Python с именем tryme2.py, который выглядит
как это:

 def print_twice (параметр):
    параметр печати, параметр
    печать кота

def cat_twice (часть1, часть2):
    кошка = часть1 + часть2
    print_twice (кошка)

chant1 = "Пирог Jesu domine,"
chant2 = "Dona eis Requim."
cat_twice (chant1, chant2)
 

Мы добавили оператор print cat внутри функции print_twice,
но кот там не определен. Запуск этого скрипта приведет к ошибке
сообщение вроде этого:

 Traceback (самый внутренний последний):
  Файл "tryme2.py ", строка 11, в 
    cat_twice (chant1, chant2)
  Файл "tryme2.py", строка 7, в cat_twice
    print_twice (кошка)
  Файл "tryme2.py", строка 3, в print_twice
    печать кота
NameError: глобальное имя cat не определено
 

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

Обратите внимание на сходство между трассировкой и диаграммой стека.Это не
совпадение. Фактически, еще одно распространенное название трассировки - это трассировка стека .

3,7. Глоссарий

аргумент
Значение, передаваемое функции при ее вызове. Это значение
присваивается соответствующему параметру в функции.
кузов
Вторая часть составного отчета. Тело состоит из
последовательность операторов с одинаковым отступом с самого начала
заголовка. Стандартный размер отступа, используемый в
Сообщество Python - это 4 пробела.
составной отчет

Выписка, состоящая из двух частей:

  1. заголовок - который начинается с ключевого слова, определяющего инструкцию
    введите и заканчивается двоеточием.
  2. body - содержит одно или несколько операторов с одинаковым отступом
    из шапки.

Синтаксис составного оператора выглядит следующим образом:

 ключевое слово выражение:
    утверждение
    утверждение ...
 
поток исполнения
Порядок, в котором операторы выполняются во время выполнения программы.
рамка
Поле на диаграмме стека, представляющее вызов функции. Это содержит
локальные переменные и параметры функции.
функция
Именованная последовательность операторов, выполняющая некоторые полезные операции.
Функции могут принимать или не принимать параметры, а также могут создавать или не создавать
результат.
вызов функции
Оператор, выполняющий функцию. Он состоит из названия
функция, за которой следует список аргументов, заключенный в круглые скобки.
функциональная композиция
Использование выходных данных одного вызова функции в качестве входных данных для другого.
определение функции
Оператор, который создает новую функцию с указанием ее имени,
параметры и операторы, которые он выполняет.
Первая часть составного отчета. Заголовки начинаются с ключевого слова и
заканчиваться двоеточием (:)
импорт

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

 def print_thrice (вещь):
    печать вещь, вещь, вещь

n = 42
s = "А теперь совсем другое ..."
 

Теперь запустите оболочку python из того же каталога, в котором
tryme.py находится:

 $ ls
tryme.py
$ питон
>>>
 

В tryme.py определены три имени: print_thrice, n и
с. Если мы попытаемся получить доступ к любому из них в оболочке без предварительного
при импорте получаем ошибку:

 >>> п
Отслеживание (последний вызов последний):
  Файл "", строка 1, в 
NameError: имя 'n' не определено
>>> print_thrice ("ай!")
Отслеживание (последний вызов последний):
  Файл "", строка 1, в 
NameError: имя print_thrice не определено
 

Если импортировать все из tryme.py, однако мы можем использовать
все, что в нем определено:

 >>> из импорта tryme *
>>> п
42
>>> с
'А сейчас нечто соверешнно другое...'
>>> print_thrice ("Ура!")
Ура! Ура! Ура!
>>>
 

Обратите внимание, что вы не включаете .py из имени сценария в
заявление об импорте.

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

3.8. Упражнения

  1. С помощью текстового редактора создайте сценарий Python с именем tryme3.ру. Напиши
    функция в этом файле с именем nine_lines, которая использует three_lines для
    выведите девять пустых строк. Теперь добавьте функцию с именем clear_screen, которая
    печатает двадцать пять пустых строк. Последняя строка вашей программы должна быть
    вызов для clear_screen.

  2. Переместите последнюю строку tryme3.py в начало программы, чтобы
    Вызов функции для clear_screen появляется перед функцией
    определение
    . Запустите программу и запишите, какое сообщение об ошибке вы получите.Жестяная банка
    вы устанавливаете правило об определениях функций и вызовы функций , которые
    описывает, где они могут появиться относительно друг друга в программе?

  3. Начиная с рабочей версии tryme3.py, переместите определение
    new_line после определения three_lines. Запишите, что происходит
    при запуске этой программы. Теперь переместите определение new_line под
    вызов three_lines (). Объясните, как это пример правила, которое вы
    заявлено в предыдущем упражнении.

  4. Заполните тело определения функции для cat_n_times, чтобы
    он напечатает строку s, n раз:

     def cat_n_times (s, n):
        <введите здесь свой код>
     

    Сохраните эту функцию в скрипте с именем import_test.py. Теперь в unix
    убедитесь, что вы находитесь в том же каталоге, где находится
    import_test.py находится (ls должен показать import_test.py).
    Запустите оболочку Python и попробуйте следующее:

     >>> из import_test import *
    >>> cat_n_times ('Спам', 7)
    СпамСпамСпамСпамСпамСпамСпам
     

    Если все в порядке, ваша сессия должна работать так же, как и эта.Эксперимент
    с другими вызовами cat_n_times, пока вы не почувствуете себя комфортно
    работает.

Функции Python - GeeksforGeeks

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

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

Внимание компьютерщик! Укрепите свои основы с помощью курса Python Programming Foundation и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS . И чтобы начать свое путешествие по машинному обучению, присоединяйтесь к Машинное обучение - курс базового уровня

Синтаксис:

 def имя_функции (параметры):
    "" "строка документации" ""
    заявления)
    return expression 

Создание функции

Мы можем создать функцию Python, используя ключевое слово def .

Пример: функция создания Python

Python3

922

def fun ():

print ( «Добро пожаловать в GFG» )

83

Вызов функции

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

Пример: функция вызова Python

Python3

def fun ():

print ( «Добро пожаловать в GFG» )

fun ()

Аргументы функции

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

Пример: функция Python с аргументами

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

Python3

def evenOdd (x):

if (x % 2 = = = = ):

печать ( «четный» )

еще :

печать ( «нечетный» )

evenOdd ( 2 )

evenOdd ( 3 )

Типы аргументов

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

Аргументы по умолчанию

Аргумент по умолчанию - это параметр, который принимает значение по умолчанию, если значение не указано в вызове функции для этого аргумента. В следующем примере показаны аргументы по умолчанию.

Python3

Выход

9

def myFun (x, y = 50 ):

print ( "x , x)

печать ( "y:" , y)

myFun ( 10 )

90

 ('x:', 10)
('y:', 50) 

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

Аргументы ключевого слова

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

Python3

def студент (имя, фамилия):

печать (имя, фамилия)

студент (имя ) студент (имя ) «Гики» , фамилия = «Практика» )

студент (фамилия = «Практика» , имя = «Вундеркинды» )

Выход

 («Компьютерщики», «Практика»)
(«Гики», «Практика») 

Аргументы переменной длины

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

  • * args (аргументы, не связанные с ключевыми словами)
  • ** kwargs (аргументы ключевых слов)

Пример 1: Аргумент без ключевых слов переменной длины

Python

def myFun ( * argv):

для arg дюйм argv:

print (arg) 9

myFun ( 'Hello' , 'Welcome' , 'to' , 'GeeksforGeeks' )

Выход

 Hello
Добро пожаловать
к
GeeksforGeeks 

Пример 2: аргументы ключевого слова переменной длины

Python3

def myFun ( * * kwargs3) 9: 9000 kwargs3 Ключ , значение в кваргов.items ():

печать ( "% s ==% s" % (ключ, значение))

myFun (первый = "Компьютерщики" , середина = "для" , последний = "Компьютерщики" )

Вывод

 первый == Компьютерщики
mid == для
last == Гики
 

Строка документа

Первая строка после функции называется Строкой документа или коротко Строкой документа.Это используется для описания функциональности функции. Использование строки документации в функциях необязательно, но считается хорошей практикой.

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

  Синтаксис:  print (имя_функции .__ doc__) 

Пример: добавление строки документации к функции

Python3

204

def evenOdd (x):

if (x % 2 = = 0 ):

печать ( «четный» )

еще :

печать ( «нечетный» )

печать (evenOdd.__doc__)

Выход

 Функция проверки четности или нечетности числа
 

Оператор возврата

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

  Синтаксис:  return [список_выражений] 

Оператор return может состоять из переменной, выражения или константы, которая возвращается в конце выполнения функции.Если ничего из вышеперечисленного не присутствует с оператором return, возвращается объект None.

Пример: Заявление о возврате функции Python

Python3

922

Выход:

 4
16 

Функция Python передается по ссылке или по значению?

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

Пример:

Python3

def square_value (num):

return num * 2

печать (square_value ( 2 ))

print (square_value ( - 4 ))

def myFun (x):

x [ 0 ] = 20

lst = [ 10 , 11 , 12 , 13 , 14 , 15 ]

myFun (lst)

print (lst)

Output

 [20, 11, 12, 13, 14, 15] 

Когда мы передаем ссылку и меняем полученную ссылку на что-то в противном случае связь между переданным и принятым параметром разрывается.Например, рассмотрим приведенную ниже программу.

Python3

def myFun (x):

x = , 30 , 40 ]

lst = [ 10 , 11 , 12 , 13 , 14 , 15 ]

myFun (lst)

печать (lst)

Выход

 [10, 11, 12, 13, 14, 15] 

Другой пример, демонстрирующий, что ссылка на ссылку не работает, если мы присваиваем новое значение (внутри функции).

Python3

def myFun (x):

x

0

0 x

0

x = 10

myFun (x)

print (x)

Упражнение: Попробуйте угадать результат следующего кода.

Python3

def swap (x, y):

temp = x

x = y

y = темп

x = 2

y = 3

обмен (x, y)

печать (x)

print (y)

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

Python3

def куб (x): возврат x * x * x

=

куб лямбда x: x * x * x

печать (куб ( 7 ))

печать (куб_v2 ( 7 ))

Функция Python в функциях

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

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

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