Глава 4. Функции в Python

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

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

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

функции (группы кода), которые не возвращают никакого результата, т. е. voidфункции (например:

выполнить операцию «назад»)

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

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

1) Функции, которые не возвращают результат

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

defprimaFunction() :

пройти

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

def primaFunctie():

печать("Привет!")

print("Это моя первая функция")

print("Я чувствую себя хорошо, я делаю успехи :)")

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

primaFunction()

и сгенерированный результат будет:

Здравствуйте!

Это моя первая работа

Я чувствую себя хорошо, я делаю успехи

Столько! Все совсем несложно, и, как вы видели, функции представляют собой блоки кода с целью их повторного использования в будущем. Таким образом, мы можем создать функцию для использования в n (десятках, сотнях) ситуаций, например функцию print() в Python, которая является встроенной функцией, который мы использовали много раз до сих пор.

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

Наши функции не должны быть тривиальными последовательностями кода, которые выполняют небольшие действия и полностью лишены контекста нашей программы. Для этого есть определенные аргументы (переменные), которые можно присвоить функциям, как в примере ниже:

Аргументы функции защиты (имя, возраст):

print("Меня зовут ", имя" и мой возраст ", возраст, лет")

Аргумент функции ("ВашеИмя", 25)

И отображаемый результат будет:

Меня зовут YourName, мне 25 лет

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

Аргументы функции защиты (имя, возраст):

print("Меня зовут ", имя" и мой возраст ", возраст, лет")

имя = «ВашеИмя»

возраст=25

функцияАргумент(имя, возраст)

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

Пример #2

Мы возьмем следующую задачу и решим ее, используя то, что мы узнали ранее:

"Напишите программу для отображения максимального числа между двумя случайными числами".

Решение этой проблемы следующее:

максимальное значение по умолчанию ( x, y ):

if x > y:

печать (х)

еще:

печать (у)

значениеМаксимум(31, 7)

И отображаемый результат будет: 31 . Пример довольно прост, но в следующих разделах вы увидите, как мы будем его использовать. Теперь предлагаю протестировать один и тот же код с несколькими вариантами, меняя значения переменных.

2) Функции, возвращающие результат

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

Они все останутся там.

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

Максимальное значение определения ( x, y ):

if x > y:

возврат х

еще:

возврат г

res = максимальное значение( 31 , 7 )

print("Конечный результат", res)

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

Окончательный результат: 31

Если бы мы не использовали последовательность res = valueMaximum(31, 7), мы бы не смогли сохранить результат и использовать его позже для выполнения других операций.

Пример #2

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

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

деф получитьЧисло():

имя = ввод("Введите ваше имя:")

возвращаемое имя

защита получитьпользователя():

user = input("Введите желаемое имя пользователя:")

вернуть пользователя

защита получить пароль():

пароль = ввод("Введите пароль, который вы хотите:")

в то время как len(пароль) ‹ 5:

print("Ваш пароль слишком короткий. Попробуйте еще раз")

пароль = ввод("Введите пароль, который вы хотите:")

возвратное слово

имя = получитьИмя()

пользователь = получитьпользователя()

слово = получитьслово ()

В приведенной выше последовательности я создал три функции, каждая из которых предназначена для получения определенных данных от пользователя. К функции getParola () мы добавили большую меру безопасности в том смысле, что она не позволит хранить пароли короче 5 символов(попробуйте ввести 3-значный пароль и соблюдайте результат).

Наш код для части безопасности пароля будет выглядеть так:

def securizareWord (слово):

passwordSecured = хеш (пароль)

вернуть пароль

def getDateUser (имя, пользователь, пароль):

«»»Данные пользователя могут быть возвращены в виде словаря и использованы

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

print("Учетные данные пользователя", имя, пользователь, пароль)

Чтобы защитить пароль, мы используем встроенную в Python функцию под названием hash(). Это генерирует уникальное значение для любой строки или числа, которые он получает в качестве аргумента, и является чрезвычайно используемым способом защиты паролей, хранящихся в базах данных. Если вас интересует раздел «Безопасность» и вы хотите узнать больше, я рекомендую мою книгу Introduction to Cyber ​​Security.

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

wordSec = securizareWord (слово)

print("Пароль", пароль, "был защищен и есть", passwordSec)

getDateUser(имя,пользователь,парольсек)

И отображаемый результат будет:

Введите ваше имя: Джон

Введите желаемое имя пользователя: johnuser

Введите желаемый пароль: python2019

Пароль python2019 защищен и равен 748367380273021697.

Идентификационные данные пользователя: John johnuser 748367380273021697

3) Рекурсивные функции

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

Пример №1 — Максимум 3 числа

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

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

Решение следующее:

Максимальное значение определения ( x, y ):

if x > y:

вернуть х

еще:

вернуть у

def numarMax( x, y, z ):

возвращает максимальное значение ( x, максимальное значение ( y, z ))

печать (числоМакс (2, 7, -2))

Как видите, я определил две функции: первая функция (Maximum value) определяет максимальное значение из двух чисел, а вторая функция (Maxnum) используется первая функция для определения наибольшего значения среди 3 чисел.

Как это делается?

Из последовательности: valueMaximum(x, valueMaximum(y,z)) сначала будет определяться результат функции, заданной в качестве параметра (то есть значения y и z будут сравниваться и определяться наибольшее значение — в данном случае 7), после чего будет выполняться та же функция, но со значением x > (в данном случае 2), соответственно результат между y и z (т.е. 7 в этом примере). Результатом этой последовательности будет: 7

Пример №2 — Н! (n факториал)

Этот пример будет немного сложнее из-за математической коннотации, но я призываю вас отложить в сторону (часто) негативные идеи и мнения, которые у вас могут быть о математике, и последовать примеру со мной. Вы помните, какими были факторные операции в математике (изучали в средней школе)? Если нет, я объясню здесь. Обозначение было таким: n! и оно было прочитано в факториале.

Сколько стоит 5! ? По формуле n! = п * (п — 1)! результат на 5! будет:

5 * 4 * 3 * 2 * 1 = 120

Я подробно решение здесь:

5! = 5 * (5–1)! = 5 * 4!

где 4! = 4 * (4–1)! = 4 * 3!

где 3! = 3 * (3–1)! = 3 * 2!

где 2! = 2 * (2–1)! = 2 * 1!

где 1! = 1

Теперь, если мы заменим:

5! = 5 * (5–1) * (4–1) * (3–1) * (2–1) = 5 * 4 * 3 * 2 * 1

Отсюда мы получаем 5! = 120

Как вы можете сделать это в программировании?

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

по факту(n):

if n == 1:

вернуть 1

еще:

вернуть (n * факт (n — 1))

печать (факт (5))

Здесь в коде я применил именно решение факториала. Если я позвоню 1! , то есть вместо fact(5) мы бы написали fact(1), у рекурсивной функции не было бы возможности вызвать себя. Если вместо этого я назову 2! функция вызовет сама себя один раз (поскольку первый вызов происходит после функции печати). Таким образом, при вызове функции для 5! пока не дойдете до вызова fact(1) , и здесь функция вернет 1 .

4) Функция main()

Существует несколько способов запуска программы:

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

То, как вы говорите компьютеру выполнять код из командной строки, немного отличается в зависимости от каждой операционной системы. В Linux и macOS командная строка выглядит так, как показано в примере ниже:

пользователь@python:~/Документы$

Часть перед знаком $ может выглядеть по-разному в зависимости от имени пользователя. Вводимые вами команды будут после $ .

В Windows командная строка обычно выглядит примерно так:

C:\Пользователи\пользователь\Документы›

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

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

c) Запуск программы через файл, в котором есть определенный порядок выполнения. Это делается с помощью функции main(). Это файл, содержащий код и имеющий расширение: .py.

деф основной():

распечатать("основной код")

Функция определения():

распечатать («функция»)

функция()

если __name__ == «__main__»:

основной()

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

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

продукт определения():

печать(2*3)

Функция определения():

печать("функция1")

деф основной():

продукт()

функция()

основной()

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

Упражнения

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

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

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

3) Напишите программу, которая проверяет, является ли число простым. Простое число — это число, которое нельзя точно разделить ни на какое число.







Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord . Заинтересованы в хакинге роста? Ознакомьтесь с разделом Схема.