函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。在函数中,可使用return语句将值返回到调用函数的代码行。返回值让你能够将程序的大部分繁重工作移到函数中去完成,从而简化主程序。

8.3.1 返回简单值(Return Simple Value)

下面来看一个函数,它接受年月日并返回完整的日期:

  1. # formatted_date.py
  2. def formatted_date(year, month, day):
  3. full_date = f'{year}年{month}月{day}日'
  4. return full_date
  5. print(formatted_date(1949, 10, 1))

调用返回值的函数时,需要提供一个变量,用于存储返回的值。在这里,将返回值存储在了变量full_date中,输出的完整日期为:


1949年10月1日


8.3.2 让实参变成可选的(Optional Parameters)

有时候,需要让实参变成可选的,这样使用函数的人就只需在必要时才提供额外的信息。可使用默认值来让实参变成可选的。例如,假设我们要扩展函数formatted_date(),使其可以处理输入的年份与当前年份的差,那么可以将其修改成这样:

# formatted_date.py
def formatted_date(year, month, day, current_year):
    full_date = f'{year}年{month}月{day}日, 距今{current_year-year}年!'
    return full_date

print(formatted_date(1949, 10, 1, 2021))

输出:


1949年10月1日, 距今72年!


但是计算距今多少年的功能并不是人人都需要的,所以我们应该把它设置为可选的,稍作修改,变成如下的代码:

# formatted_date.py
def formatted_date(year, month, day, current_year=0):
    full_date = ''
    if current_year:
        full_date = f'{year}年{month}月{day}日, 距今{current_year-year}年!'
    else:
        full_date = f'{year}年{month}月{day}日'
    return full_date

print(formatted_date(1949, 10, 1))
print(formatted_date(1949, 10, 1, 2021))

输出:


1949年10月1日
1949年10月1日, 距今72年!


可选值让函数能够处理各种不同情形的同时,确保函数调用尽可能简单。

8.3.3 返回字典

函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。例如,下面的函数接受姓名的组成部分,并返回一个表示人的字典:

# person.py
def build_person(firstname, lastname):
    person = {'first': firstname, 'last': lastname}
    return person

print(build_person('Thomas', 'Pan'))

函数build_person()接受名和姓,并将这些值封装到字典中。存储firstname的值时,使用的键为’first’,而存储lastname的值时,使用的键为’last’。最后,返回表示人的整个字典。在第六行处,打印这个返回的值,此时原来的两项文本信息存储在一个字典中:


{‘first’: ‘Thomas’, ‘last’: ‘Pan’}


这个函数接受简单的文本信息,将其放在一个更合适的数据结构中,让你不仅能打印这些信息,还能以其他方式处理它们。当前,字符串’thomas’和’pan’被标记为名和姓。你可以轻松地扩展这个函数,使其接受可选值,如年龄、职业或你要存储的其他任何信息。例如,下面的修改让你还能存储年龄:

# person.py
def build_person(firstname, lastname, age=''):
    person = {'first': firstname, 'last': lastname}
    if age:
        person['age'] = age
    return person

print(build_person('喵酱', '王', 23))

输出:


{‘first’: ‘喵酱’, ‘last’: ‘王’, ‘age’: 23}


在函数定义中,我们新增了一个可选形参age,并将其默认值设置为空字符串。如果函数调用中包含这个形参的值,这个值将存储到字典中。在任何情况下,这个函数都会存储人的姓名,但可对其进行修改,使其也存储有关人的其他信息。