Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чаплыгин А.Н. Учимся програмировать вместе с Пи...doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

§3.7. Параметры и аргументы

Итак, мы научились создавать собственные функции и различать определения и вызовы функций. Теперь определимся с терминологией: чем отличается параметр функции от ее аргумента? Разница есть и большая, но вы могли ее не уловить.

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

>»

def printAnything(obj print object

ect) :

>»

printAnything("Some s

tring")

Some string

>»

number = 15

>»

printAnything(number)

15

Здесь переменная object является параметром, а строка "Some string" и переменная number - аргументами. Таким образом, правильно будет сказать «передать аргумент» или «передать значение в качестве параметра», но не «передать функции параметр». Старайтесь не путать эти понятия.

§3.8. Локальные переменные

Вернемся к функции поиска корней квадратного уравнения PrintRoots (). Она выглядит приблизительно так:

def printRoots(a, b, с):

40

Ревизия: 170

Функции

D = b**2 -

4 * a

*

С

import

math

xl = (-

-b +

math.

sqrt(D))

/

2

*

a

x2 = (-

-b -

math.

sqrt(D))

/

2

*

a

print

'xl =

= ', xl

r

'\nx2 =

_ ?

/

x2

Последовательность символов \п в последней строке тела функции дает указание команде print перейти на новую строку. В теле функции определено три переменные: D, xl и х2. Такие переменные называют локальными, т.к. к ним можно обратиться только в самом теле функции. После завершения работы функции они стираются из памяти. Это может проиллюстрировать следующая программа:

def printRoots

(a, b,

c) :

D = b**2 -

4 * a

* с

import

math

xl = (

-b +

math.

sqrt(D))

/

2

*

a

x2 = (

-b -

math.

sqrt(D))

/

2

*

a

print

'xl =

= ', xl

, '\nx2 =

_ ?

/

x2

printRoots

(1.0,

o, -

1.0)

print D

Если запустить ее, то интерпретатор сразу после завершения работы функции

PrintRoots () выведет ошибку вида:

$ python p

rog5.py

xl = 1.0

х2 = -1.0

Traceback

(most recent

call

las

t) :

File "prog5.py",

line

12,

in

9

print

D

NameError:

name 'D

is

not

defined

Почему было выбрано такое поведение? Как вы думаете? Модифицируем нашу программу таким образом:

def printRoots(a, b, с):

D = b**2 - 4 * а * с

import math

print "In function D = ", D

xl = (-b + math.sqrt(D)) / 2 *

a

x2 = (-b - math.sqrt(D)) / 2 *

a

print "xl =", xl, "\nx2 =", x2

41

Ревизия: 170

Функции

D = 'test'

print "Before function call D = ", D

printRoots(1.0, 0, -1.0)

print "After function call D = ", D

Запустим программу и проанализируем результат.

$ python prog5.

РУ

Before function call D

= test

In function D =

= 4

0

xl = 1.0

x2 = -1.0

After function

call D =

test

Итак, после определения функции printRoots () мы присвоили переменной D значение "test" и проверили результат: вывелась строка "test". Затем вызвали функцию printRoots (), в теле которой после присвоения переменной D результата вычисления формулы дискриминанта так же выводится значение переменной D: 4.0. После завершения работы функции мы снова выводим значение переменной D: на этот раз присвоенное значение снова равно строке "test".

На самом деле, D в основной программе и D в теле функции printRoots () - это две разные переменные. Проверить это можно, немного модифицировав нашу программу. Воспользуемся функцией id(). Она возвращает адрес объекта в памяти. Измененная программа будет выглядеть приблизительно так:

def printRoots(a, b, с): D = b**2 - 4 * а * с import math

print "In function D = ", D, "\nAdress:", id(D), "\n" xl = (-b + math.sqrt(D)) / 2 * a x2 = (-b - math.sqrt(D)) / 2 * a print "xl =", xl, "\nx2 =", x2

D = "test"

print "Before function call D = ", D, "\nAdress:", id(D), "\n"

printRoots(1.0, 0, -1.0)

print "After function call D = ", D, "\nAdress:", id(D), "\n"

Результат работы программы будет следующим:

$ python prog5.py

Before function call D =

= test

Adress: 135287104

42

Ревизия: 170

Функции

In function D = 4.0

Adress: 135293780

xl = 1.0

x2 = -1.0

After function call D =

= test

Adress: 135287104

На вашем компьютере адреса могут быть другими, но выводы вы сможете сделать такие же: адреса D в основной программе и D в теле функции printRoots () различаются. Что и требовалось доказать.

Упражнение. Являются ли параметры функции локальными переменными?