Как программе передать параметры

Существует два способа передачи параметров. Первый способ — передача по значению. Смысл этого способа в том, что мы передаём подпрограмме конкретное значение — число, текст, логическое значение и т.д. Подпрограмма каким-либо образом использует это значение.

При этом, из внешней программы передавать эти параметры можно было как явным указанием значения (например, указав число прямо в коде программы), так и передавая переменную или константу — использовалось соответствующее значение переменной / константы. Но такой способ не всегда удобен.

Более того, в случае, если подпрограмма должна вычислить сразу несколько значений, этот способ не принесёт успеха. Именно поэтому существует другой способ передачи параметров — передача по ссылке. Смысл этого способа в том, что мы передаём не конкретное значение, а ячейку памяти, т.е. переменную. В чём же отличие?

А отличие в том, что подпрограмма уже может работать с этой переменной, т.е. не только получать её значение, но и это значение менять! Получается, что мы берём переменную из основной программы, «отдаём» её подпрограмме, та, в свою очередь, производит какие-то манипуляции с ней, и в результате наша переменная получает новое значение и мы можем далее её использовать. Несложно догадаться, что такой подход позволит подпрограмме отдавать сразу несколько значений (причём не обязательно одного типа).Для передачи по значению никаких изменений в подпрограмму вносить не нужно — это способ передачи по умолчанию. А вот для передачи по ссылке нужно всего лишь в описании подпрограммы добавить слово var перед нужными параметрами.

Как передать параметры в GET запросе?

Источник: studopedia.su

Как программе передать параметры

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

тип имя_функции (тип параметр1, тип параметр2. тип параметрN)

Для каждого параметра сначала указывается тип, а затем название параметра. Через запятую определяется следующий параметр.

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

#include // функция принимает массив символов void print_message(char message[]) < printf(«%sn», message); >int main(void)

Здесь функция print_message() принимает один параметр, который называется message и который имеет тип char[] . Параметр message еще называется формальным параметром

В функции main три раза вызываем функцию print_message, передавая ей разные значения — строки «Hello METANIT.COM!», «Hello World!» и «Hello work. «. Эти значения еще называют аргументами . Таким образом, на консоль будут выведены три строки:

Передача параметров в функцию по ссылке. Разница между ссылкой и указателем. Урок #51


Hello METANIT.COM! Hello World! Hello work.

Прототип функции print_message() выглядел бы следующим образом:

void print_message(char[]);

Полный пример с прототипом:

#include // прототип функции print_message void print_message(char[]); int main(void) < print_message(«Hello METANIT.COM!»); >// определение функции print_message void print_message(char message[])

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

#include void sum(int x, int y) < printf(«%d + %d = %d n», x, y, x + y); >int main(void)

Функция sum() принимает два параметра типа int .

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

1 + 2 = 3 4 + 5 = 9 6 + 2 = 8

Прототип функции sum выглядел бы следующим образом:

void sum(int, int);

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

Например, выше использовалась функция void sum(int, int) . Если мы передадим в sum значения другого типа, то компилятор будет пытаться привести их к типу int:

int main(void) < sum(1.4, 2.5); // передаем значения double sum(1.4f, 2.5f); // передаем значения float >

В обоих случаях фактически функция sum получить числа 1 и 2.

Читайте также:
Как ограничить программе ресурсы процессора

Процесс передачи параметров

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

#include void increase(int x) < x = 2 * x; printf(«Increase func: x = %d n», x); >int main(void)

Функция increase через параметр получает число и увеличивает его в два раза.

В функции main вызываем функцию increase, передавая ей значение переменной a . И после того, как функция increase отработала и изменила значение своего параметра, проверяем значение переменной a .

И при выполнении мы увидим, что изменения аргументов в функции increase действуют только в рамках этой функции. Вне ее значение переменной a остается неизменным:

Increase func: x = 50 Main func: a = 25

Почему так происходит? При компиляции функции для ее параметров выделяются отдельные участки памяти. При этом для параметров типа float формируются в памяти объекты типа double , а для параметров типов char и short int — объекты типа int .

При вызове функции вычисляются значения аргументов, которые передаются на место параметров. И затем значения аргументов заносятся в участки памяти, отведенные для параметров. При этом значения типа float преобразуются в объекты типа double , а объекты типов char и short int — в объекты типа int .

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

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

Константные параметры

Как программе передать параметры

Для вызова такой функции достаточно написать ее название:

my_function()
Привет от Python

А это пример простейшей функции с параметром:

def my_function(name): print(f’Привет, ‘)

При вызове функция получает аргумент:

my_function(‘Вася’)
Привет, Вася

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

def my_function(name, lastname): print(f’Добрый день, ‘)

Если передать в функцию два аргумента – my_function(‘Егор’, ‘Куликов’) , результат вызова будет таким:

Добрый день, Егор Куликов

Но если число аргументов окажется меньше числа параметров – my_function(‘Алена’) , возникнет ошибка:

my_function(‘Алена’) TypeError: my_function() missing 1 required positional argument: ‘lastname’
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста»

Порядок обработки позиционных аргументов

Python обрабатывает позиционные аргументы слева направо:

def my_function(name, last_name, occupation, age): print(f’Сотрудник #1 — ‘) info1, info2, info3, info4 = ‘Алиса’, ‘Селезнева’, ‘скрам-мастер’, 30 my_function(info1, info2, info3, info4) my_function(info2, info3, info1, info4) my_function(info4, info1, info2, info3)
Сотрудник #1 — Алиса Селезнева скрам-мастер 30 Сотрудник #1 — Селезнева скрам-мастер Алиса 30 Сотрудник #1 — 30 Алиса Селезнева скрам-мастер

Аргументы по умолчанию

Функция может использовать аргументы по умолчанию – они указываются после позиционных:

def my_function(strt, build, ap, city=’Москва’): print(f’Адрес: г., ул., д., кв.’) my_function(‘Красная’, ‘5’, ‘3’, ‘Тула’) my_function(‘Красная’, ‘5’, ‘3’) Результат: Адрес: г.Тула, ул.Красная, д.5, кв.3 Адрес: г.Москва, ул.Красная, д.5, кв.3

Именованные аргументы

Помимо позиционных, в функцию можно передать именованные аргументы, причем порядок передачи именованных аргументов при вызове функции может не совпадать с порядком параметров:

def sales_price(price, discount=5): return price — price * discount / 100 print(sales_price(5000)) print(sales_price(5000, discount=10)) print(sales_price(discount=15, price=5000))
4750.0 4500.0 4250.0

Произвольное количество позиционных аргументов *args

До сих пор мы передавали в функцию определенное, заранее известное число позиционных аргументов. Если в функцию нужно передать произвольное количество аргументов, используют * args :

def my_function(*args): print(f’Минимальное число: , максимальное: ‘) my_function(1, 4, 5, 2, -5, 0, 12, 11)
Минимальное число: -5, максимальное: 12

При использовании *args функция получает кортеж аргументов, и к ним можно обращаться так же, как к элементам кортежа:

def my_function(*args): print(f’Первое слово: , последнее слово: ‘) my_function(‘яблоко’, ‘виноград’, ‘апельсин’, ‘арбуз’, ‘слива’, ‘груша’)
Первое слово: яблоко, последнее слово: груша

Название набора параметров, * args , используется по умолчанию. При желании его можно изменить на любое другое название с * в начале:

def my_function(*cities): print(f’Первый город: , третий город: ‘) my_function(‘Тюмень’, ‘Москва’, ‘Орел’, ‘Новгород’, ‘Ижевск’, ‘Ульяновск’)
Первый город: Тюмень, третий город: Орел

Аргументы *args обрабатываются после позиционных, но до аргументов по умолчанию:

def my_function(x, y, *args, kx=15, ky=15): print(x, y, args, kx, ky) my_function(5, 6, 7, 8, 9, 0, 4)
5 6 (7, 8, 9, 0, 4) 15 15

Произвольное количество именованных аргументов **kwargs

Как уже было отмечено выше, именованные аргументы передаются в функцию в виде пар ключ=значение :

Читайте также:
Хроники акаши как узнать свою программу

def my_function(cat1, cat2, cat3): print(f’Младший кот: , старший кот: ‘) my_function(cat1=’Том’, cat2=’Барсик’, cat3=’Полосатик’)
Младший кот: Том, старший кот: Барсик

В приведенном выше примере количество именованных аргументов известно заранее. Если в функцию нужно передать произвольное количество пар ключ=значение , используют параметр ** kwargs . С **kwargs работают все методы словарей:

def my_function(**kwargs): print(f’Самый легкий металл — , самый тяжелый — ‘) my_function(осмий=22.61, цинк=7.1, золото=19.3, ртуть=13.6, олово=7.3)
Самый легкий металл — цинк 7.1, самый тяжелый — осмий 22.61

Как и в случае с * args , название по умолчанию ** kwargs при желании можно заменить на любое другое с ** в начале:

def my_function(**countries): print(f’Самая густонаселенная страна — чел/км2, самая малонаселенная — чел/км2′) my_function(Мальта=1432, Дания=128, Монако=18679, Индия=357, Монголия=2)
Самая густонаселенная страна — Монако 18679 чел/км2, самая малонаселенная — Монголия 2 чел/км2

Аргументы типа **kwargs обрабатываются после позиционных, *args и аргументов по умолчанию:

def my_function(x, y, *args, kx=15, ky=15, **kwargs): print(x, y, args, kx, ky, kwargs) my_function(7, 8, 0, 3, 4, 1, 8, 9, север=15, запад=25, восток=45, юг=10)
7 8 (0, 3, 4, 1, 8, 9) 15 15

Передача аргументов в виде списка

Помимо кортежей и словарей, в функции можно передавать списки:

def my_function(stationery): for i, j in enumerate(stationery): print(f’Товар # — ‘) stuff = [‘карандаш’, ‘ручка’, ‘блокнот’, ‘альбом’, ‘тетрадь’, ‘ластик’] my_function(stuff)
Товар #1 — карандаш Товар #2 — ручка Товар #3 — блокнот Товар #4 — альбом Товар #5 — тетрадь Товар #6 — ластик

Заглушка pass

Тело функции не может быть пустым – это приведет к сообщению об ошибке:

def my_function(): Вывод: def my_function(): ^ SyntaxError: unexpected EOF while parsing

Если по какой-то причине нужно оставить тело функции пустым, используют оператор pass , который выступает в роли заглушки:

def my_function(): pass

Функции с возвратом значений

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

def my_function(*args): prod = 1 for i in args: prod *= i return prod print(my_function(5, 6, 3, 11))

Значения передаются в функцию при вызове – print(my_function(5, 6, 3, 11)) . Результат при таком наборе цифр будет равен 990 . Оператор return может возвращать любое количество значений, причем значения возвращаются в виде кортежа:

def calculations(a, b): summa = a + b diff = a — b mul = a * b div = a / b return summa, diff, mul, div num1, num2 = int(input()), int(input()) summa, diff, mul, div = calculations(num1, num2) print( f’Сумма: n’ f’Разница: n’ f’Произведение: n’ f’Результат деления: n’ )
49 6
Сумма: 55 Разница: 43 Произведение: 294 Результат деления: 8.17

Функция может содержать любое количество return . Эта функция возвращает различные оценки индекса массы тела:

def bmi(h, w): bmi = w / (h / 100) ** 2 if bmi
Введите рост в см: 172 Введите вес в кг: 61
Вес в норме

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

def bmi(h, w): bmi = w / (h / 100) ** 2 if bmi

Практика

Задание 1

Напишите функцию для вывода треугольника. Функция принимает два аргумента – size (размер сторон треугольника) и symb (символ, используемый для заполнения треугольника).

Пример ввода:

def draw_triangle(size, symb): for i in range(1, size + 1): print(symb * min(i, size — i + 1)) size, symb = int(input()), input() draw_triangle(size, symb)

Задание 2

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

Пример вызова:

print(arith_mean(5, 5, 15, 25, 35))
def arith_mean(*args): summa = 0 kol = 0 for i in args: summa += i kol += 1 return summa / kol

Задание 3

Напишите функцию, которая:

  • принимает строку, состоящую из букв, цифр и специальных символов;
  • формирует три списка – 1) из цифр, 2) из букв, 3) из спецсимволов;
  • выводит списки на экран.

Пример ввода:

23edwd893rjf934#$%Ye34F^(*))_+W$#Ddq2ddscew3r
2 3 8 9 3 9 3 4 3 4 2 3 e d w d r j f Y e F W D d q d d s c e w r # $ % ^ ( * ) ) _ + $ #
def sort_list(st): digits = [i for i in st if i.isdigit()] letters = [i for i in st if i.isalpha()] spec_char = [i for i in st if not i.isalnum()] print(*digits) print(*letters) print(*spec_char) my_st = input() sort_list(my_st)

Задание 4

Напишите функцию, которая начисляет новогодние премии сотрудникам. Эта функция:

  • имеет два аргумента по умолчанию – salary=120000 и bonus=10 (оклад и премия);
  • получает два позиционных аргумента name и last_name – имя и фамилию сотрудника;
  • учитывает индивидуальные оклад и премию (см. примеры вызова);
  • выводит размер новогодней премии для сотрудника и зарплату с учетом премии.
Читайте также:
Как называется процесс выполнения программы с намерением найти ошибки

Примеры вызова функции:

ny_bonus(‘Алина’, ‘Тимофеева’, salary=150000, bonus=25) ny_bonus(‘Алексей’, ‘Ковалев’, bonus=15) ny_bonus(‘Игорь’, ‘Ефимов’) ny_bonus(‘Анастасия’, ‘Яковлева’, salary=100000, bonus=20)
Новогодняя премия сотрудника Алина Тимофеева: 37500.00 руб. Оклад: 150000.00 руб. Всего к выдаче: 187500.00 руб. Новогодняя премия сотрудника Алексей Ковалев: 18000.00 руб. Оклад: 120000.00 руб. Всего к выдаче: 138000.00 руб.

Новогодняя премия сотрудника Игорь Ефимов: 12000.00 руб. Оклад: 120000.00 руб. Всего к выдаче: 132000.00 руб. Новогодняя премия сотрудника Анастасия Яковлева: 20000.00 руб. Оклад: 100000.00 руб. Всего к выдаче: 120000.00 руб.

def ny_bonus(name, last_name, salary=120000, bonus=10): print(f’Новогодняя премия сотрудника : руб.n’ f’Оклад: руб.n’ f’Всего к выдаче: руб.n’)

Задание 5

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

Пример ввода:

5 7 8 9 34 28
Есть
def perfect_number(n): sum = 0 for i in range(1, n): if n % i == 0: sum += i return sum == n numbers = list(map(int, input().split())) flag = ‘Нет’ for i in numbers: if perfect_number(i): flag = ‘Есть’ break print(flag)

Задание 6

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

Пример ввода:

12 5
def factorial(num): if num

Задание 7

Напишите функцию, которая принимает число от 1 до 99, и возвращает его словесное описание.

Пример ввода:

двадцать пять
def spell_number(num): ed = [‘один’, ‘два’, ‘три’, ‘четыре’, ‘пять’, ‘шесть’, ‘семь’, ‘восемь’, ‘девять’, ‘десять’, ‘одиннадцать’, ‘двенадцать’, ‘тринадцать’, ‘четырнадцать’, ‘пятнадцать’, ‘шестнадцать’, ‘семнадцать’, ‘восемнадцать’, ‘девятнадцать’] des = [‘двадцать’, ‘тридцать’, ‘сорок’, ‘пятьдесят’, ‘шестьдесят’, ‘семьдесят’, ‘восемьдесят’, ‘девяносто’] if num < 20: return ed[num — 1] elif num >= 20: if str(num)[1] != ‘0’: return des[int(str(num)[0]) — 2] + ‘ ‘ + ed[int(str(num)[1]) — 1] return des[int(str(num)[0]) — 2] n = int(input()) print(spell_number(n))

Задание 8

Напишите функцию, которая возвращает True , если введенная пользователем дата является магической, и False в обратном случае. Магической считается дата, в которой произведение дня и месяца равно двум последним цифрам года: 02.11.2022.

Пример ввода:

03.06.2018
True
def magic_date(date): return int(date[:2]) * int(date[3:5]) == int(date[-2:]) date = input() print(magic_date(date))

Задание 9

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

Аргументы в строке запроса должны быть отсортированы в алфавитном порядке.

Примеры вызова:

print(make_query(category=’books’, genre=’thriller’, author=’Stephen_King’)) print(make_query(name=’Егор’, last_name=’Тимохин’, age=25, occupation=’дизайнер’
author=Stephen_Kinggenre=thriller age=25name=Егор’.join([f’=’ for k in sorted(kwargs)])

Задание 10

Напишите функцию, которая принимает целое число n, и выводит на экран спиральную матрицу размера n x n, все элементы которой выровнены по левому краю.

Пример ввода:

1 2 3 4 5 6 7 8 9 32 33 34 35 36 37 38 39 10 31 56 57 58 59 60 61 40 11 30 55 72 73 74 75 62 41 12 29 54 71 80 81 76 63 42 13 28 53 70 79 78 77 64 43 14 27 52 69 68 67 66 65 44 15 26 51 50 49 48 47 46 45 16 25 24 23 22 21 20 19 18 17
def print_matrix(n): matrix = [[0] * n for i in range(n)] vx, vy = [0, 1, 0, -1], [1, 0, -1, 0] x, y, z = 0, -1, 1 for i in range(n + n — 1): for j in range((n + n — i) // 2): x += vx[i % 4] y += vy[i % 4] matrix[x][y] = z z += 1 for i in range(len(matrix)): for j in range(len(matrix[i])): print(str(matrix[i][j]).ljust(3), end=») print() print_matrix(int(input()))

Подведем итоги

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

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

  1. Особенности, сферы применения, установка, онлайн IDE
  2. Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
  3. Типы данных: преобразование и базовые операции
  4. Методы работы со строками
  5. Методы работы со списками и списковыми включениями
  6. Методы работы со словарями и генераторами словарей
  7. Методы работы с кортежами
  8. Методы работы со множествами
  9. Особенности цикла for
  10. Условный цикл while
  11. Функции с позиционными и именованными аргументами
  12. Анонимные функции
  13. Рекурсивные функции
  14. Функции высшего порядка, замыкания и декораторы
  15. Методы работы с файлами и файловой системой
  16. Регулярные выражения
  17. Основы скрапинга и парсинга
  18. Основы ООП: инкапсуляция и наследование
  19. Основы ООП – абстракция и полиморфизм
  20. Графический интерфейс на Tkinter
  21. Основы разработки игр на Pygame
  22. Основы работы с SQLite

Источник: proglib.io

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru