Введение

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

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

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

На этом шаге вы узнаете, как определить функцию, которая принимает аргументы. Функция может принимать аргументы (arguments) — это значения, которые вы передаете функции при ее вызове.

Примечание: Если вы не знакомы с использованием WebIDE (похожего на VS Code), пожалуйста, изучите это в этой лаборатории.

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

Сначала откройте файл arguments.py в проводнике файлов слева.

Затем скопируйте и вставьте следующий код в файл arguments.py. Этот код определяет функцию say_hello, которая принимает один аргумент, name.

## Define a function that takes one argument
def say_hello(name):
   print(f'Hello {name}')

## Call the function with a string argument
say_hello('Carlos')
say_hello('Wanda')
say_hello('Rose')

Теперь давайте запустим скрипт. Откройте терминал в WebIDE и выполните следующую команду:

python3 arguments.py

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

Hello Carlos
Hello Wanda
Hello Rose

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

Именованные аргументы (Keyword Arguments)

На этом шаге вы узнаете, как использовать именованные аргументы для повышения читаемости кода. Если функция имеет несколько параметров, вы можете указать, какой аргумент какому параметру соответствует, используя имя параметра. Это называется именованным аргументом (keyword argument).

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

Откройте файл keywords.py в проводнике файлов. Скопируйте и вставьте в него следующий код.

## Function with multiple parameters
def say_hi(name, greeting):
   print(f"{greeting} {name}")

## Positional arguments: order matters
print("Calling with positional arguments:")
say_hi('John', 'Hello')

## Keyword arguments: order doesn't matter, more readable
print("\nCalling with keyword arguments:")
say_hi(name='Anna', greeting='Hi')

Теперь запустите скрипт из терминала:

python3 keywords.py

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

Calling with positional arguments:
Hello John

Calling with keyword arguments:
Hi Anna

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

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

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

Откройте файл returns.py и добавьте следующий код. Функция sum_two_numbers вычисляет сумму и использует ключевое слово return для вывода результата.

## Function that returns a value using return statement
def sum_two_numbers(number_1, number_2):
   return number_1 + number_2

## Call function and store the returned value
result = sum_two_numbers(7, 8)
print(result)

Выполните скрипт в терминале:

python3 returns.py

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

15

Локальная и глобальная области видимости (Local and Global Scope)

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

  • Глобальная область видимости (Global Scope): Переменные, определенные вне какой-либо функции, находятся в глобальной области видимости и могут быть доступны из любой части кода, включая код внутри функций.
  • Локальная область видимости (Local Scope): Переменные, созданные внутри функции, находятся в локальной области видимости этой функции. Они существуют только внутри этой функции и недоступны извне.

Сначала посмотрим, что произойдет, если попытаться получить доступ к локальной переменной из глобальной области видимости. Если бы вы запустили следующий код, он вызвал бы ошибку NameError, потому что local_variable не определена в глобальной области видимости.

## This code will cause an error
global_variable = 'I am available everywhere'

def some_function():
    print(global_variable)
    local_variable = "only available within this function"
    print(local_variable)

## This will raise NameError because local_variable doesn't exist here
## print(local_variable)

Оператор global

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

Откройте файл scope.py и добавьте следующий код. Здесь функция spam использует ключевое слово global для изменения глобальной переменной eggs.

## Use 'global' keyword to modify global variable from inside function
def spam():
    global eggs  ## Declare that we're modifying the global variable
    eggs = 'spam'  ## This changes the global variable

eggs = 'global'
print(f"Before calling spam(), eggs is: {eggs}")
spam()  ## Function modifies global variable
print(f"After calling spam(), eggs is: {eggs}")

Теперь запустите скрипт:

python3 scope.py

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

Before calling spam(), eggs is: global
After calling spam(), eggs is: spam

Лямбда-функции (Lambda Functions)

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

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

## Regular function definition
def add(x, y):
    return x + y

Это эквивалентно следующей lambda-функции:

## Lambda function: anonymous function defined in one line
add = lambda x, y: x + y

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

Откройте файл lambdas.py и добавьте следующий код. Функция make_adder принимает число n и возвращает новую лямбда-функцию, которая прибавляет n к любому числу x.

## Lambda closure: lambda function that captures a variable from the outer scope
def make_adder(n):
    return lambda x: x + n  ## Lambda captures 'n' from the outer function

## Create a function that adds 3
plus_3 = make_adder(3)

## Use the new function
result = plus_3(4)  ## This will be 4 + 3
print(result)

Запустите скрипт из терминала:

python3 lambdas.py

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

7

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

Резюме

В этой лабораторной работе вы изучили основные концепции функций в Python. Вы узнали, как определять функции и передавать им информацию с помощью аргументов. Вы практиковались в использовании как позиционных, так и именованных аргументов (positional and keyword arguments) для повышения ясности вызовов функций. Вы также узнали, как заставить функции выдавать результаты с помощью оператора return, как управлять доступностью переменных с помощью локальной и глобальной областей видимости (local and global scopes), и как использовать ключевое слово global для изменения переменных вне функции. Наконец, вы познакомились с мощью и краткостью анонимных lambda-функций для создания простых однострочных функций и замыканий (closures).