a = 23
b = -23
if a < 0:
a = -a
if b < 0:
b = -b
if a == b:
print "The absolute values of", a,"and",b,"are equal"
else:
print "The absolute values of a and b are different"
Результат работы:
The absolute values of 23 and 23 are equalЭта программа выглядит слегка повторяющейся. (Программисты ненавидят повторять вещи – для этого существуют компьютеры). К счастью, Python позволяет создавать функции, чтобы избежать повторений. Та же программа в переписанном виде:
a = 23
b = -23
def my_abs(num):
if num < 0:
num = -num
return num
if my_abs(a) == my_abs(b):
print "The absolute values of", a,"and",b,"are equal"
else:
print "The absolute values of a and b are different"
Результат:
The absolute values of 23 and -23 are equalГлавная особенность этой программы – команда def. def (сокращение от английского слова «определять») начинает определение функции. После def следует имя функции my_abs. Далее следует (, затем аргумент num (num передается из программы в функцию всякий раз, когда программа вызывает функцию). Команды после : выполняются, когда эта функция используется. Команды функции продолжаются выполняться, пока не заканчиваются команды функции или встречается команда return. Команда return возвращает значение туда, откуда вызывалась функция.
Обратите внимание, что значения a и b не меняются. Функции также могут быть использованы для повтора действий, которые не возвращают значения. Примеры:
def hello():
print "Hello"
def area(width,height):
return width*height
def print_welcome(name):
print "Welcome",name
hello()
hello()
print_welcome("Fred")
w = 4
h = 5
print "width =",w,"height =",h,"area =",area(w,h)
Результат:
Hello Hello Welcome Fred width = 4 height = 5 area = 20Эти примеры показывают различные вещи, которые можно сделать с функциями. Заметьте, вы можете не использовать ни одного аргумента, или использовать два и более. Также обратите внимание, что return не обязателен.
Конечно же, когда вы избавляетесь от повторяющихся мест в программе, у вас часто встречаются переменные в таких местах. С ними в Python поступают специальным образом. До этого момента все переменные, которые мы видели, были глобальными. В функциях существует специальный тип переменных, называемый локальным. Они существуют только пока выполняется функция. Когда у локальной переменной такое же имя, как и у другой переменной, такой как глобальной, локальная переменная скрывает другую переменную. Звучит непонятно? Надеюсь, следующий пример (несколько искусственный) прояснит это.
a_var = 10
b_var = 15
e_var = 25
def a_func(a_var):
print "in a_func a_var = ",a_var
b_var = 100 + a_var
d_var = 2*a_var
print "in a_func b_var = ",b_var
print "in a_func d_var = ",d_var
print "in a_func e_var = ",e_var
return b_var + 10
c_var = a_func(b_var)
print "a_var = ",a_var
print "b_var = ",b_var
print "c_var = ",c_var
print "d_var = ",d_var
Результат работы программы:
in a_func a_var = 15
in a_func b_var = 115
in a_func d_var = 30
in a_func e_var = 25
a_var = 10
b_var = 15
c_var = 125
d_var =
Traceback (innermost last):
File "separate.py", line 20, in ?
print "d_var = ",d_var
NameError: d_var
В этом примере переменные a_var, b_var и d_var - локальные когда они используются в функции a_func.
После команды return b_var + 10 они больше не существуют. Переменная a_var - автоматически локальная переменная, поскольку это имя параметра. Переменные b_var и d_var - локальные поскольку они появляются в функции слева от знака равенства в командах b_var = 100 + a_var и d_var = 2*a_var .
В функции переменная a_var равна 15 так как функция вызывается командой a_func(b_var). Поскольку в это время b_var равно 15, функция вызывается как a_func(15). В резудьтате этого получаем a_var равно 15 когда эта переменная внутри функции a_func.
Как видите, когда выполнение функции завершается, локальные переменные a_var and b_var, которые скрывали глобальные переменные с такими же именами, перестают существовать. В это время команда print "a_var = ",a_var выводит
10, а не 15, так как локальной переменной, скрывающей глобальную, больше не существует.
Обратите внимание на NameError, который появляется в конце. Это происходит поскольку переменная d_var больше не существует, так как функция a_func закончилась выполняться. Все локальные переменные уничтожаются при выходе из функции. Если вы хотите получить какую-либо величину от функции, вам надо использовать команду return переменная.
Последняя вещь, на которую нужно обратить внимание - это то, что e_var не меняется в функции a_func, поскольку это не параметр и не появляется там слева от знака равенства. Когда к глобальной переменной обращаются из функции, имеется в виду глобальная переменная вне функции.
В функциях существуют локальные переменные, которые уничтожаются при выходе из нее и могут скрывать другие переменные вне этой функции.
В будущем из этой части будет сделана отдельная глава.
Сейчас мы будем изучать в деталях следующую программу:
def mult(a,b):
if b == 0:
return 0
rest = mult(a,b - 1)
value = a + rest
return value
print "3*2 = ",mult(3,2)
Эта программа просто создает функцию для умножения положительных целых чисел (она гораздо медленнее, чем обычное уможение в Python) и затем показывается использование этой функции.
Вопрос: Что программа делает в начале?
Ответ: Прежде всего определяется функция mult:
def mult(a,b):
if b == 0:
return 0
rest = mult(a,b - 1)
value = a + rest
return value
Здесь создается функция с двумя параметрами. При окончании выполнения она возвращает число. Далее в программе эта функция может быть вызвана.
Вопрос: Что происходит далее?
Ответ: Выполняется следующая после функции команда
print "3*2 = ",mult(3,2)
Вопрос: И что она делает?
Ответ: Она выводит 3*2 = и число, возвращаемое командой mult(3,2).
Вопрос: Какое число выдает команда mult(3,2)?
Ответ: Чтобы выяснить это, нужно детально изучить функцию mult.
Вопрос: Что происходит в функции?
Ответ: Переменная a получает значение 3 и переменная b получает значение 2.
Вопрос: А затем?
Ответ: Выполняется команда if b == 0:. Так как b равно 2, это условие ложно, поэтому команда return 0 пропускается.
Вопрос: Что дальше?
Ответ: Выполняется команда rest = mult(a,b - 1). Она присваивает локальной переменной rest величину mult(a,b - 1). Здесь a равно 3 и b равно 2, так что вызов функции выглядит так: mult(3,1).
Вопрос: Чему же равно mult(3,1) ?
Ответ: Нужно просчитать функцию mult с параметрами 3 и 1.
Вопрос: Что происходит далее?
Ответ: Локальные переменые при новом вызове функции имеют следующие значения: a равно 3 и b равно 1. Так как это локальные переменные, они не влияют на предыдущие значения a и b.
Вопрос: А дальше?
Ответ: Так как b равно 1, условие для команды if ложно, следующей выполняется команда rest = mult(a,b - 1).
Вопрос: Что делает эта команда?
Ответ: Она присваивает значение mult(3,0) в переменную rest.
Вопрос: И чему равно это значение?
Ответ: Нужно вызвать функцию еще раз. Сейчас a равно 3 и b равно 0.
Вопрос: Что происходит далее?
Ответ: Выполняется первая команда функции if b == 0:. Переменная b равна 0 поэтому выполняется return 0
Вопрос: И что делает команда return 0?
Ответ: Она возвращает из функции 0.
Вопрос: И что?
Ответ: Сейчас мы знаем, что mult(3,0) равно 0. Мы знаем что делала команда rest = mult(a,b - 1), так как мы вызвали функцию mult с параметрами 3 и 0. Мы завершили выполнение mult(3,0) и сейчас мы выполняем mult(3,1). В переменную rest присваивается 0.
Вопрос: Какая команда выполняется следующей?
Ответ: Команда value = a + rest выполняется следующей. В этом вызове функции a=3 и rest=0, так что value=3.
Вопрос: Что происходит дальше?
Ответ: Выполняется команда return value. Она возвращает из функции 3. Она также завершает функцию mult(3,1). После выполнения return мы возвращаемся к mult(3,2).
Вопрос: Где мы были в mult(3,2)?
Ответ: Переменные имели следующие значения: a=3 и b=2. Мы остановились на команде rest = mult(a,b - 1) .
Вопрос: Что происходит сейчас?
Ответ: В переменную rest присваивается 3. Следующая команда value = a + rest заносит в value величину 3+3 или 6.
Вопрос: Что происходит далее?
Ответ: Выполняется следующая команда, функция выдает 6 и завершается. Мы возвращаемся к команде print "3*2 = ",mult(3,2) которая выводит 6.
Вопрос: Что же происходит в целом?
Ответ: Мы использовали два факта при вычислении произведения двух чисел. Первый - любое число при умножении на 0 дает 0 (x * 0 = 0). Второй - одно число, умноженное на другое, равно первое число плюс первое число, умноженное на величину, на единицу меньше второго числа (x * y = x + x * (y - 1)). Получается, что 3*2 сначала преобразуется в 3 + 3*1. Затем 3*1 преобразуется в 3 + 3*0. Мы знаем, что любое число при умножении на 0 дает 0, поэтому 3*0 равно 0. Теперь мы можем высчитать 3 + 3*0, то есть 3 + 0, что равно 3. Теперь мы знаем чему равно 3*1 и можем вычислить 3 + 3*1, то есть 3 + 3, что равно 6.
Вот так это выглядит в целом:
3*2 3 + 3*1 3 + 3 + 3*0 3 + 3 + 0 3 + 3 6
Две последние части были написаны недавно. Если у вас есть комментарии, вы нашли ошибки или думаете, что здесь нужны более подробные или более ясные объяснения, пожалуйста отправьте мне сообщение на электронную почту. В прошлом я мог делать простые вещи непонятными. Если весь остальной курс был прост для понимания, а эти части - нет, вероятно, это моя вина и я хотел бы знать об этом. Спасибо.
factorial.py
#определяем функцию вычисления факториала
def factorial(n):
if n <= 1:
return 1
return n*factorial(n-1)
print "2! = ",factorial(2)
print "3! = ",factorial(3)
print "4! = ",factorial(4)
print "5! = ",factorial(5)
Результат:
2! = 2 3! = 6 4! = 24 5! = 120
temperature2.py
#перевод из градусов Фаренгейта в градусы Цельсия
def print_options():
print "Options:"
print " 'p' print options"
print " 'c' convert from celsius"
print " 'f' convert from fahrenheit"
print " 'q' quit the program"
def celsius_to_fahrenheit(c_temp):
return 9.0/5.0*c_temp+32
def fahrenheit_to_celsius(f_temp):
return (f_temp - 32.0)*5.0/9.0
choice = "p"
while choice != "q":
if choice == "c":
temp = input("Celsius temperature:")
print "Fahrenheit:",celsius_to_fahrenheit(temp)
elif choice == "f":
temp = input("Fahrenheit temperature:")
print "Celsius:",fahrenheit_to_celsius(temp)
elif choice != "q":
print_options()
choice = raw_input("option:")
Пример работы:
> python temperature2.py Options: 'p' print options 'c' convert from celsius 'f' convert from fahrenheit 'q' quit the program option:c Celsius temperature:30 Fahrenheit: 86.0 option:f Fahrenheit temperature:60 Celsius: 15.5555555556 option:q
area2.py
#Написана Амосом Саттерли
print
def hello():
print 'Hello!'
def area(width,height):
return width*height
def print_welcome(name):
print 'Welcome,',name
name = raw_input('Your Name: ')
hello(),
print_welcome(name)
print
print 'To find the area of a rectangle,'
print 'Enter the width and height below.'
print
w = input('Width: ')
while w <= 0:
print 'Must be a positive number'
w = input('Width: ')
h = input('Height: ')
while h <= 0:
print 'Must be a positive number'
h = input('Height: ')
print 'Width =',w,' Height =',h,' so Area =',area(w,h)
Пример работы:
Your Name: Josh Hello! Welcome, Josh To find the area of a rectangle, Enter the width and height below. Width: -4 Must be a positive number Width: 4 Height: 3 Width = 4 Height = 3 so Area = 12
Перепишите программу area.py главы 3.2 с отдельными функциями для вычисления площади квадрата, прямоугольника и круга (3.14 * радиус**2). Программа должна предоставлять пользователю возможность выбора.