函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。在函数中,可使用return语句将值返回到调用函数的代码行。返回值让你能够将程序的大部分繁重工作移到函数中去完成,从而简化主程序。
8.3.1 返回简单值(Return Simple Value)
下面来看一个函数,它接受年月日并返回完整的日期:
# formatted_date.py
def formatted_date(year, month, day):
full_date = f'{year}年{month}月{day}日'
return full_date
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,并将其默认值设置为空字符串。如果函数调用中包含这个形参的值,这个值将存储到字典中。在任何情况下,这个函数都会存储人的姓名,但可对其进行修改,使其也存储有关人的其他信息。