Функции в программировании. Урок 13

Основы программирования на Python

Функции в программировании можно представить как изолированный блок кода, обращение к которому в процессе выполнения программы может быть многократным. Зачем нужны такие блоки инструкций? В первую очередь, чтобы сократить объем исходного кода: рационально вынести часто повторяющиеся выражения в отдельный блок и, затем, по мере надобности, обращаться к нему.

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

a = int(input('Введите первое число: '))
b = int(input('Введите второе число: '))
if a > b:
    print(a-b)
else:
    print(b-a)
 
c = int(input('Введите первое число: '))
d = int(input('Введите второе число: '))
if c > d:
    print(c-d)
else:
    print(d-c)
 
e = int(input('Введите первое число: '))
f = int(input('Введите второе число: '))
if e > f:
    print(e-f)
else:
    print(f-e)

Данная программа находит модуль разницы двух чисел. Очевидно, что такая запись исходного кода не рациональна: получаются три почти одинаковых блока кода. Почему бы не использовать цикл while для организации повторения?

i = 0
while i < 3:
    a = int(input('Введите первое число: '))
    b = int(input('Введите второе число: '))
    if a > b:
        print(a-b)
    else:
        print(b-a)
    i = i + 1

Однако, в этом случае есть один нюанс. Вводимые пользователем данные всегда связываются с переменными a и b. При каждом витке цикла прежние данные утрачиваются. Что же делать, если все шесть чисел, введенных пользователем надо сохранить для дальнейшего использования в программе? Рассмотрим решение этой задачи с использованием функции.

def diff():
    m = int(input('Введите первое число: '))
    n = int(input('Введите второе число: '))
    if m > n:
        print(m-n)
    else:
        print(n-m)
    return m,n
 
a,b = diff()
c,d = diff()
e,f = diff()

def – это инструкция (команда) языка программирования Python, позволяющая создавать функцию. diff – это имя функции, которое (так же как и имена переменных) может быть почти любым, но желательно осмысленным. После в скобках перечисляются параметры функции. Если их нет, то скобки остаются пустыми. Далее идет двоеточие, обозначающее окончание заголовка функции (аналогично с условиями и циклами). После заголовка с новой строки и с отступом следуют выражения тела функции. В конце тела функции присутствует инструкция return (может и не быть), которая возвращает значение(я) в основную ветку программы. В данном случае, если бы в функции не было инструкции return, то в основную программу ничего бы не возвращалось, и переменным a и b (c и d, а также e и f) числовые значения не присваивались бы.

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

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

Практическая работа

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

Здравствуйте Помогите,пожалуй

Здравствуйте

Помогите,пожалуйста, разобраться в задаче.Условия такие, что программа должна подобрать размер обуви (европейский размер)спрашивая длину ступни в см,используя формулу(длина_ступни_см + 1,5) * 3 / 2 В задачи надо использовать функции float и round

Мое решение

def razmer_nogi(dlina_stupni_cm):
    razmer_nogi = (dlina_stupni_cm+ 1,5) * 3 / 2
 
    return razmer_nogi
 
print("Vvedite dlinu stupni:")
dlina_stupni_cm=int(input))
float("Vvedite dlinu stupni:")
round= dlina_stupni_cm+ 1,5) * 3 / 2
 
print("Razmer_nogi"+razmer_nogi)

Не знаю, актуальнен ли

Не знаю, актуальнен ли вопрос, но предложу три варианта решения (предполагаю, что округлять размер нужно до первого знака после запятой)
1-ый

size_cm = float(raw_input("Enter size of your foot in cm: "))
eu_size = (size_cm+1.5)*3/2
g = round (eu_size,1)
print "Your Eu size is: ",g

2-ой ( без round, но с введением числа в строку)

size_cm = raw_input ("Enter size of your foot in cm: ")
size_cm = float(size_cm)
eu_size1 = (size_cm + 1.5)*3/2
 
print "Your EU-size is %.1f"%eu_size1

3-ий ( с защитой от ввода нецифровых данных с помощью try and except)
try:
    inp = raw_input("Enter your size in cm: ")
    size_cm = float(inp)
except:
    print "Error, please enter a number"
    quit()
eu_maat = (size_cm + 1.5)*3/2
g = round (eu_maat,1)
print "Your EU-size is ",g

Доброго времени суток! дико

Доброго времени суток!
дико извиняюсь за может быть дурацкий вопрос(я начинающий программер), но я немного запутался:

def first():
    m=int(input('Enter 1-st number: '))
    n=int(input('Enter 2-d number: '))
    if m<n:
        print('Sum = ',m+n)
    elif m>n:
        second(m,n)
    else:
        print()
def second(m,n):
    print('Raznica = ',m-n)
 
first()
second()

вроде бы даже и работает, но смущает появление в конце ошибки:
Traceback (most recent call last):
File "C:/Python34/first_def.py", line 14, in
second()
TypeError: second() missing 2 required positional arguments: 'm' and 'n'

умом я понимаю что в что m,n не из second не связаны с first, а вот как красивы разрулить это - не пойму.....:-(
буду очень признателен за обстоятельное пояснение.

Функция second правильно (с

Функция second правильно (с двумя аргументами) вызывается из функции first. Зачем ее вызывать в последней строке? Ошибка возникает из-за этого.

Добрый вечер! Задача стоит в

Добрый вечер!
Задача стоит в том, что бы сделать "Глубокое копирование списков". Если у нас есть список в списке, мы должны не только копировать внешний список, но и тот, который внутри. Дабы при изменении праобраза копии, не менялись внутренние списки самой копии. Ну в общем, надеюсь поймете о чем я хотел сказать и в чем я ошибся. Мне кажется проблема с возвращением значения в функцию.
вот:

def copy(a,b):
	a = b.copy()
	i = 1
	for q in b:
		if type(q) == list:
			return copy(a[i], b[i])
	i += 1
	return a

Как-то так.

def first(): x =

def first():
    x = int(input("Число 1 = "))
    y = int(input("Число 2 = "))
    print("Sum x+y = ",x+y)
    second(x,y)
def second(x,y):
    print("Raznica x - y = ", x -y)
first()

Кстати, то же самое когда

Кстати, то же самое когда копирую ваш пример
возможно дело в версии, у меня idle 2.7 версии

У меня при присваивании a,b =

У меня при присваивании
a,b = diff()
c,d = diff()
e,f = diff()
выбивате: "SyntaxError: invalid syntax" и подсвечивает 'a'

Добрый вечер ! Разбирая ваше

Добрый вечер !
Разбирая ваше задание возник вопрос как вызывать правильно функцию?
какая ошибка в данном примере?

def plus():
    value = a+b
    print (value)
    return value
def math():
    a = input("a = ")
    b = input("b = ")
    sym = raw_input("operation")
    if sym == "-":#Здесь все по плану  
        value = a-b
        print (value)
        return value
    elif sym =="+":  
        plus()#Здесь пробую вызвать функ, но что то не так )
    else:
        print ""
math()

Функция plus() ничего не

Функция plus() ничего не "знает" о переменных a и b. Они локальны для функции math().
Поэтому надо как-то передать в plus() значения. Заголовок функции может выглядеть так:

def plus(a,b):

А вызов функции соответственно:

plus(a,b)

При этом надо помнить, что a и b в функции math() никак не связаны с одноименными переменными в plus(). Это четыре разные локальные переменные. Когда функция вызывается: plus(a,b), то фактически вместо a и b подставляются их значения. Т.е., например, plus(4,7). Эти значения далее присваиваются параметрам plus(). Для понимания этого лучше определить функцию plus() так:

def plus(m,n):
    value = m+n
    ...

, а в math() оставить переменные a и b.

def troyka(): a = 2 b

def troyka():
    a = 2
    b = 3
    c = 1
    value = (a + b + c)
    print (value)
    return value
troyka()

у меня вот так вышло.

у меня вот так вышло. значение переменной "а" ведь возвращается не в основную ветку программы, а в функцию one()?

# -*- coding: utf-8 -*-
def one():
    def two():
        a = input ("введите число: ")
        return a
    a = two()   
    i = a + 5 +4
    print i
one()

Дико извиняюсь, но...

Нельзя - ли расшифровать пример решения второго задания (он в комментариях). Я ничего не могу понять...

Программа начинает

Программа начинает выполняться со строк

x=input('input number 1: ')
y=input('input number 2: ')
one(x,y)

Здесь пользователю предлагается ввести два числа. При этом функция input() в Python v.3.x.x возвращает значения в виде строки. Эти строки в программе будут связаны с переменными x и y.
В третьей строчке вызывается функция one(), в качестве аргументов ей передаются копии двух строк-чисел, связаных с переменными x и y.

Поток выполнения программы переходит к функции one()

def one(a,b):
	c=int(a)+int(b)
	print(c)
	two(c)

Переданные в эту программу два значения связываеются с локальными переменными a и b.
Выражение типа int(a) преобразует аргумент в целое число. Т.е. если a='55', то int(a) даст число 55.
В c получаем сумму двух чисел. Далее выводим на экран.
В последней строчке вызываем вторую функцию и передаем ей в качестве аргумента копию значения, связанного с c.

def two(c):
	d=str(c)
	for i in d:
		print('-',i,'-')

Значение, связанное с c, преобразуется в строку и связывается с переменной d.
Далее происходит перебор элементов d и вывод их на экран.
Так если d='123', то сначала напечатается 1, на новой стоке 2 и затем 3.

Спасибо!

Огромное спасибо! Так понятно мне еще никто никогда в жизни ничего не объяснял. У Вас превосходные преподавательские качества!

блин

чё то я воще не догоняю, вот не понимаю я второго задания

ваш заказ, сэр

Из основной ветки программы (последние три строчки) вызывается функция one(), в свою очередь из которой вызывается функция two(). Обе принимают аргументы, которые подставляются вместо переменных a, b, c, но ничего не возвращают в основную ветку программы. Понятно, что тела функций могут быть абсолютно любыми. Здесь лишь пример.

def two(c):
	d=str(c)
	for i in d:
		print('-',i,'-')
 
def one(a,b):
	c=int(a)+int(b)
	print(c)
	two(c)
 
x=input('input number 1: ')
y=input('input number 2: ')
one(x,y)

понял!!! 3 раза перечитал и

понял!!! 3 раза перечитал и понял )))) Спасибо большое, ща закреплю и продолжу.

=)

Чтобы никто не сломал мозг - a, b = schet () дописать в пример:) если конечно это не очередная задумка автора разбудить спящий мозг новичка ))

к вопросу по второму пункту

моя дико извиняется :( моя разобрался... и комментарии можно не вывешивать :-[
Кстати учебник суперский :) Спасибо!

вопрос к примеру

Доброе время суток.
Вопрос, собственно по примеру приведенному во втором пункте.
Данный пример работает, но при попытке вывести значения a, b,... пишет что переменные не назначены Оо. Куда копать?

ответ на вопрос к примеру

ты ведь сам задаешь значения в функции, + после функции ты присваиваешь её значения новым переменным.=> значения можно вывести только если указать print(а) внутри функции в нужном месте.