Как правильно передать параметры в функцию?
Так как в коде присутствует слишком много подобных try/except, решил добавить универсальную функцию которая будет обрабатывать поиск через суп (естественно параметры в первом find и в findNext отличаются для разных случаях). Вот пример того, что хотел сделать (но так не сработало, перепробовал много различных вариантов, это один из наиболее наглядно описывающих проблему).
def _try_to_find_info(soup, params_first, params_second): try: return soup.find(params_first).findNext(params_second).text except AttributeError: return 'None' mileage = _try_to_find_info(soup=soup, params_first=('span', class_='label', text='Пробіг'), params_second=('span', class_='argument'))
Пробовал через *args, **kwargs — но видимо уже совсем запутался. Буду очень признателен за помощь
Python. Передача функции как аргумента. Структуры данных, содержащих перечень функций
Передача функции как аргумента. Структуры данных, содержащих перечень функций. Возврат функции из другой функции оператором return . Примеры
Поиск на других ресурсах:
1. Передача функции в качестве аргумента. Общие понятия
Любая объявленная функция может быть передана в другую функция в качестве аргумента. Поскольку каждая функция является объектом, то передается ссылка на эту функцию. Функция, которая получает ссылку может по этой ссылке вызывать другую функцию соблюдая правильное задание количества и типа параметров.
В общем случае передача функции в качестве параметра выглядит следующим образом
# Функция, которая будет передана в другую функцию def FuncArg(parameters1): . # Функция, получающая ссылку на функцию FuncArg как параметр def Func(FuncArg, parameters2): .
- FuncArg — функция, ссылка на которую передается в другую функцию. Имя функции ( FuncArg ) есть ссылкой на функцию;
- Func — имя функции, которая получает входным параметром ссылку на функцию FuncArg ;
- parameters1 , parameters2 — соответственно параметры функций FuncArg() и Func() .
2. Примеры передачи функции в качестве аргумента
2.1. Решение квадратного уравнения. Передача функции, вычисляющей дискриминант в качестве аргумента
В примере реализована функция SquareRoot() , которая возвращает корни квадратного уравнения. Функция получает 4 параметра:
- func — имя ссылки на функцию;
- a , b , c — коэффициенты квадратного уравнения.
В теле функции SquareRoot() осуществляется вызов функции-параметра func() . При вызове указываются 3 параметра a , b , c .
Чтобы не было ошибки, при вызове функции SquareRoot() из другого кода, нужно, чтобы имя ссылки соответствовало (ассоциировалось) функции, получающей строго 3 параметра. В противном случае, будет сгенерирована ошибка.
# Функция SquareRoot(), которая получает ссылку на некоторую функцию. # Функция вовращает решение квадратного уравнения в виде списка. # Если уравнение не имеет корней, функция возвращает пустой список. def SquareRoot(func, a, b, c): D = func(a, b, c) # вызов функции с 3-мя параметрами if (D<0): return [] # уравнение не имеет решения else: x1 = (-b - math.sqrt(D))/(2*a) x2 = (-b + math.sqrt(D))/(2*a) return [x1, x2] # Функция, которая вычисляет дискриминант def Discr(a, b, c): # функция получает 3 параметра return b*b - 4*a*c # Передача функции Discr() как параметра в функцию SquareRoot() roots = SquareRoot(Discr, 2, 1, -1) if roots != []: print("x1 color: #800080;">print("x2 color: #ff6600;">else: print("The equation has no roots")
Результат выполнения программы
x1 = -1.0 x2 = 0.5
2.2. Пример передачи в функцию ссылки на функцию. Выполнение базовых операций над комплексными числами
В примере реализовано 5 функций:
- AddComplex() — возвращает сумму двух комплексных чисел в виде кортежа;
- SubComplex() — возвращает разницу двух комплексных чисел в виде кортежа;
- MulComplex() — возвращает произведение двух комплексных чисел;
- DivComplex() — возвращает результат деления двух комплексных чисел. В случае деления на 0 функция возвращает пустой кортеж;
- OperationComplex() — выполняет одну из четырех операций по ссылкам на соответствующие методы.
Результат выполнения программы
11111111 10D
2.4. Пример передачи в функцию двух ссылок на функции, которые оперируют числами
В примере демонстрируется передача двух ссылок на функции в качестве параметров. Заданы две функции:
- SumNumbers() — определяет сумму цифр числа, которое задается входным параметром;
- MaxDigit() — определяет максимальную цифру числа, которое есть входным параметром.
С помощью функции OperationNumber() осуществляется вызов функций SumNumbers() и MaxDigit() . Функции SumNumbers() и MaxDigit() передаются в функцию OperationNumber() в качестве параметров.
# Функция, вычисляющая сумму цифр числа def SumNumbers(n): summ = 0 # искомая сумма n2 = n while n>0: t = n%10 # выделить последнюю цифру summ += t n = n//10 # уменьшить n print("The sum of digits of number ", n2, " color: #ff6600;">return summ # Функция, вычисляющая максимальную цифру числа и выводящая ее на экран def MaxDigit(n): maxD = 0 n2 = n while n>0: t = n%10 if t>maxD: maxD = t n = n//10 print("Max digit of number ", n2, " color: #ff6600;">return maxD # Функция, которая получает две ссылки на функции def OperationNumber(n, fn1, fn2): fn1(n) # вызвать функцию fn1 fn2(n) # вызвать функцию fn2 # Вычислить и вывести максимальную цифру и сумму цифр числа 2852 OperationNumber(2852, MaxDigit, SumNumbers)
3. Структуры данных, содержащие перечень функций
Поскольку функции являются объектами, то существует возможность создавать различные структуры данных, содержащих функции. При создании таких структур данных, каждую функцию и перечень ее параметров формируют в виде кортежа.
Например, список функций с одним параметром может быть таким
LF = [ (func1, param1), (func2, param2), . (funcN, paramN) ]
- func1 , func2 , …, funcN – перечень имен функций или ссылок на функции;
- param1 , param2 , …, paramN – перечень параметров соответственно функций func1 , func2 , …, funcN .
После такого описания можно вызвать функцию как элемент списка по образцу
LF[0][0](LF[0][1]) # вызов func1(param1)
- имя LF[0][0] будет заменено именем func1 ;
- имя LF[0][1] будет заменено именем param1 .
4. Пример списка функций. Массив вызовов функции Convert_2_to_10() , которая конвертирует число из двоичной системы исчисления в десятичную
В примере формируется список ListConvert , содержащий кортежи, состоящие из имени функции Convert_2_to_10() и параметра-строки. Функция Convert_2_to_10() конвертирует число из двоичной системы исчисления в десятичную систему исчисления. Функция получает входным параметром число в виде строки и возвращает преобразованное число также в виде строки.
# Создание списка функций с параметрами для их дальнейшего вызова import math # Функция, конвертирующая число из двоичной системы исчисления в десятичную. def Convert_2_to_10(s): # Проверка строки s на корректность for c in s: if (c!='0')and(c!='1'): return "" # выход, если недопустимые символы в строке num = 0 # результирующее число типа int power = 0 # текущая степень i = 0 while ilen(s): bit = int(s[len(s)-i-1]) # получить один бит от конца строки power = int(math.pow(2, i)) # получить 2^i как целое число num = num + power*bit # увеличить число i = i+1 # Конвертировать число num в строку return str(num) # Функция, которая вызывает другую функцию с параметром s def Convert(func, s): return func(s) # Конвертировать число 10010 в десятичную систему исчисления n = Convert(Convert_2_to_10, "10010") print("n color: #ff0000;"># Создать список вызовов функций Convert_2_to_10() ListConvert = [ (Convert_2_to_10, "100111"), (Convert_2_to_10, "1111"), (Convert_2_to_10, "10001") ] n2 = ListConvert[0][0](ListConvert[0][1]) # Вызов функции Convert_2_to_10("100111") print("n2 color: #ff0000;"># Обход списка for (fn, param) in ListConvert: snum = fn(param) # Вызвать функцию с параметром print("snum color: #333300;">⇑5. Возврат функции из другой функции оператором return. Пример
Функции могут создаваться и возвращаться другими функциями. В наиболее общем случае, создание и возвращение функции выглядит следующим образом:
def FuncOut(parameters1): . # Объявление функции FuncIn() внутри функции FuncOut() def FuncIn(parameters2): # код функции FuncIn() . # Вернуть функцию FuncIn() return FuncInПосле такого объявления, использование функции FuncOut() может быть, например, таким
refFn = FuncOut(parameters1) refFn(parameters2)Пример. В примере в функции ProcessList() реализована функция AvgList() , которая возвращает среднее арифметическое элементов списка, который есть входным параметром функции ProcessList() . Результатом работы функции ProcessList() является функция AvgList() .
# Возврат функции оператором return. # Функция, возвращающая другую функцию. def ProcessList (L): # Внутри функции ProcessList() реалізована другая функция AvgList() def AvgList (L): summ = 0 for item in L: summ = summ + item return summ/ len (L) # Вернуть функцию AvgList(L) return AvgList # Демонстрация использования функций ProcessList() и AvgList() # Создать некоторый набор чисел LL = [ 2, 7, 3, 4, 0, 2, 3] # присвоить ссылке fnAvg функцию ProcessList.AvgList() fnAvg = ProcessList(LL) # Вызвать функцию AvgList() по ссылке average = fnAvg(LL) # Вывести результат print ( "average color: #333300;">⇑
Связанные темы
Параметры и аргументы функции
В программировании функции могут не только возвращать данные, но также принимать их, что реализуется с помощью так называемых параметров, которые указываются в скобках в заголовке функции. Количество параметров может быть любым.
Параметры представляют собой локальные переменные, которым присваиваются значения в момент вызова функции. Конкретные значения, которые передаются в функцию при ее вызове, будем называть аргументами. Следует иметь в виду, что встречается иная терминология. Например, формальные параметры и фактические параметры. В Python же обычно все называют аргументами.
Рассмотрим схему и поясняющий ее пример:
Когда функция вызывается, то ей передаются аргументы. В примере указаны глобальные переменные num1 и num2 . Однако на самом деле передаются не эти переменные, а их значения. В данном случае числа 100 и 12. Другими словами, мы могли бы писать mathem(100, 12) . Разницы не было бы.
Когда интерпретатор переходит к функции, чтобы начать ее исполнение, он присваивает переменным-параметрам переданные в функцию значения-аргументы. В примере переменной a будет присвоено 100, b будет присвоено 12.
Изменение значений a и b в теле функции никак не скажется на значениях переменных num1 и num2 . Они останутся прежними. В Python такое поведение характерно для неизменяемых типов данных, к которым относятся, например, числа и строки. Говорят, что в функцию данные передаются по значению. Можно сказать, когда a присваивалось число 100, то это было уже другое число, не то, на которое ссылается переменная num1 . Число 100 было скопировано и помещено в отдельную ячейку памяти для переменной a .
На самом деле переменная a в момент присваивания значения может указывать на то же число 100, что и переменная num1 . Однако, когда a в результате вычислений в теле функции получает новое значение, то связывается с другой ячейкой памяти, потому что числа относятся к неизменяемым типам данных, то есть нельзя переписать значение содержащей их ячейки. При этом переменная num1 остается связанной со старым значением.
Существуют изменяемые типы данных. Для Питона, это, например, списки и словари. В этом случае данные передаются по ссылке. В функцию передается ссылка на них, а не сами данные. И эта ссылка связывается с локальной переменной. Изменения таких данных через локальную переменную обнаруживаются при обращении к ним через глобальную. Это есть следствие того, что несколько переменных ссылаются на одни и те же данные, на одну и ту же область памяти.
Необходимость передачи по ссылке связана в первую очередь с экономией памяти. Сложные типы данных, по сути представляющие собой структуры данных, обычно копировать не целесообразно. Однако, если надо, всегда можно сделать это принудительно.
Произвольное количество аргументов
Обратим внимание еще на один момент. Количество аргументов и параметров совпадает. Нельзя передать три аргумента, если функция принимает только два. Нельзя передать один аргумент, если функция требует два обязательных. В рассмотренном примере они обязательные.
Однако в Python у функций бывают параметры, которым уже присвоено значение по-умолчанию. В таком случае, при вызове можно не передавать соответствующие этим параметрам аргументы. Хотя можно и передать. Тогда значение по умолчанию заменится на переданное.
def cylinder(h, r = 1): side = 2 * 3.14 * r * h circle = 3.14 * r**2 full = side + 2 * circle return full figure1 = cylinder(4, 3) figure2 = cylinder(5) print(figure1) print(figure2)131.88 37.68При втором вызове cylinder() мы указываем только один аргумент. Он будет присвоен переменной-параметру h . Переменная r будет равна 1.
Согласно правилам синтаксиса Python при определении функции параметры, которым присваивается значение по-умолчанию должны следовать (находиться сзади) за параметрами, не имеющими значений по умолчанию.
А вот при вызове функции, можно явно указывать, какое значение соответствует какому параметру. В этом случае их порядок не играет роли:
… figure3 = cylinder(10, 2) figure4 = cylinder(r=2, h=10) print(figure3) print(figure4)В данном случае оба вызова – это вызовы с одними и теми же аргументами-значениями. Просто в первом случае сопоставление параметрам-переменным идет в порядке следования. Во-втором случае – по ключам, которыми выступают имена параметров.
В Python определения и вызовы функций имеют и другие нюансы, рассмотрение которых мы пока опустим, так как они требуют более глубоких знаний, чем у нас есть на данный момент. Скажем лишь, что функции может быть определена так, что в нее можно передать хоть ни одного аргумента, хоть множество:
def few_or_many(*a): print(a) few_or_many(1) few_or_many('1', 1, 2, 'abc') few_or_many()(1,) ('1', 1, 2, 'abc') ()Опять же, судя по скобкам, здесь возникает упомянутый в прошлом уроке кортеж.
Практическая работа
Напишите программу, в которой определена функция int_test , имеющая один параметр. Функция проверяет, можно ли переданное ей значение преобразовать к целому числу. Если можно, возвращает логическое True . Если нельзя – False .
В основной ветке программы присвойте переменной s то, что пользователь вводит с клавиатуры. Вызовите функцию int_test() , передав ей значение s . Если функция возвращает истину, преобразуйте строку s в число n и выведите на экран значение n + 10 .
Примеры решения и дополнительные уроки в pdf-версии курса
X Скрыть Наверх
Python. Введение в программирование
Функции в Python для начинающих
В этой части мы изучим функции — составные инструкции, которые могут принимать данные ввода, выполнять указания и возвращать данные вывода. Функции позволяют определять и повторно использовать определенную функциональность в компактной форме.
Вызвать функцию — значит передать ей входные данные, необходимые для выполнения и возвращения результата. Когда вы передаете функции входные данные, это называется передача параметра функции.
Функции в Python похожи на математические функции из алгебры. Например, в алгебре функция определяется как-то так:
f(x) = x * 2Левая часть определяет функцию f , принимающую один параметр, x . А правая часть — это определение функции, которое использует переданный параметр x , чтобы произвести вычисление и вернуть результат. В этом случае значением функции является ее параметр, умноженный на два.
Как в Python функция записывается следующим образом: имя_функции(параметры_через_запятую) . Чтобы вызвать функцию, после ее имени нужно указать круглые скобки и поместить внутрь параметры, отделив каждый из них запятой. Для создания функций в Python выберите ее имя, определите параметры, укажите, что функция должна делать и какое значение возвращать.
def имя_функции(параметры): определениие_функцииМатематическая функция f(x) = x * 2 в Python будет выглядеть вот так:
def f(x):return x * 2Ключевое слово def сообщает Python, что вы определяете функцию. После def вы указываете имя функции; оно должно отвечать тем же правилам, что и имена переменных. Согласно конвенции, в имени функции нельзя использовать заглавные буквы, а слова должны быть разделены подчеркиванием вот_так .
Как только вы присвоили своей функции имя, укажите после него круглые скобки. Внутри скобок должен содержаться один или несколько параметров.
После скобок ставится двоеточие, а новая строка начинается с отступа в четыре пробела. Любой код с отступом в четыре пробела после двоеточия является телом функции. В этом случае тело нашей функции состоит только из одной строки:
return x * 2Ключевое слово return используется для определения значения, которое функция возвращает при вызове.
Чтобы вызвать функцию в Python, мы используем синтаксис имя_функции(параметры, через, запятую) .
Ниже описан вызов функции f из предыдущего примера с параметром 2 .
Консоль ничего не вывела. Можно сохранить вывод вашей функции в переменной и передать ее функции print .
# Продолжение# предыдущего примераdef f(x):return x * 2result = f(2)print(result) # 4Вы можете сохранить результат, возвращаемый вашей функцией, в переменной и использовать это значение в программе позднее.
def f(x):return x + 1z = f(4)if z == 5:print("z равно 5")else:print ("z не равно 5")У функции может быть один параметр, несколько параметров или вообще их не быть. Чтобы определить функцию, не требующую параметров, оставьте круглые скобки пустыми.
def f():return 1 + 1result = f()print(result) # 2Если хотите, чтобы функция принимала больше одного параметра, отделите каждый параметр в скобках запятой.
def f(x, y, z):return x + y + zresult = f(1, 2, 3)print(result) # 6Наконец, функция не обязана содержать инструкцию return. Если функции нечего возвращать, она возвращает значение None .
def f():z = 1 + 1result = f()print(result) # NoneОбязательные и необязательные параметры ¶
Функция может принимать параметры двух типов. Те, что встречались вам до этого, называются обязательными параметрами. Когда пользователь вызывает функцию, он должен передать в нее все обязательные параметры, иначе Python сгенерирует исключение.
В Python есть и другой вид параметров — опциональные. Опциональные параметры определяются с помощью следующего синтаксиса: имя_функции(имя_параметра = значение_параметра) . Как и обязательные, опциональные параметры нужно отделять запятыми. Ниже приведен пример функции, в коде которой используется опциональный параметр.
def f(x=2):return x**xprint (f()) # 4print (f(4)) # 16Сначала функция вызывается без передачи параметра. Так как параметр необязательный, x автоматически становится равен 2 , и функция возвращает 4 .
Затем та же функция вызывается с параметром 4 . То есть x будет равен 4 и функция вернет 16 . Вы можете определить функцию, которая принимает как обязательные, так и опциональные параметры, но обязательные нужно определять в первую очередь.
def add(x, y=10):return x + yresult = add(2)print(result)Хотите выучить Python на практике?