Возврат значений из функции. Оператор return

Функции могут передавать какие-либо данные из своих тел в основную ветку программы. Говорят, что функция возвращает значение. В большинстве языков программирования, в том числе Python, выход из функции и передача данных в то место, откуда она была вызвана, выполняется оператором return.

Если интерпретатор Питона, выполняя тело функции, встречает return, то он "забирает" значение, указанное после этой команды, и "уходит" из функции.

def cylinder():
    r = float(input())
    h = float(input())
    # площадь боковой поверхности цилиндра:
    side = 2 * 3.14 * r * h
    # площадь одного основания цилиндра:
    circle = 3.14 * r**2
    # полная площадь цилиндра:
    full = side + 2 * circle
    return full
 
square = cylinder()
print(square)

Пример выполнения:

3
7
188.4

В данной программе в основную ветку из функции возвращается значение локальной переменной full. Не сама переменная, а ее значение, в данном случае – какое-либо число, полученное в результате вычисления площади цилиндра.

В основной ветке программы это значение присваивается глобальной переменной square. То есть выражение square = cylinder() выполняется так:

  1. Вызывается функция cylinder().

  2. Из нее возвращается значение.

  3. Это значение присваивается переменной square.

Не обязательно присваивать результат переменной, его можно сразу вывести на экран:

...
print(cylinder())

Здесь число, полученное из cylinder(), непосредственно передается функции print(). Если мы в программе просто напишем cylinder(), не присвоив полученные данные переменной или не передав их куда-либо дальше, то эти данные будут потеряны. Но синтаксической ошибки не будет.

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

def cylinder():
    try:
        r = float(input())
        h = float(input())
    except ValueError:
        return
    side = 2 * 3.14 * r * h
    circle = 3.14 * r**2
    full = side + 2 * circle
    return full
 
print(cylinder())

Если попытаться вместо цифр ввести буквы, то сработает return, вложенный в except. Он завершит выполнение функции, так что все нижеследующие вычисления, в том числе return full, будут опущены. Пример выполнения:

r
None

Но постойте! Что это за слово None, которое нам вернул "пустой" return? Это ничего, такой объект – "ничто". Он принадлежит классу NoneType. До этого мы знали четыре типа данных, они же четыре класса: int, float, str, bool. Пришло время пятого.

Когда после return ничего не указывается, то по умолчанию считается, что там стоит объект None. Но никто вам не мешает явно написать return None.

Более того. Ранее мы рассматривали функции, которые вроде бы не возвращали никакого значения, потому что в них не было оператора return. На самом деле возвращали, просто мы не обращали на него внимание, не присваивали никакой переменной и не выводили на экран. В Python всякая функция что-либо возвращает. Если в ней нет оператора return, то она возвращает None. То же самое, как если в ней имеется "пустой" return.

Возврат нескольких значений

В Питоне позволительно возвращать из функции несколько объектов, перечислив их через запятую после команды return:

def cylinder():
    r = float(input())
    h = float(input())
    side = 2 * 3.14 * r * h
    circle = 3.14 * r**2
    full = side + 2 * circle
    return side, full
 
sCyl, fCyl = cylinder()
print("Площадь боковой поверхности %.2f" % sCyl)
print("Полная площадь %.2f" % fCyl)

Из функции cylinder() возвращаются два значения. Первое из них присваивается переменной sCyl, второе – fCyl. Возможность такого группового присвоения – особенность Python, обычно не характерная для других языков:

>>> a, b, c = 10, 15, 19
>>> a
10
>>> b
15
>>> c
19

Фокус здесь в том, что перечисление значений через запятую (например, 10, 15, 19) создает объект типа tuple. На русский переводится как "кортеж". Это разновидность структур данных, которые будут изучены позже.

Когда же кортеж присваивается сразу нескольким переменным, то происходит сопоставление его элементов соответствующим в очереди переменным. Это называется распаковкой.

Таким образом, когда из функции возвращается несколько значений, на самом деле из нее возвращается один объект класса tuple. Перед возвратом эти несколько значений упаковываются в кортеж. Если же после оператора return стоит только одна переменная или объект, то ее/его тип сохраняется как есть.

Распаковка не является обязательной. Будет работать и так:

print(cylinder())

Пример выполнения:

4
3
(75.36, 175.84)

На экран выводится кортеж, о чем говорят круглые скобки. Его также можно присвоить одной переменной, а потом вывести ее значение на экран.

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

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

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

Примеры решения в android-приложении и pdf-версии курса.

Комментарии

def num():
    i=0
    a=float(input('press number '))
    while a!=0:
        i=i+1
        if i==1:
            s=a
            a=float(input('press number '))
        else:
            i>1
            s=a*s
            a=float(input('press number '))
    return s
print(num())

Что-то не понял совсем. Как сделать что бы можно было повторно вводить цифры? Цикл ведь зацикливается и не дает ввести новые данные, вот что у меня получилось:
def num():
    a = int(input('Enter the first number:'))
    b = int(input('Enter the second number:'))
    c = a*b
    while a or b != 0:
        print ('Your sum is:', c)
    else:
        print ('You done')
    return c
d = num()
print (d)

Ответ на от And

Так, я понял что не понял задание и не сделал так как надо(точнее сделал не совсем то), но все же меня интересует теперь мой вариант выполнения :)я маленько доработал и получилось вот что:
def num():
    a = int(input('Enter the first number:'))
 
    while a != 0:
        b = int(input('Enter the second number:'))
        c = a + b
        while b != 0:
            print ('Your sum is:', c )
            num()
            return c
        else:
            print('End')
            break
    else:
        print ('End.')
 
num()
Буду рад советам.

Ответ на от And

Там решение проще. До цикла заводится переменная, в которой будет накапливаться сумма (присваивается 0) или произведение (присваивается 1).

До цикла с ввода запрашивается число.

В условии цикла проверяется что оно не равно нулю.

В теле цикла это число добавляется к сумме или произведению. Например: mult = a * mult.

В теле цикла снова запрашивается число и присваивается той переменной, которая проверяется в условии цикла.

 

def infinity():
    try:
        num1 = float(input("множитель 1: "))
        num2 = float(input("множитель 2: "))
        i=3
        num = num1 * num2
        while num1 and num2 > 0:
            result = num
            num_i=float(input("множитель %d: " % i))
            num=num*num_i
            i += 1
            if num_i ==0:
                return result
        else:
            return 0
    except ValueError:
        print ("Нужно ввести число")
print("Произведение чисел введенных до нуля ",infinity())

def multiply():
	a = 1
	b = 1
	while True: #Создаем цикл while имея уже нужные переменные и пусть он будет работать всегда.
		a = int(input("Введите число :")) #Спрашиваем у пользователя переменные прямо в цикле.
		b = int(input("Введите второе число: "))
		if a == 0 or b == 0: #Делаем проверку: если какая-то из переменных равна нулю, то ломаем цикл
			break
		c = a * b #Надеюсь тут все понятно
	return c
print(multiply())
<python>

Это код со всеми (вроде бы)  "защитами от дурака" 

def proizv():
    res = 1
    try:
        vvod = input('Введите число > ').replace(',', '.')
        if vvod == '0' or vvod.isalpha():
            return 'Нет данных для подсчёта'
        else:
            res *= float(vvod)
            while True:
                try:
                    vvod = input('Введите число > ').replace(',', '.')
                    if vvod != '0':
                        res *= float(vvod)
                    else:
                        return res
                except ValueError:
                    print('Неверно введённые данные!!!')
    except ValueError:
        return 'Нет данных для подсчёта'
 
 
print(proizv())

def multiplication():
 
	while 1==1:
		a = float(input('Введите 1-ое число:'))
		b = float(input('Введите 2-ое число:'))
 
		if ((a == 0) or (b == 0)):
			break
		print(a*b)
	return 	
print(multiplication())

def num():
 
    r = input("Введите число: ")
    while type(r) != float:
        try:
            r = float(r)
        except ValueError:
            print("Вы ввели ТЕКСТ, введите ЧИСЛО!")
            r = float(input("Введите число: "))
 
 
        if r != 0:
            r *= r
            print("Ваше произведение равно: ", r)
            r = input("Введите очередное число: ")
        else:
            r == 0
            print("Ввели НОЛЬ - программа завершена!")
 
            return r
 
num() 

def multiply():
    try:
        a = int(input("Введите число: "))
    except ValueError:
        a = 1
    c = 1
    while a !=0:
        c = a * c
        try:
            a = int(input("Введите число: "))
        except ValueError:
            a = 1
    return c
print(multiply())