Это не вопрос Python, а скорее вопрос программирования.Очень простой.
Прежде чем ответить на вопрос о аргументах и с учетом других вопросов, которые вы задали, полезно обсудить концепцию переменные .
Переменная - это именованный фрагмент памяти, где информация, представляющая интерес для основной программы, может храниться и извлекаться.Другими словами, это символическое имя, выбранное программистом, которое связано с его содержимым.Используя различные языковые конструкции, обычно известные как присваивания , программист может читать или записывать содержимое переменной.
Важно отметить, что значение (то есть содержимое) переменной не должно бытьопределяется, когда программа написана.Это необходимо только во время выполнения.Это позволяет программе описывать действия, которые должны выполняться над символическими элементами, не зная точно, какое значение имеют эти элементы.Рассмотрим этот фрагмент, являющийся частью большой программы:
# ... some logic above
ball_volume = 4.0 / 3 * math.pi * ball_radius
if ball_volume > 200:
print ("Man, that's a big ball")
# ... more logic below
Во время написания программы не нужно знать фактическое значение ball_radius;тем не менее, предполагая, что эта переменная будет содержать числовое значение некоторого гипотетического шара, фрагмент способен описать, как вычислить объем шара.Таким образом, когда программа работает, и каким-то образом (подробнее об этом позже) переменная ball_radius была инициализирована с некоторым подходящим значением, переменная ball_volume также может быть инициализирована и использована здесь, в условном выражении(если) и, возможно, ниже.(В какой-то момент переменная может выйти из области видимости , но эта концепция, которая контролирует, когда конкретные переменные доступны программе, выходит далеко за рамки этого учебника).
В некоторых языках тип данныхэто может быть связано с конкретной переменной, должно быть явно определено и не может быть изменено.Например, некоторые переменные могут содержать только целочисленные значения, строковые значения других переменных (текст) и т. Д. В Python такого ограничения нет, переменная может быть назначена и переназначена для любого типа данных, но, конечно, программист долженследите за этим, например, чтобы избежать передачи некоторых текстовых данных в математическую функцию.
Данные, хранящиеся внутри переменной, могут поступать из самых разных источников.Многие из примеров, приведенных в руководствах и вводной документации, содержат эти данные, поступающие с клавиатуры (как при использовании raw_input, как упоминалось в некоторых ваших вопросах).Это потому, что он позволяет интерактивные тесты людьми, пробующими эти учебные фрагменты.Но полезность программ была бы весьма ограничена, если бы переменные получали свои данные только из интерактивного пользовательского ввода.Есть много других источников, и это делает программирование настолько мощным: переменные могут быть инициализированы с данными из:
- баз данных
- текстовых файлов или файлов различных текстовых базовых форматов (XML,JSON, CSV ..)
- двоичные файлы различных форматов
- подключения к Интернету
- физические устройства: камеры, датчики температуры ...
В двух словах, Аргументы , также называемые Параметры , переменные передаются в функцию , которая[обычно] используются для обеспечения отличного вывода и поведения от функции.Например:
>>> def say_hello(my_name):
... print("Hello,", my_name, "!")
>>> say_hello("Sam")
Hello, Sam !
>>> customer_name = "Mr Peter Clark" #imagine this info came from a database
>>> # ...
>>> say_hello(customer_name)
Hello, Mr Peter Clark !
>>>
В приведенном выше примере my_name
аналогичен любой локальной переменной функции say_hello
;это позволяет функции определять, что она будет делать с базовым значением при вызове функции во время выполнения.
Во время выполнения функцию можно вызывать с немедленным значением (значением, которое «жестко запрограммировано» в логике, например "Sam"
в примере), или с [значением] другой переменной (такой какcustomer_name
).В обоих случаях значению переменной my_name функции присваивается некоторое значение «Сэм» и «Мистер Питер Кларк» соответственно.В последнем случае это значение равно значению переменной customer_name
.Обратите внимание, что имена переменных, используемых внутри функции (my_name
) и при вызове функции (customer_name
), необязательно должны быть одинаковыми.(они называются «формальным параметром (ами)» и «фактическими параметрами» соответственно)
Обратите внимание, что, как правило, большинство аргументов передаются как input в функцию , в некоторых условиях они могут использоваться как output , то есть для предоставления новых / измененных значений на уровне логики, вызвавшей функцию.Для этого необходимо явно или неявно использовать соответствующую спецификацию соглашения о вызовах (см. Argument passing conventions
ниже)
Теперь ... за пределами этого самого базового понимания назначения параметроввсе становится немного сложнее (но не намного).В общих чертах я расскажу об этих дополнительных понятиях и проиллюстрирую их применительно к Python.
Значения по умолчанию для аргументов (иначе "необязательные" аргументы)
Когда функция объявленаможет указать значение по умолчанию для некоторых параметров.Эти значения используются для параметров, которые не указываются при вызове функции.По очевидным причинам эти необязательные параметры находятся в конце списка параметров (в противном случае компилятор / интерпретатор языка может столкнуться с трудностями при определении того, какой параметр какой ...)
>>> def say_hello(dude = "Sir"):
... print("Hello,", dude, "!")
...
>>> say_hello()
Hello, Sir !
>>> say_hello("William Gates")
Hello, Bill ! #just kidding ;-)
Hello, William Gates ! # but indeed. works as the original function when param
# is specified
Переменное числопараметры
В некоторых случаях может быть удобно определить функцию, чтобы она могла принимать переменное число параметров.В то время как такие списки значений параметров в конечном итоге передаются в каком-то контейнере (list, array, collection ...), различные языки предлагают удобные способы доступа к таким значениям параметров.
>>> def add_many(operand1, *operands):
... Sum = operand1
... for op in operands:
... Sum += op
... return Sum
...
>>> add_many(1, 3, 5, 7, 20)
36
>>> add_many(1, 3)
4
Именованные аргументы (Аргументы ключевых слов)
В Python и некоторых других языках можно явно указывать аргументы при вызове функции.В силу того, что передача аргументов по умолчанию основана на позиционном базисе («1-й аргумент, 2-й аргумент и т. Д.»), Python позволит вам именовать аргументы и передавать их в любом порядке. В основном это синтаксическая хитрость, но может быть полезной в сочетании саргументы по умолчанию для функций, которые принимают очень много аргументов. Это также хорошая функция самодокументирования.
>>> def do_greetings(greeting, person):
... print (greeting, "dear", person, "!")
...
>>> do_greetings(person="Jack", greeting="Good evening")
Good evening dear Jack !
В Python вы можете даже передать словарь вместо нескольких именованных аргументов, например, с помощью do_greetingsas-это, представьте, у вас есть словарь, как:
>>> my_param_dict = {"greeting":"Aloha", "person":"Alan"}
>>> do_greetings(**my_param_dict)
Aloha dear Alan !
В заключение, и в то время как причудливые способы передачи аргументов, а также возможность для методов обрабатывать переменное число аргументов являются полезными функциями различных языков, два ключевыхнеобходимо упомянуть следующие понятия:
Соглашение о передаче аргумента : по значению или по ссылке
До сих пор все функции, которые мы использовали, не изменяли значения параметров, передаваемых им.Однако мы можем представить множество случаев, когда функции могут захотеть сделать это, например,ей выполнить какое-либо преобразование или вычисление упомянутых значений для собственного внутреннего использования или для эффективного изменения значения переменной, чтобы изменения отражались на уровне логики, вызвавшей функцию.Вот где пригодятся соглашения о передаче аргументов ...
аргументы, которые передаются значением , могут быть изменены функцией для своих собственных внутренних вычислений, но не изменены на уровне вызывающего метода.
аргументы, которые передаются по ссылке , будут отражать изменения, внесенные в них, на уровне вызывающего метода.
Каждый язык определяет способы передачи аргументов.Типичное соглашение - передавать целые числа, числовые значения и другие базовые типы по значению и передавать объекты по ссылке.Большинство языков также предлагают ключевые слова, которые позволяют изменить их соглашение по умолчанию.
В python все аргументы передаются по ссылке.Однако некоторые типы переменных являются неизменяемыми (числа, строки, кортежи ...) и поэтому не могут быть изменены функцией.
Неявный аргумент "self" или "this" методов класса
В объектно-ориентированных языках методы (то есть функции внутри класса) получают дополнительный аргумент, который является значением базового объекта (экземпляра класса), позволяя методу использовать различные свойства-члены класса в своем классе.вычисление и / или изменение значения некоторых из этих свойств.
в Python, этот аргумент объявляется на уровне определения метода, но передается неявно.Будучи объявленным, он может быть назван почти как угодно, хотя по соглашению это обычно называется self .
>>> class Accumulator:
... def __init__(self, initialValue = 0):
... self.CurValue = initialValue
... def Add(self, x):
... self.CurValue += x
... return self.CurValue
...
>>> my_accu = Accumulator(10)
>>> my_accu.Add(5)
15
>>> my_accu.Add(3)
18