函数
定义函数
一个简单的示例,打印问候语的见到那函数,名为greet_user()
def greet_user():
print("hello world")
greet_user()
>> hello world
这个示例演示了最简单的函数结构,使用关键字def来告诉python你要定义一个函数。这是函数定义,向python指出了函数名,还可以在括号内指出函数为完成其任务需要什么样的信息,即参数。最后以冒号结尾。紧跟在def greet_user()后面的所有缩进行构成了函数体。
向函数传递信息
def greet_user(username):
"""显示简单的问候语"""
print("Hello, " + username.title() + "!")
greet_user('jesse')
>>Hello, Jesse!
在函数greet_user()的定义中,变量username是一个形参。在代码greet_user(‘jesse’)中,值’jesse’是一个实参。实参是调用函数时传递给函数的信息。我们调用函数时,将要让函数使用的信息放在括号内。
传递实参
函数定义中可能包含多个形参,因此函数调用也可能包含多个实参。向函数传递实参的方式很多,可使用位置实参,这要求实参的顺序与形参的顺寻相同;也可以使用关键字实参,其中每个实参都由变量名和值组成;还可使用列表和字典
位置实参
在调用函数时,python必须将函数调用中的每个实参都关联到函数定义的一个形参。最简单的关联方式时基于实参的顺序。这种关联方式被称为位置实参。
def describe_pet(animal_type, pet_name):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet('hamster', 'harry')
>>I have a hamster.
My hamster's name is Harry.
在使用位置实参时,调用函数的参数位置非常重要!!!
关键字实参
关键字实参是传递给函数名-值对。在实参中直接将名称和值关联起来,因此向函数传递实参时不会混淆。关键字实参可以不需要考虑参数的位置。
def describe_pet(animal_type, pet_name):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(animal_type='hamster', pet_name='harry')
>>describe_pet(animal_type='hamster', pet_name='harry')
describe_pet(pet_name='harry', animal_type='hamster')
函数describe_pet() 还是原来那样,但调用这个函数时,我们向Python明确地指出了各个实参对应的形参。看到这个函数调用时,Python知道应该将实参’hamster’
和’harry’ 分别存储在形参animal_type 和pet_name 中。
默认值
在编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,python将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参。
def describe_pet(pet_name, animal_type='dog'):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(pet_name='willie')
>>I have a dog.
My dog's name is Willie.
返回值
函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值 。在函数中,可使用return 语句将值返回到调用函数的代码行。
返回简单值
先来看一个简单的示例:
def get_formatted_name(first_name, last_name):
"""返回整洁的姓名"""
full_name = first_name + ' ' + last_name
return full_name.title()
musician = get_formatted_name('jimi', 'hendrix')
print(musician)
>>Jimi Hendrix
让实参变成可选的
有时候,需要让实参变成可选的,这样使用函数的人就只需在必要时才提供额外的信息。可使用默认值来让实参变成可选的。
def get_formatted_name(first_name, middle_name, last_name):
"""返回整洁的姓名"""
full_name = first_name + ' ' + middle_name + ' ' + last_name
return full_name.title()
musician = get_formatted_name('john', 'lee', 'hooker')
print(musician)
>>John Lee Hooker
然而,并非所有的人都有中间名,但如果你调用这个函数时只提供了名和姓,它将不能正确地运行。为让中间名变成可选的,可给实参middle_name 指定一个默认值——空字符串,并在用户没有提供中间名时不使用这个实参。为让get_formatted_name() 在没有提供中间名时依然可行,可给实参middle_name 指定一个默认值——空字符串,并将其移到形参列表的末尾:
def get_formatted_name(first_name, last_name, middle_name=''):
"""返回整洁的姓名"""
if middle_name:
full_name = first_name + ' ' + middle_name + ' ' + last_name
else:
full_name = first_name + ' ' + last_name
return full_name.title()
musician = get_formatted_name('jimi', 'hendrix')
print(musician)
musician = get_formatted_name('john', 'hooker', 'lee')
print(musician)
返回字典
函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。
def build_person(first_name, last_name):
"""返回一个字典,其中包含有关一个人的信息"""
person = {'first': first_name, 'last': last_name}
return person
musician = build_person('jimi', 'hendrix')
print(musician)
>>{'first': 'jimi', 'last': 'hendrix'}
函数build_person() 接受名和姓,并将这些值封装到字典中使用的键为’first’ ,而存储last_name 的值时,使用的键为’last’ 。最后,返回表示人的整个字典。