python 第八章 函数
# 函数:函数是带名字的代码块,用于完成具体的工作。要执行函数定义的特殊任务,可调用该函数。,当需要在程序中多次执行同一项任务时,无需反复编写完成该任务的代码,只需要调用执行该任务的函数,让python运行其中的代码即可。
# 函数定义
def greet_user():
"""显示简单的问候语"""
print("Hello!")
# 第一行代码使用关键字def来告诉python,你要定义一个函数,这是函数定义,并在后面接上函数名,后面括号就是接收参数,可以为空,但是括号不能省,最后以冒号结尾。后面紧接着的缩进的代码就是函数体。
# 使用greet_user()函数,就直接调用它
greet_user()
# 向函数传递信息
def greet_user(username):
"""显示简单的问候语"""
print(f"Hello,{username} !")
print(type(username))
greet_user('jesse')
greet_user(123)
greet_user([1,2,3])
# 如果函数定义时提供了参数,调用时必须提供参数,否则会得到错误。然后上面我做了三种数据格式作为参数传入,这里可以看到,python会自动将参数转为对应的数据类型。
# 实参和形参
# 在上面的函数定义中,变量username就是形参,而函数调用中传递的jesse就是实参。这一个我其实觉得无所谓,和写代码不相关
# 传递实参:位置实参、关键字实参和默认值
# 位置实参:在调用函数时,python必须将函数调用中的每个实参关联到函数定义中的一个形参。最简单的方式是基于实参的顺序进行关联。以这种方式关联的实参成为位置实参。
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')
describe_pet('dog','willie')
# 关键字实参:关键字实参是传递给函数的名值对。这样会直接在实参中将名称和值关联起来,因此向函数传递实参时就不会混淆了。关键字实参不仅让你无需考虑函数调用中的实参顺序,并且清楚地指出了函数调用中各个值的用途。
describe_pet(animal_type='hamster',pet_name='harry')
describe_pet(pet_name='harry',animal_type='hamster')
# 默认值:在编写函数时,可以给每个形参指定默认值。如果在调用函数中给形参提供了实参,python将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参。
# # 注意点:默认值必须位于所有非默认参数之后。不然python可能会将位置实参与默认值匹配致错误。
def describe_pet(pet_name,animal_type='dog'):
"""显示宠物的信息"""
print(f"\nI have a {animal_type}.")
print(f"My {animal_type}'s name is {pet_name.title()}.")
describe_pet('willie')
describe_pet(pet_name='willie')
describe_pet('harry','hamster')
# 返回值:函数返回的值称为返回值。,在函数中,可以使用return语句将值返回到调用函数的那行代码。
# 返回简单的值
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)
# 让实参变成可选的:在形参列表中,可指定默认值。这样,在调用函数时,若没有提供形参,Python将使用默认值。然后在函数体里面给出默认参数的判断语句,这样就比较灵活地使用了
def get_formatted_name(first_name,last_name,middle_name=''):
"""返回整洁的姓名"""
if middle_name: # 如果有中间名,则返回中间名。中间名为空串,在这里会判断为false
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('jimi','hendrix')
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 greet_users(names):
"""向列表中的每位用户都发出简单的问候"""
for name in names:
msg=f"Hello,{name.title()}!"
print(msg)
usernames=['hannah','ty','margot']
greet_users(usernames)
# 在函数中修改列表:函数调用时,可修改列表。
# 将列表传递给函数后,函数就可以对其进行修改了。在函数中对这个列表所做的任何修改都是永久的,这让你能够高效地处理大量数据。
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)
# 禁止函数修改列表:可向函数传递列表的副本而不是原始列表。
# 切片表示法:[:]创建列表的副本
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)
# 传递任意数量的实参:使用星号(*)
def make_pizza(*toppings):
"""打印顾客点的所有配料"""
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms','green peppers','extra cheese')
# 形参名*toppings中的星号让python创建一个名为toppings的元组,该元组包含函数收到的所有值。
# 结合使用位置实参和任意数量的实参:如果要让函数接收不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
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(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)
# 我们经常会看到形参名**kwargs,它用于收集任意数量的关键字实参。
# 将函数存储在模块中(这部分后面都是没有演示示例的,因为在写文的时候没办法展示不同的文件)
# 将函数存储在称为模块的独立文件中,再将模块导入(import)主程序。import语句可让你在当前运行的程序文件中使用模块中的代码。
# import pizza
# pizza.make_pizza(16,'pepperoni') //这里的使用的方式是候,使用模块名.函数名()
# 导入整个模块:模块是扩展名为.py的文件,包含要导入程序的代码。
# eg:import pizza
# 这里pizza'是模块的名称,表示模块的文件名,但不包括扩展名。
# 导入特定的函数:
# eg:from pizza import make_pizza, make_pizza2
# 这里的make_pizza和make_pizza2是函数的名称。pizza'是模块的名称。多个函数用逗号隔开。
# 使用as给函数指定别名
# eg:from pizza import make_pizza as mp
# 这里的mp是函数的别名。
# 使用as给模块指定别名
# eg:import pizza as p
# 这里的p是模块的别名。
# 导入模块中的所有函数
# eg:from pizza import *
# 这里的*表示导入模块中的所有函数。使用方式是:直接调用函数名即可。
更多推荐


所有评论(0)