Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

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

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

Чем меньше и специализированнее код функции, тем проще выбрать для нее понятное имя. Не бойтесь использовать длинные имена. Длинное содержательное имя лучше короткого невразумительного. Будьте последовательны в выборе имени. Используйте в имени функции те же словосочетания, глаголы и существительные, которые используются в ваших модулях. Создание функции производится с помощью инструкции def, как показано в следующем примере. Мы уже научились работать со списками в python, давайте воспользуется знаниями тут.

# -*- coding: utf-8 -*-
Phones = ['Nokia', 'Samsung', 'LG', 'Sony']
def show_as_text(user_list):
    words = ''
    for value in user_list:
        words += str(value) + ' '
    return words
print 'Phones: ', show_as_text(Phones) # Вернет: Phones:  Nokia Samsung LG Sony

Достаточно простая структура функции. Название функции show_as_text, важно чтобы не совпадала с названием функции самого Python. Имя функции должна быть уникальна и по сравнению с переменными. Если функция будет иметь название get_values, и после нее в скрипте будет создана переменная с тем же именем, тогда вызов get_values(args) выдаст ошибку.

# -*- coding: utf-8 -*-
def get_value():
    return True
a = 1
b = 3
get_value = 'some text...'
is_true = get_value()

Получим ошибку:

TypeError: 'str' object is not callable
Если потребуется вернуть из функции несколько значений, можно использовать кортеж. Создадим небольшой аналог игры Бинго! чтобы получить разные номера. В примере ниже мы использовали модуль random для генерации случайных чисел.

# -*- coding: utf-8 -*-
import random
def bingo():
    return (
        random.randint(0, 30),
        random.randint(0, 30),
        random.randint(0, 30)
    )
Numbers = bingo()
print 'Первый: ', Numbers[0]
print 'Второй: ', Numbers[1]
print 'Третий: ', Numbers[2]

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

def connect(ip, port=8080):
    return str(ip) + ' ' + str(port)
print connect('127.0.0.1')  # Получим: 127.0.0.1 8080

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

connect('python-3.ru', 80)

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

connect(port=80, host='python-3.ru')

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

num = 1 # Глобальная переменяя
def next_number():
    global num
    personal_num = 999
    num += 1
    return num
print next_number() # результат 2
# Попробуем получить значении локальной переменной personal_num
print personal_num
# Ошибка NameError: name 'personal_num' is not defined