Функции в python

Содержание:

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

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

Как только базовая структура функции создана, вы можете выполнить ее, вызвав ее из другой функции или непосредственно из Python prompt (командной оболочки). Ниже приведен пример вызова функции printme():

# Определение функции
def printme( str ):
    """This prints a passed string into this function"""
    print(str)
    return

# Теперь вы можете вызвать функцию printme
printme("I'm first call to user defined function!")
printme("Again second call to the same function")

Результат:

I'm first call to user defined function!
Again second call to the same function

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

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

  • Обязательные аргументы
  • Ключевые аргументы
  • Аргументы по умолчанию
  • Аргументы переменной длины

Функции

Последнее обновление: 11.04.2018

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

def имя_функции ():
    инструкции

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

Например, определение простейшей функции:

def say_hello():
    print("Hello")

Функция называется . Она не имеет параметров и содержит одну единственную инструкцию,
которая выводит на консоль строку «Hello».

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

def say_hello():
    print("Hello")
    
say_hello()
say_hello()
say_hello()

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

Hello
Hello
Hello

Теперь определим и используем функцию с параметрами:

def say_hello(name):
    print("Hello,",name)

say_hello("Tom")
say_hello("Bob")
say_hello("Alice")

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

Hello, Tom
Hello, Bob
Hello, Alice

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

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

def say_hello(name="Tom"):
    print("Hello,", name)
	
say_hello()
say_hello("Bob")

Здесь параметр name является необязательным. И если мы не передаем при вызове функции для него значение, то применяется значение по умолчанию, то есть
строка «Tom».

Именованные параметры

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

def display_info(name, age):
    print("Name:", name, "\t", "Age:", age)
	
display_info("Tom", 22)

При вызове функции первое значение «Tom» передается первому параметру — параметру name, второе значение — число 22 передается второму параметру — age. И так далее по порядку.
Использование именованных параметров позволяет переопределить порядок передачи:

def display_info(name, age):
    print("Name:", name, "\t", "Age:", age)
	
display_info(age=22, name="Tom")

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

Неопределенное количество параметров

С помощью символа звездочки можно определить неопределенное количество параметров:

def sum(*params):
    result = 0
    for n in params:
        result += n
    return result


sumOfNumbers1 = sum(1, 2, 3, 4, 5)		# 15
sumOfNumbers2 = sum(3, 4, 5, 6)			# 18
print(sumOfNumbers1)
print(sumOfNumbers2)

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

Возвращение результата

Функция может возвращать результат. Для этого в функции используется оператор return, после которого указывается возвращаемое значение:

def exchange(usd_rate, money):
    result = round(money/usd_rate, 2)
    return result

result1 = exchange(60, 30000)
print(result1)
result2 = exchange(56, 30000)
print(result2)
result3 = exchange(65, 30000)
print(result3)

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

В Python функция может возвращать сразу несколько значений:

def create_default_user():
    name = "Tom"
    age = 33
    return name, age


user_name, user_age = create_default_user()
print("Name:", user_name, "\t Age:", user_age)

Здесь функция create_default_user возвращает два значения: name и age. При вызове функции эти значения по порядку присваиваются переменным
user_name и user_age, и мы их можем использовать.

Функция main

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

def main():
    say_hello("Tom")
    usd_rate = 56
    money = 30000
    result = exchange(usd_rate, money)
    print("К выдаче", result, "долларов")


def say_hello(name):
    print("Hello,", name)
    
    
def exchange(usd_rate, money):
    result = round(money/usd_rate, 2)
    return result

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

НазадВперед

Значения аргументов по умолчанию для lambda-функции в Python

В Python, как впрочем и в других языках, например, C++, мы можем задавать значения аргументов по умолчанию. Но как нам это может пригодиться? Допустим функция func1() принимает 2 параметра a и b. Что произойдет если пользователь программы передаст лишь один из этих параметров или даже ни одного? Как раз для того, чтобы избежать возможной ошибки, или облегчить работу пользователя, вы можете задать вашим параметрам значения по умолчанию.

Давайте рассмотрим пример.

def func1(a=2,b=3):
    print(a,' ',b)
func1()

2 3
func1(3)

3 3

Здесь значениями по умолчанию для a и b являются соответственно 2 и 3. Для того, чтобы задать значения по умолчанию для lambda-функции, запись будет следующей:

o = lambda x=1,y=2,z=3:x+y+z
o(2,3)

8
o(2)

7
o()

6

Советы в написании кода

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

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

The Anonymous Functions

These functions are called anonymous because they are not declared in the standard manner by using the def keyword. You can use the lambda keyword to create small anonymous functions.

  • Lambda forms can take any number of arguments but return just one value in the form of an expression. They cannot contain commands or multiple expressions.

  • An anonymous function cannot be a direct call to print because lambda requires an expression

  • Lambda functions have their own local namespace and cannot access variables other than those in their parameter list and those in the global namespace.

  • Although it appears that lambda’s are a one-line version of a function, they are not equivalent to inline statements in C or C++, whose purpose is by passing function stack allocation during invocation for performance reasons.

Variable-length arguments

You may need to process a function for more arguments than you specified while defining the function. These arguments are called variable-length arguments and are not named in the function definition, unlike required and default arguments.

Syntax for a function with non-keyword variable arguments is this −

def functionname( *var_args_tuple ):
   "function_docstring"
   function_suite
   return 

An asterisk (*) is placed before the variable name that holds the values of all nonkeyword variable arguments. This tuple remains empty if no additional arguments are specified during the function call. Following is a simple example −

#!/usr/bin/python

# Function definition is here
def printinfo( arg1, *vartuple ):
   "This prints a variable passed arguments"
   print "Output is: "
   print arg1
   for var in vartuple:
      print var
   return;

# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )

When the above code is executed, it produces the following result −

Output is:
10
Output is:
70
60
50

Функция main()

В языке Python функцию можно вызвать в конце программы, и она запустится (как показано в предыдущих примерах), однако некоторым языкам программирования (например, C++ или Java) требуется функция main. Функция main() в Python необязательна, но она позволяет логически структурировать программу Python и объединить наиболее важные её компоненты в одну функцию. Также с её помощью программы Python легче читать программистам, которые работают с другими языками.

Вернитесь в файл hello.py и добавьте функцию main(), сохранив при этом функцию hello().

В функцию main() добавьте выражение print(). Затем вызовите функцию hello() внутри функции main().

В конце файла вызовите функцию main().

Теперь можно запустить программу:

Теперь попробуйте использовать несколько функций.

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

В Python область выполнения высокоуровневого кода называется __main__. Когда программа запускается из стандартного ввода, скрипта или интерактивного запроса, __name__ равно __main__.

Потому в программах используется такая конструкция:

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

  • Основную программу (и запустить код после конструкции if).
  • Модуль (и не выполнять код после if).

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

Попробуйте расширить программу names.py. Создайте новый файл more_names.py; в этом файле объявите глобальную переменную и измените исходную функцию names(), разделив задачи на две дискретные функции.

Первая функция, has_vowel(), будет проверять строку name на наличие гласных. Вторая функция, print_letters(), будет выводить каждую букву строки name.

Теперь определите функцию main(), которая будет вызывать has_vowel() и print_letters().

Затем добавьте конструкцию if __name__ == ‘__main__’: в конец файла.

В данном случае все функции помещены в функцию main(). Потому после конструкции нужно вызвать функцию main().

Теперь можно запустить программу:

Программа вернёт такой же вывод, как и names.py, но теперь код программы лучше организован, и его можно использовать как модуль без изменений.

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

Функция main() и конструкция if __name__ == ‘__main__’: позволяют логически организовать код, делают его модульным и удобочитаемым.

Функция input().

>>> name = input(‘Как вас зовут? ‘)Как вас зовут? Ян    # вводит пользователь
>>> print(name)Ян

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

>>> a = input(‘Введите число: ‘)Введите число: 5
>>> b = input(‘Введите число: ‘)Введите число: 10
>>> a + b’510’

Вместо того чтобы сложить 5 и 10 и в итоге получить 15, Python складывает строковое значения ‘5’ и ’10’, и в итоге получает строку ‘510’. Это операция называется конкатенация строк. В результате создается новая строка из левого операнда, за которым следует правый. 

Если вам требуется получить целое число, то преобразуйте строку в число с помощью функции int():

>>> a = int( input(‘Введите число: ‘))Введите число: 5
>>> b = int( input(‘Введите число: ‘))Введите число: 10
>>> a + b15

Если вам требуется получить число с плавающей точкой, то используйте функцию float()

>>> a = float(input(‘Введите число: ‘))Введите число: 12.5
>>> b = float(input(‘Введите число: ‘))Введите число: 7.3
>>> a + b19.8

5.1.5. Побочный эффект¶

Побочный эффект (англ. Side Effect) — любые действия программы, изменяющие среду выполнения (англ. Execution Environment).

К побочным эффектам выполнения функции можно отнести:

  • изменение данных в памяти;

  • чтение/запись файла или устройства;

  • ввод/вывод значений;

  • самостоятельную реакцию на исключительные ситуации;

  • и др.

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

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

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

Листинг 5.1.16 — Локализация кода с побочным эффектом в отдельные функции |

def heron(a, b, c):
    """Вернуть площадь треугольника по формуле Герона.

    Параметры:
        - a, b, c (float): стороны треугольника.

    Результат:
        - float: значение площади.
        - None: если треугольник не существует.
    """
    if not (a + b > c and a + c > b and b + c > a):
        return

    p = (a + b + c)  2
    return (p * (p - a) * (p - b) * (p - c))**0.5


def input_data():
    """Запросить стороны треугольника с клавиатуры.

    Результат:
        - tuple of float: (a, b, c).

    Побочный эффект!
    """
    return (float(x) for x in input('Введите стороны (a b c): ').split())

def print_res(res):
    """Вывести на экран 'res'.

    Параметры:
        - res (float): площадь треугольника.

    Побочный эффект!
    """
    if res
        print('S = {:.2f}'.format(res))
    else
        print('Треугольник не существует!')


a, b, c = input_data()
res = heron(a, b, c)
print_res(res)

Предупреждение

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

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

Default Arguments

A default argument is an argument that assumes a default value if a value is not provided in the function call for that argument. The following example gives an idea on default arguments, it prints default age if it is not passed

#!/usr/bin/python3

# Function definition is here
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print ("Name: ", name)
   print ("Age ", age)
   return

# Now you can call printinfo function
printinfo( age = 50, name = "miki" )
printinfo( name = "miki" )

When the above code is executed, it produces the following result −

Name:  miki
Age  50
Name:  miki
Age  35

Функция в Python

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

Напишем функцию, которая вычисляет квадрат своего аргумента и выводит на экран:

>>> def square(number):
…     «»»Вычисление квадрата числа»»»
…     (number 2)

>>> square(5)25
>>> square(124.45)15487.802500000002

Определение функции начинается с ключевого слова def, за которым следует имя функции — square. Имя функции, как и имена переменных рекомендуется писать с букв нижнего регистра, а в именах, состоящих из нескольких слов, составляющие должны разделяться символами подчеркивания. Далее в круглых скобках записываются параметры (аргументы) функции, разделенные запятыми. Функция square имеет только один аргумент с именем number — значение, возводимое в квадрат. В случае отсутствия параметров у функции пустые круглые скобки обязательны. В конце строки за параметрами всегда ставится двоеточие ().

После двоеточия новая строка должна идти с отступом (4 пробела). Все строки с отступом образуют тело или блок функции. В «Руководстве по стилю кода Python» указано, что первой строкой блока функции должна быть doc-строка, кратко поясняющая назначение функции: «»»Вычисление квадрата числа»»». Сам код в теле функции состоит всего из одной строки (number 2).

Команда squre(5) вызывает функции square() и передает ей значение аргумента, для выполнения команды . Функция возводит число в квадрат и выводит на экран. 

Variable-length Arguments

You may need to process a function for more arguments than you specified while defining the function. These arguments are called variable-length arguments and are not named in the function definition, unlike required and default arguments.

Syntax for a function with non-keyword variable arguments is given below −

def functionname( *var_args_tuple ):
   "function_docstring"
   function_suite
   return 

An asterisk (*) is placed before the variable name that holds the values of all nonkeyword variable arguments. This tuple remains empty if no additional arguments are specified during the function call. Following is a simple example −

#!/usr/bin/python3

# Function definition is here
def printinfo( arg1, *vartuple ):
   "This prints a variable passed arguments"
   print ("Output is: ")
   print (arg1)
   
   for var in vartuple:
      print (var)
   return

# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )

When the above code is executed, it produces the following result −

Output is:
10
Output is:
70
60
50

Аннотация типов

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

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

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

PyCharm предупреждает о передаче типа «str» вместо «int»

При этом интерпретатор считывает аннотации типов, но никак их не обрабатывает.

Как определяется длина строки Python?

Метод  len Python 3 возвращает количество символов в строке. Его можно использовать в тех случаях, когда необходимо установить минимальную или максимальную длину пароля. А также, если необходимо усечь длинные строки.

Чтобы продемонстрировать этот метод в действии, найдем длину предложения:

open_source = "Sammy contributes to open source."
print(len(open_source))

Вывод:

33

Мы инициализируем переменную open_source строковым значением «Sammy contributes to open source.». Затем передаем эту переменную в метод len() с помощью len(open_source). После этого используем  print() для вывода результата на экран.

Помните, что любой символ, заключенный в одинарные или двойные кавычки, будет учитываться методом len().

Аргументы

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

  1. Формальные аргументы: те, которые мы видели в примерах до сих пор.
  2. Переменное количество аргументов без ключевых слов: например, def add(*args)
  3. Переменное количество аргументов ключевых слов или именованных аргументов: например, def add(**kwargs)

Некоторые важные моменты относительно переменных аргументов в Python:

  • Порядок аргументов должен быть формальным, * args и ** kwargs.
  • Не обязательно использовать имена параметров переменных как args и kwargs. Однако лучше всего использовать их для лучшей читаемости кода.
  • Тип args — кортеж. Таким образом, мы можем передать кортеж для отображения с переменной * args.
  • Тип кваргов — дикт. Таким образом, мы можем передать словарь для сопоставления с переменной ** kwargs.

Вот простой пример.

def add(x, y, *args, **kwargs):
    sum = x + y
    for a in args:
        sum += a

    for k, v in kwargs.items():
        sum += v
    return sum


total = add(1, 2, *(3, 4), **{"k1": 5, "k2": 6})
print(total)  # 21

Порядок позиционных аргументов тоже важен

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

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

Это работает так же, как присваивание значений переменным.

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

def hello_to_you(first_name,last_name):
    print(f"Hello, {first_name} {last_name}")
    

hello_to_you("Timmy","Jones")
# Выводит в консоль "Hello, Timmy Jones" 
# Это можно визуализировать так:
# first_name = "Timmy"
# last_name = "Jones"

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

def fave_language(name,language):
    print(f"Hello, I am {name} and my favorite programming language is {language}")

    
fave_language("Python","Dionysia")
# Результат:
# Hello, I am Python and my favorite programming language is Dionysia

# Это как если бы вы сделали так:
# name="Python"
# language = "Dionysia"

What is a function in Python?

In Python, a function is a group of related statements that performs a specific task.

Functions help break our program into smaller and modular chunks. As our program grows larger and larger, functions make it more organized and manageable.

Furthermore, it avoids repetition and makes the code reusable.

Syntax of Function

def function_name(parameters):
	"""docstring"""
	statement(s)

Above shown is a function definition that consists of the following components.

  1. Keyword that marks the start of the function header.
  2. A function name to uniquely identify the function. Function naming follows the same .
  3. Parameters (arguments) through which we pass values to a function. They are optional.
  4. A colon (:) to mark the end of the function header.
  5. Optional documentation string (docstring) to describe what the function does.
  6. One or more valid python statements that make up the function body. Statements must have the same indentation level (usually 4 spaces).
  7. An optional statement to return a value from the function.

How to call a function in python?

Once we have defined a function, we can call it from another function, program, or even the Python prompt. To call a function we simply type the function name with appropriate parameters.

Try running the above code in the Python program with the function definition to see the output.

Note: In python, the function definition should always be present before the function call. Otherwise, we will get an error. For example,

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

Для начала попробуйте преобразовать простую программу «Hello, World!» в функцию.

Создайте новый текстовый файл hello.py, а затем определите функцию.

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

Чтобы определить функцию hello(), добавьте в файл hello.py:

Это исходное определение функции.

Далее нужно добавить вторую строку с 4 пробелами в начале. Она будет определять задачу, которую выполняет функция (в данном случае функция будет выводить в консоль фразу Hello, World!):

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

После определения функции вызовите её:

Теперь запустите программу:

Она должна вернуть:

Функция hello() – довольно простой пример. Функции могут быть гораздо сложнее: содержать циклы for, условные выражения и другие компоненты.

  • Циклы for в Python 3
  • Условные операторы в Python 3

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

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

Генерация случайных чисел (модуль random)

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

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

random.random() - случайное число от 0 до 1.
random.randint(A, B) - случайное целое число N, A ≤ N ≤ B.
random.shuffle(list) перемешивает список случайным образом
random.choice(list) возвращает один случайный элемент из списка

Примеры

Функцияrandom.random()случайное число от 0 до 1.

import randomnumber = random.random()  # значение от 0.0 до 1.0print(number)number = random.random() * 100  # значение от 0.0 до 100.0print(number)

Функция    random.randint(A, B) — случайное целое число N, A ≤ N ≤ B

import randomnumber = random.randint(20, 35)  # значение от 20 до 35print(number)

функция random.shuffle(list) перемешивает список случайным образом

import randomnumbers =    # списокrandom.shuffle(numbers)print('numbers shuffle:',numbers)

Результат работы программы:

numbers shuffle:

функция  random.choice(list) возвращает один случайный элемент из списка

numbers =  random_number = random.choice(numbers)print('random_number:', random_number)

5.1.4. Анонимные функции¶

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

lambda
lambda parameters expression
  • часть является необязательной, и если она присутствует, то обычно представляет собой простой список имен переменных, разделенных запятыми (позиционных аргументов);

  • выражение не может содержать условных инструкций или циклов (условные выражения — допустимы), а также не может содержать инструкцию ;

  • результатом лямбда-выражения является анонимная функция.

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

Пример записи лямбда-функции приведен в Листинге 5.1.15.

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

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

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

Синтаксис функции


def name_functions(parameters):

"""

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

"""

    pass

Выше я привел пример определения функции, оно состоит из следующих элементов.

Ключевое слово def — определяет начало функции
Затем следует указать название функции (обратите внимание, нельзя называть функции зарезервированными именами Python)
Далее после название идут круглые скобки, в них мы передаем (аргументы функции). Они необязательны
Знак двоеточия, как и в циклах и в условиях, означает конец заголовка
Внутри функции желательно указать комментарии, что бы мы всегда знали, что делает эта функция
Далее 4 отступа, и создаем тело функции
return — необязательный оператор, который возвращает значения из функции

Пример функции


def hello(name):

"""

Эта функция приветствия.
Аргумент name передается в качестве параметра

"""

    print("Привет, "+ name + " Доброе утро")

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

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

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


hello("Тимур")
Результат:

Привет, Тимур Доброе утро

Уловили суть? Мы в самом начале создали функции, в парметр функции передаем переменную name, и в print выводим переданный параметр. Затем, мы в любом месте нашей программы, можем написать имя нашей функции, передать ей параметр, и она выведет наше приветствие.  Откройте свой Pycharm, и введите приведенный ниже листинг кода, и вы увидите результат.


def hello(name):

""" Эта функция приветствия.

Аргумент name передается в качестве параметра """

    print("Привет, "+ name + " Доброе утро")

hello("Тимур")
Результат:

Привет, Тимур Доброе утро

return — оператор возврата

Оператор return возвращает значение, если отсутствует значение, или отсутствует сам оператор return — мы получаем None объект. None объект — это пустой объект, то есть нечего ему возвращать. Рассмотрим пример:


def value(number):

"""

Возвращаем значение введенного числа

"""

    if number >= 0:

        return number

    else:

        return -number

print(value(2))

print(value(-4))

Результат:

2

4

Время жизни переменных, и область работы переменных

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

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


def testfunc():

    x = 10

    print("Значение внутри функции: ", x)

x = 20

testfunc()

print("Значение переменной за пределами функции: ", x)

Результат:

Значение внутри функции: 10

Значение переменной за пределами функции: 20

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

Программирование иногда сильно утомляет, тяжело всегда думать головой, поэтому не забывайте время от времени немного расслабляться, посмотрите лучшие моменты из ЧБД.

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

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

Но в Python есть еще и именованные аргументы.

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

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

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

def fave_language(name,language):
    print(f"Hello, I am {name} and my favorite programming language is {language}")

    
fave_language(language="Python",name="Dionysia")
#output:
#Hello, I am Dionysia and my favorite programming language is Python

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

То есть, вы могли бы написать код следующим образом, и это не вызвало бы ошибок:

def fave_language(name,language):
    print(f"Hello, I am {name} and my favorite programming language is {language}")

    
fave_language(language="Python",name="Dionysia")
#output:
#Hello, I am Dionysia and my favorite programming language is Python

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

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

def fave_language(name,language):
    print(f"Hello, I am {name} and my favorite programming language is {language}")

    
fave_language("dionysia",language="Python")
#output:
#Hello, I am dionysia and my favorite programming language is Python

В этом случае порядок опять-таки имеет значение.

Позиционные аргументы всегда идут первыми. Все именованные аргументы должны следовать за позиционными. В противном случае будет ошибка:

def fave_language(name,language):
    print(f"Hello, I am {name} and my favorite programming language is {language}")

    
fave_language(language="Python","dionysia")

Создание динамических классов

Допустим, у нас есть следующие классы.

class Data:
    """Data Class"""
    d_id = 10


class SubData(Data):
    """SubData Class"""
    sd_id = 20

Напечатаем некоторые свойства этих классов.

print(Data.__class__)
print(Data.__bases__)
print(Data.__dict__)
print(Data.__doc__)

print(SubData.__class__)
print(SubData.__bases__)
print(SubData.__dict__)
print(SubData.__doc__)

Вывод:

<class 'type'>
(<class 'object'>,)
{'__module__': '__main__', '__doc__': 'Data Class', 'd_id': 10, '__dict__': <attribute '__dict__' of 'Data' objects>, '__weakref__': <attribute '__weakref__' of 'Data' objects>}
Data Class

<class 'type'>
(<class '__main__.Data'>,)
{'__module__': '__main__', '__doc__': 'SubData Class', 'sd_id': 20}
SubData Class

Мы можем создавать похожие классы с помощью функции type().

Data1 = type('Data1', (object,), {'__doc__': 'Data1 Class', 'd_id': 10})
SubData1 = type('SubData1', (Data1,), {'__doc__': 'SubData1 Class', 'sd_id': 20})

print(Data1.__class__)
print(Data1.__bases__)
print(Data1.__dict__)
print(Data1.__doc__)

print(SubData1.__class__)
print(SubData1.__bases__)
print(SubData1.__dict__)
print(SubData1.__doc__)

Вывод:

<class 'type'>
(<class 'object'>,)
{'__doc__': 'Data1 Class', 'd_id': 10, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'Data1' objects>, '__weakref__': <attribute '__weakref__' of 'Data1' objects>}
Data1 Class

<class 'type'>
(<class '__main__.Data1'>,)
{'__doc__': 'SubData1 Class', 'sd_id': 20, '__module__': '__main__'}
SubData1 Class

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

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

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

Adblock
detector