函数

第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')

 

posted @ 2021-11-16 10:24  仓颉cahr  阅读(48)  评论(0编辑  收藏  举报