Аргументы функции (например, в Python) - PullRequest
0 голосов
/ 17 августа 2011

Что такое аргументы [функции]? Для чего они используются?
Я начал изучать Python совсем недавно;Я новичок в программировании и извиняюсь за этот основной вопрос.

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

def hi( This is the part that i dont get):
     print 'hi'

Редактировать:
Два последующих вопроса, связанных с этим, были позже закрыты и объединены здесь, отсюда и частичная неконтрольная чертанекоторых ответов.
Следующие вопросы были: [перефразировано]

Ответы [ 7 ]

10 голосов
/ 17 августа 2011

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

http://en.wikipedia.org/wiki/Function_argument

Например, вашей функции hi() может потребоваться узнать, кому передать привет:

def hi(person):
    print "Hi there " + person + ", how are you?"

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

def square(x):
     return x * x
5 голосов
/ 17 августа 2011

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

def add(num1, num2):
  x = num1 + num2
  return x
add(1,3)

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

В соответствии со вторым вопросом аргументы - это просто переменные, передаваемые в функцию, поэтому независимо от того, какую переменную вы передаете ей извне, например, я передаю числа 1 и 3 своей функции add внутри этой функции, они просто упоминается как num1 num2.

В вашем случае, если передать слишком много аргументов, вы получите:

>>> add(1,2)
3
>>> add(1,2,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: add() takes exactly 2 arguments (3 given)
>>> 

Удачи! и не стесняйтесь, напишите мне по электронной почте, если вам нужна дополнительная помощь (sbrichards (at) mit.edu)

5 голосов
/ 17 августа 2011

Это не вопрос 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
2 голосов
/ 17 августа 2011

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

def hi(word):
    print word

сейчас, если я сделаю что-то вроде этого:

hi('Hello!')

будет напечатано:

'Hello!'

hi () передается'Hello!' как переменная с именем word, и затем она печатает это слово.

1 голос
/ 17 августа 2011

Аргумент - это специальная переменная, которая существует только в этой функции.

В вашем примере у вас есть функция, которая принимает 2 аргумента:

def add(num1,num2):
    x = num1 + num2
    return x

Когда я вызываю эту функцию с помощью add(), я должен добавить в скобки то, что хочу num1 и num2.В вашем случае у вас есть 1 и 3, поэтому вы называете это следующим образом add(1,3).

То, что вы говорите, это то, что вы хотите позвонить add(), и вы хотите первыйаргумент num1 равен 1, а второй аргумент num2 равен 3.

1 голос
/ 17 августа 2011

В вашем примере они не используются.

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

def hi_name(name):
    print 'Hi ' + name

hi_name("John doe")

Это напечатано "Привет, Джон Доу". ​​

Теперь вернемся к основам о функциях .

0 голосов
/ 17 августа 2011

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

def GiveMeANumberAndIDuplicateIt(x):
    return x * 2

def DontGiveMeAnythingAtAll():
    return None
...