Его можно вызывать в любом месте основной программы. Функции помогают избегать дублирования кода при многократном его использовании. А также имеют ряд других преимуществ, описанных ниже.
Синтаксис
♀️ Простой пример: Вы торгуете мёдом, и после каждой продажи вам нужно печатать чек. В нём должно быть указано: название фирмы, дата продажи, список наименований проданных товаров, их количество, цены, общая сумма, а также сакраментальная фраза «Спасибо за покупку!».
Если не пользоваться функциями, всё придётся прописывать вручную. В простейшем случае программа будет выглядеть так:
Здесь kwargs уже заключает аргументы не в кортеж, а в словарь.
Передача по значению и по ссылке
В Python аргументы могут быть переданы, как по ссылке, так и по значению. Всё зависит от типа объекта.
Если объект неизменяемый , то он передаётся в функцию по значению. Неизменяемые объекты это:
- Числовые типы (int, float, complex).
- Строки (str).
- Кортежи (tuple).
Изменяемые объекты передаются в функцию по ссылке. Изменяемыми они называются потому что их содержимое можно менять, при этом ссылка на сам объект остается неизменной.
Учим Python за 1 час! #От Профессионала
В Python изменяемые объекты это:
- Списки (list).
- Множества (set).
- Словари (dict).
Будьте внимательны при передаче изменяемых объектов. Одна из частых проблем новичков.
В функциональном программировании существует понятие «функциями с побочными эффектами» — когда функция в процессе своей работы изменяет значения глобальных переменных. По возможности, избегать таких функций.
Словарь в качестве аргументов (упаковка)
Передаваемые в функцию аргументы можно упаковать в словарь при помощи оператора «**»:
def big_dict(**arguments): print(arguments) big_dict(key=’value’) >
Возвращаемые значения (return)
Что можно возвращать
Функции в Python способны возвращать любой тип объекта.
Распаковка возвращаемых значений
В Питоне поддерживается возврат функциями сразу несколько значений. Достаточно перечислить их через запятую после инструкции return . Возвращаемым типом будет кортеж ( tuple ), который можно распаковать в переменные.
def calculate(num1, num2): return num1 + num2, num1 — num2, num1 * num2 # для так называемой распаковки нескольких значений # их следует присвоить равному количеству аргументов res1, res2, res3 = calculate(7, 6) print(res1, res2, res3) > 13 1 42 print(type(calculate(7, 6)))
☝️ Обратите внимание, что количество возвращаемых значение в кортеже должно совпадать с количеством переменных при распаковке. Иначе произойдет ошибка:
def calculate(num1, num2): return num1 + num2, num1 — num2 # для так называемой распаковки нескольких значений # их следует присвоить равному количеству аргументов res1, res2, res3 = calculate(7, 6) print(res1, res2, res3) > ValueError: not enough values to unpack (expected 3, got 2)
Пустая функция
Иногда разработчики оставляют реализацию на потом, и чтобы объявленная функция не генерировала ошибки из-за отсутствия тела, в качестве заглушки используется ключевое слово pass :
Чистые функции и побочные эффекты
Немного функционального программирования. Есть такие функции, которые при вызове меняют файлы и таблицы баз данных, отправляют данные на сервер или модифицируют глобальные переменные. Всё это — побочные эффекты.
У чистых функций побочных эффектов нет. Такие функции не изменяют глобальные переменные в ходе выполнения, не рассылают и не выводят на печать никакие данные, не касаются объектов, и так далее.
Чистые функции производят вычисления по заданным аргументам и возвращают зависящий только от них самих результат.
Lambda функции
Кроме инструкции def в питоне можно создавать объекты функций в виде выражений. Так называемые анонимные функции создаются с помощью инструкции lambda . Чаще всего их применяют для получения встроенной функции или же для отложенного выполнения фрагмента программного кода.
lambda_test = lambda a, b: pow(a, b) print(lambda_test(2, 4)) > 16
Docstring
Документировать код — особое искусство. Оно существует параллельно с разработкой и сопоставимо с ней по важности. Поэтому нередко документации в программе больше, чем самого кода.
Когда над проектом работает большая команда, а может и не одна, да и еще и много лёт подряд, то значение и важность документации возрастают прямо пропорционально.
Источник: pythonchik.ru
Функция в Python: руководство для начинающих
Мир IT меняется очень быстро, и успевать за ним нелегко. Но если вы хорошо разбираетесь в какой-нибудь технологии, это дает вам определенные преимущества.
Python – широко используемый язык, открывающий множество возможностей. Научиться правильно использовать функции – важный навык для любого Python-разработчика. Поэтому мы и решили написать это руководство по функциям Python для начинающих.
Цель этой статьи – дать вам знания, необходимые для начала работы с функциями в Python.
Итак, давайте начнем!
Зачем нужны функции Python?
Функции управляют входными и выходными данными в компьютерных программах. Языки программирования предназначены прежде всего для работы с данными. А функции — эффективный способ управления этими данными и их преобразованиями.
Модификации данных обычно нужны для получения каких-то результатов, вроде выполнения действий или поиска. Набор операций и инструкций, которые нужны для этого, выполняется из основного кода программы.
Фактически, основной (main) код — это тоже функция, просто очень важная. Все другие функции логически выстраиваются, чтобы выполняться из основного кода.
Но если функция не была объявлена ранее, вам придется сперва ее объявить. Дело в том, что в объявлении перечисляются шаги, которые выполняет функция.
Итак, функции – это не что иное, как задачи, которые хочет выполнять пользователь. И если вы пропишете нужную функциональность один раз и дадите ей имя, вы сможете использовать ее повторно, не превращая свою программу в огромного монстра. Это значительно сокращает количество строк кода и даже упрощает отладку.
Пишем простой скрипт на Python
Здарова, щеглы, сегодня мы своими руками будем писать скрипт на Python. Нам понадобятся: интерпретатор Python 3 под «какая-там-у-вас-ОС», текстовый редактор с подсветкой синтаксиса, например, Sublime Text, Google, упаковка прамирацетама, бутылка минеральной воды и 60 минут свободного времени.
Перед тем как писать скрипт, мы должны определиться, что он вообще будет делать. Делать он будет следующее: получив на вход домен и диапазон IP-адресов, многопоточно проходить список этих адресов, совершать HTTP-запрос к каждому, в попытках понять, на каком же из них размещен искомый домен. Зачем это нужно? Бывают ситуации, когда IP-адрес домена закрыт Cloudflare, или Stormwall, или Incapsula, или еще чем-нибудь, WHOIS история не выдает ничего интересного, в DNS-записях такая же канитель, а, внезапно, один из поддоменов ресолвится в адрес из некоторой подсети, которая не принадлежит сервису защиты. И в этот момент нам становится интересно, вдруг и основной домен размещен в той же самой подсети.
Погнали, сразу выпиваем половину бутылки воды, и пишем следующий код:
import argparse
import logging
import coloredlogs
import ssl
import concurrent . futures
import urllib . request
from netaddr import IPNetwork
from collections import deque
VERSION = 0.1
def setup_args ( ) :
parser = argparse . ArgumentParser (
description = ‘Domain Seeker v’ + str ( VERSION ) + ‘ (c) Kaimi (kaimi.io)’ ,
formatter_class = argparse . ArgumentDefaultsHelpFormatter
parser . add_argument (
help = ‘Domain list to discover’ ,
required = True
parser . add_argument (
help = ‘IP list (ranges) to scan for domains’ ,
required = True
parser . add_argument (
help = ‘Check HTTPS in addition to HTTP’ ,
action = ‘store_true’
parser . add_argument (
help = ‘HTTP-codes list that will be considered as good’ ,
default = ‘200,301,302,401,403’
parser . add_argument (
help = ‘IP/Domain/HTTP-codes list separator’ ,
parser . add_argument (
help = ‘Show results containing provided string’ ,
parser . add_argument (
help = ‘Hide results containing provided string’ ,
parser . add_argument (
help = ‘User-Agent value for HTTP-requests’ ,
default = ‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1’
parser . add_argument (
help = ‘HTTP port’ ,
default = 80
parser . add_argument (
help = ‘HTTPS port’ ,
default = 443
parser . add_argument (
help = ‘HTTP-request timeout’ ,
default = 5
parser . add_argument (
help = ‘Number of threads’ ,
default = 2
args = parser . parse_args ( )
return args
if __name__ == ‘__main__’ :
Ни одного комментария, какие-то import, непонятные аргументы командной строки и еще эти две последние строчки. Но будьте спокойны, все нормально, это я вам как мастер программирования на Python с 30-минутным стажем говорю. Тем более, как известно, Google не врет, а официальная документация по Python — это вообще неоспоримая истина.
Так что же мы все-таки сделали в вышеописанном фрагменте кода? Мы подключили модули для работы с аргументами коммандной строки, модули для логирования (потокобезопасные между прочим!), модуль для работы с SSL (для одной мелочи, связанной с HTTPS-запросами), модуль для создания пула потоков, и, наконец, модули для совершения HTTP-запросов, работы с IP-адресами и двухсторонней очередью (по поводу различных типов импорта можно почитать здесь).
После этого мы, в соответствии с документацией по модулю argparse, создали вспомогательную функцию, которая будет обрабатывать аргументы, переданные скрипту при запуске из командной строки. Как видите, в скрипте будет предусмотрена работа со списком доменов/IP-диапазонов, а также возможность фильтрации результатов по ключевым словам и по кодам состояния HTTP и еще пара мелочей, как, например, смена User-Agent и опциональная проверка HTTPS-версии искомого ресурса.
Последние две строки в основном используются для разделения кода, который будет выполнен при запуске самого скрипта и при импортировании в другой скрипт. В общем тут все сложно, все так пишут. Мы тоже так будем писать. Можно было бы немного модифицировать этот код, например, добавив возврат разных статусов системе в зависимости от того, как отработала функция main, добавить argv в качестве аргумента, и так далее, но мы изучаем Python только 10 минут и ленимся вчитываться в документацию.
Делаем перерыв и выпиваем глоток освежающей минеральной воды.
Источник: kaimi.io