函数
第7节.函数
7.1定义函数
定义一个打印问候语的函数
def greet_user():
'''显示简单的问候语'''
print("Hello")
#def关键字告诉python,我要定义一个函数
向函数传递信息
def greet_user(username):
'''显示简单的问候语'''
print(f"Hello,{username.title()}!")
greet_user('jesse')
#函数被调用时被传达参数jesse
#上面函数中的username就是一个形参
#jesse就是一个实参
7.2传递实参
实参的顺序与形参的顺序要相同
位置实参
def describe_pet(animal_type,pet_name):
'''显示宠物信息'''
print(f"\nI have a {animal_type}.")
print(f"My {animal_type}'s name is {pet_name.title()}")
describe_pet('hamster','harry')
#当你想再描述一个宠物时,只需要再调用一次函数即可
关键字实参
关键字实参是传递给函数的名称值对
def describe_pet(animal_type,pet_name):
'''显示宠物信息'''
print(f"\nI have a {animal_type}.")
print(f"My {animal_type}'s name is {pet_name.title()}")
describe_pet(animal_type='hamster',pet_name='harry')
#在调用函数时,明确指出各实参所对应的形参
默认值
编写函数时,可以给每个形参指定默认值
def describe_pet(animal_type,pet_name='harry'):
'''显示宠物信息'''
print(f"\nI have a {animal_type}.")
print(f"My {animal_type}'s name is {pet_name.title()}")
describe_pet('hamster')
#定义函数时指定了一个形参的默认值,所以调用函数时只需要指定另一个形参所对应的实参
7.3返回值
def get_formatted_name(first_name,last_name):
'''返回整洁的姓名'''
full_name=f"{first_name} {last_name}"
return full_name.title()
musician=get_formatted_name('jimi','hendrix')
print(musician)
#此方法可以用于存储和调用大量的姓名
使实参变成可选的
def get_formatted_name(first_name,mid_name,last_name):
'''返回整洁的姓名'''
full_name=f"{first_name} {mid_name} {last_name}"
return full_name.title()
musician=get_formatted_name('john','lee','hooker')
print(musician)
#上面的代码在指定2个实参时无法运行
def get_formatted_name(first_name,mid_name,last_name=''):
'''返回整洁的姓名'''
full_name=f"{first_name} {mid_name} {last_name}"
return full_name.title()
musician2=get_formatted_name('john','lee')
#当函数的实参是三个值而你只指定了2个时函数不会执行,此时可以将函数的一个实参指定为空值
print(musician2)
#上面的代码在指定2个实参时可以运行
#可以将上面的两种情况合并如下,使其变成可选的
def get_formatted_name(first_name,last_name,middle_name=''):
'''返回整洁的姓名'''
if middle_name:
full_name=f"{first_name} {middle_name} {last_name}"
else:
full_name=f"{first_name} {last_name}"
return full_name.title()
musician=get_formatted_name('john','hooker')
print(musician)
musician=get_formatted_name('john','lee','hooker')
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)
#下面扩展这个函数:
def build_person(first_name,last_name,age=None):
'''返回一个字典,其中包含有关一个人的信息'''
person={'first':first_name,'last':last_name}
if age:
person['age']=age
return person
musician=build_person('jimi','hendrix',age=27)
print(musician)
结合用函数和while循环
def get_formatted_name(first_name,last_name):
'''返回整洁的姓名'''
full_name=f"{first_name} {last_name}"
return full_name.title
while True:
print("\nPlease tell me your name:")
print("(enter 'q' at any time to quit)")
f_name=input("First name:")
if f_name=='q':
break
l_name=input("Last name")
if l_name=='q':
break
formatted_name=get_formatted_name(f_name,l_name)
print(f"\nHello,{formatted_name}!")
#while循环让用户输入姓名,依次输入名和性
传递列表
将列表传递给函数后,函数就能直接访问其内容
def greet_users(names):
'''向列表中的每位用户发出简单的问候'''
for name in names:
msg=f"Hello,{name.title()}"
print(msg)
usernames=['hannah','ty','margot']
greet_users(usernames)
在函数中修改列表
#首先创建一个列表,其中包含一些要打印的设计。
unprinted_designs=['phone case','robot pendant','dodecahedron']
completed_models=[]
#模拟打印每个设计,直到没有未打印的设计为止。
#打印每个设计后,都将其移到列表completed_models中
while unprinted_designs:
current_design=unprinted_designs.pop()
print(f"Printing model:{current_design}")
completed_models.append(current_design)
#显示打印好的所有模型
print("\nThe following models have been printed:")
for completed_model in completed_models:
print(completed_models)
'''为了重新组织上述代码,我们可以编写两个函数'''
def print_models(unprinted_designs,completed_models):
"""
模拟打印每个设计,直到没有未打印的设计为止
打印每个设计后,都将其移到列表completed_models中
"""
while unprinted_designs:
current_design=unprinted_designs.pop()
print(f"Printing model:{current_design}")
completed_models.append(current_design)
def show_completed_models(completed_models):
"""显示打印好的所有模型"""
print("\nThe following models have been printed:")
for completed_model in completed_models:
print(completed_model)
unprinted_designs=['phone case','robot pendant','dodecahedron']
completed_models=[]
print_models(unprinted_designs,completed_models)
show_completed_models(completed_models)
禁止函数修改列表(向函数传递列表的副本而非原件)
print_models(unprinted_designs[:],completed_models)
7.4传递任意数量的实参
def make_pizza(*toppings):
"""打印顾客点的所有配料"""
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms','green peppers','extra cheese')
#形参名中的*让python创建一个名为toppings的空元组,并将收集到的所有值都封装到这个元组中
结合使用位置实参和任意数量实参
def make_pizza(size,*toppings):
"""概述要制作的比萨"""
print(f"\nMaking a {size}-inch pizza with the following toppings:")
for topping in toppings:
print(f"-{topping}")
make_pizza(6,'pepperoni')
make_pizza(12,'mushrooms','green peppers','extra cheese')
#通用形参名*args也收集任意数量的位置实参
使用任意数量的关键字实参
def build_profile(first,last,**user_info):
"""创建一个字典,其中包含我们知道的有关用户的一切"""
user_info['first_name']=first
user_info['last_name']=last
return user_info
user_profile=build_profile('albert','einstein',
location='princeton',
field='pyhsics')
print(user_profile)
#通用形参名**kwargs用于收集任意数量的关键字实参
7.5将函数存储在模块中
导入整个模块
import文件要放在文件开头
#下面这个模块为pizza.py
def make_pizza(size,*toppings):
"""概述要制作的比萨"""
print(f"\nMaking a {size}-inch pizza with the following toppings:")
for topping in toppings:
print(f"-{topping}")
#在pizza.py所在的目录中创建一个名为making_pizzas.py的文件,并导入刚刚创建的模块
import pizza
#此行代码会将pizza.py文件中的所有函数都复制到程序中
pizza.make_pizza(16,'pepperoni')
pizza.make_pizza(12,'mushrooms','green peppers','extra cheese')
导入模块中的特定函数
from pizza import make_pizza,make_pizza2,make_pizza3
#使用逗号分隔开各个函数,就可以导入任意数量的函数
pizza.make_pizza(16,'pepperoni')
pizza.make_pizza(12,'mushrooms','green peppers','extra cheese')
使用as给函数指定别名
此方法可以给函数指定别名
from pizza import make_pizza as mp
mp(16,'pepperoni')
mp(12,'mushrooms','green peppers','extra cheese')
使用as给模块指定别名
import pizza as p
p.make_pizza(16,'pepperoni')
p.make_pizza(12,'mushrooms','green peppers','extra cheese')
导入模块中的所有函数
#使用星号*运算符可以让python导入模块中的所有函数
from pizza import*
make_pizza(16,'pepperoni')
make_pizza(12,'mushrooms','green peppers','extra cheese')