函数用法
本篇章,主要介绍函数的几种用法,包括传参数、实参形参、不同参数形式(位置实参、关键字实参、任意数量的实参)、以及return返回值、函数存储在模块的独立文件中等。
函数存储在模块的独立文件中,让主程序文件组织更加有序,并且无需反复编写完成该任务的代码,而只需调用 执行该任务的函数。
- 不传参的函数
def greet_user():
print("Hello")
- 简单的传参函数
def greet_user(username):
print("Hello " + username)
greet_user('jesse')
- 实参和形参
在上面函数greet_user()的定义中,变量username是一个形参,在代码greet_user('jesse')中,值'jesse'是一个实参,实参是调用函数时传递给函数的信 18
息。
1、 位置实参
你调用函数时,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')
2、关键字实参
关键字实参是传递给函数的名称—值对。你直接在实参中将名称和值关联起来了,因此向函 数传递实参时不会混淆。关键字实参让你无需考虑函 数调用中的实参顺序
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(pet_name='harry', animal_type='hamster')
3、默认值参数
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')
# 和上面的等价
describe_pet('willie')
# 如果描述的不是狗,改变默认值即可
describe_pet(pet_name='harry', animal_type='hamster')
# 或者
describe_pet('harry', 'hamster')
#或者
describe_pet(pet_name='harry', animal_type='hamster')
# 或者
describe_pet(animal_type='hamster', pet_name='harry')
4、返回值
return一下就行
5、让实参变成可选的
需要让实参变成可选的,这样使用函数的人就只需在必要时才提供额外的信息。可 使用默认值来让实参变成可选的
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)
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)
禁止函数修改列表
可向函数传 递列表的副本而不是原件;这样函数所做的任何修改都只影响副本,而丝毫不影响原件
function_name(list_name[:]) 即可传递任意数量的实参
你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任 意数量的实参。
# 形参名*toppings中的星号让Python创建一个名为toppings的空元组,
# 并将收到的所有值都封 装到这个元组中
def make_pizza(*toppings):
"""打印顾客点的所有配料"""
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
- 结合使用位置实参和任意数量实参
def make_pizza(size, *toppings):
"""概述要制作的比萨"""
print("\nMaking a " + str(size) + "-inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
- 使用任意数量的关键字实参
def build_profile(first, last, **user_info):
"""创建一个字典,其中包含我们知道的有关用户的一切"""
profile = {}
profile['first_name'] = first
profile['last_name'] = last
for key, value in user_info.items():
profile[key] = value
return profile
user_profile = build_profile('albert', 'einstein', location='princeton',
field='physics')
print(user_profile)
函数存储在模块中
- 导入整个模块
函数的优点之一是,使用它们可将代码块与主程序分离。通过给函数指定描述性名称,可让 主程序容易理解得多。你还可以更进一步,将函数存储在被称为模块的独立文件中,再将模块导 入到主程序中。import语句允许在当前运行的程序文件中使用模块中的代码。
这就是一种导入方法:只需编写一条import语句并在其中指定模块名,就可在程序中使用该 模块中的所有函数。如果你使用这种import语句导入了名为module_name.py的整个模块,就可使 用下面的语法来使用其中任何一个函数:module_name.function_name()
-
导入特定的函数
使用as给函数指定别名
语法:from module_name import function_name as fn
from pizza import make_pizza as mp
mp(16, 'pepperoni')
mp(12, 'mushrooms', 'green peppers', 'extra cheese')
- 使用as给模块指定别名
给模块指定别名的通用语法如下: import module_name as mn
import pizza as p
p.make_pizza(16, 'pepperoni')
p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
- 导入模块中的所有函数
语法:from module_name import *
from pizza import *
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')