函数是带名字的代码块,用于完成具体的工作。要执行函数定义的特定任务,可调用该函数。
- 简单函数的构成
def greet_user():
#使用关键字def定义一个函数,可以在括号内指出函数为完成其任务需要什么样的信息。以冒号结尾。
"""显示简单的问候"""
#文档字符串,描述该函数的功用。使用help()函数可以查看该注释内容
print("Hello!")
greet_user()#函数调用。一次指定函数名以及用括号括起来的必要信息。
修改版本如下:
def greet_user(name):
#使用关键字def定义一个函数,可以在括号内指出函数为完成其任务需要什么样的信息。以冒号结尾。
"""显示简单的问候"""
#文档字符串,描述该函数的功用。使用help()函数可以查看该注释内容
print("Hello!"+name.title()+".")
greet_user('lin')#函数调用。一次指定函数名以及用括号括起来的必要信息。我们在这指定了姓名。可重复调用。
在这里,涉及形参和实参的关系。
本函数中,name是一个形参,即函数完成工作所需的一项信息。
而’lin’是一个实参,是调用函数是传递给函数的信息。
传递实参的方式
函数定义可能包含多个形参,函数调用也可能包含多个实参。
向函数传递实参的方式基本上有:位置实参(要求实参与形参位置一致);关键字实参(每个实参都由变量名和值组成);使用列表和字典。
- 位置实参
基于实参的位置关联到形参。
def describe_pet(a_type,name):
"""显示动物信息"""
print("The type is "+_type+".")
print("The name is "+name+".")
describe_pet('dog','whilte')
在这里,需要一种动物类型和名字。在定义时我们定义了两个形参,在调用时依次给出两个实参。两个实参依次存储在两个形参变量中。
一定要注意顺序要一样。
- 关键字实参
关键字实参是传递给函数的名称——值对。在实参中将名称和值关联起来。无需考虑函数调用中的实参顺序,并清除指出了函数调用中各个值的用途。
def describe_pet(a_type,name):
"""显示动物信息"""
print("The type is "+_type+".")
print("The name is "+name+".")
describe_pet(name='whilte',a_type='dog')
在这里,顺序完全不同,但输出一样,并很清楚实参值的用处。
必须要准确指定函数定义中的形参名。
- 默认值
编写时,可以给形参指定默认值。在调用函数时给形参提供了实参时,Python将使用指定的实参值;否则,将使用默认值。给形参指定默认值后,可以在函数调用时省略相应的实参。
def describe_pet(name,a_type='dog'):
"""显示动物信息"""
print("The type is "+_type+".")
print("The name is "+name.title()+".")
describe_pet(name='whilte')
我们将a_type指定默认值’dog’,调用时,也没有给其指定值,所以Python将会继续使用这个值。
一定要将带有默认值的形参放在末尾处,否则会报错。原因是Python已然将实参视作位置实参。
返回值
函数除了直接显示输出外,还可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值。可用return语句将值返回到调用函数的代码行。
返回值的好处在于能够将程序的大部分繁重工作移到函数中完成,从而简化主程序。
- 返回简单值
def get_fullname(f_name,l_name):
"""返回整个名字"""
full_name=f_name+' '+l_name
return full_name.title()
hero=get_fullname('lin','hert')
print(hero)
我们将full_name的值首字母大写,并将结果返回到函数调用行。
调用返回值的函数时,必须要提供一个变量用于存储返回的值。
- 返回字典
def build_person(f_name,l_name):
"""返回一个字典,其中存储包含一个人的信息"""
person={'first':f_name,'last':l_name}
return person
people=build_person('lin','he')
print(people)
将形参包含在字典内,调用时不断用实参填充字典。
- 结合使用while循环
def get_fullname(f_name,l_name):
"""返回整个名字,并打招呼"""
full_name=f_name+' '+l_name
return full_name.title()
sign=True
while sign:
print("Please entry your name.")
f_name=input("This is your first name: ")
if f_name=='q':
sign=False
l_name=input("Last name: ")
if l_name=='q':
sign=False
hero=get_fullname(f_name.l_name)
print("Hello!"+hero+'.')
我们先定义了一个返回值的函数,而后使用用户输入调用该函数,在用户输入时,使用标志退出循环。
- 使用函数修改列表
def print_models(un_designs,over_models):
"""模拟打印每个设计,打印结束后,转移到另一个列表中"""
while un_designss:
design=un_designs.pop()#从末尾依次弹出元素
print("Ing:"+design+".")
over_models.append(design)
def show_design(over_models):
"""显示打印好的"""
print("\nHave been printed:")
for design in over_models:
print(design)
un_designs=['robot','dog','cat','tiger']
over_models=[]
print_models(un_designs,over_models)
show_designs(over_models)
我们定义了两个函数,第一个打印模型,并将打印好的转移到另一个列表中,第二个显示打印好的模型信息。我们在调用时先给变量赋值,再将变量作为实参传入。
如果不想让原来的列表清空,可以使用切片,即def print_models(un_designs[:],over_models)
。这样函数所做的任何修改都只影响副本。
传递任意数量的实参
- 元组实参
def make_food(*toppings):
"""打印所有配料"""
print(toppings)
make_food('pea')
make_food('mushrooms','cheese')
形参名*toppings中的星号让Python创建一个名为toppings的空元组,并将接收到的所有值都封装到这个元组内。
要注意,如果要让函数接受不同类型的实参,必须将函数定义中的接纳任意数量实参的形参放在最后。
ef make_food(size,*toppings):
"""打印所有配料"""
print(toppings)
make_food(16,'pea')
make_food(18,'mushrooms','cheese')
Python会优先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
- 字典实参(关键字)
需要接收任意数量的实参,但预先不知道传递给函数的是什么样的信息。这个时候,可以将函数编写成能够接受任意数量的键值对(调用语句提供了多少就接受多少)。
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
#使用for循环将自定义数量的键值对输入进该字典
return profile#返回填充好的字典
user_profile=build_profile('albert','einstein',#前两个形参的实参
location='princeton',
field='physics'#自定义的键值对
}
print(user_profile)
形参**user_info中的两个星号让跑一趟hi创建一个名为user_info的空字典,并将接受到的所有键值对都封装到该字典中。
注意:编写函数时,可以以各种方式混合使用位置实参、关键字实参,默认值和任意数量的实参(表示元组的必须放在表示字典的前面)
导入模块
import语句允许在当前运行的程序文件中使用模块中的代码。
模块是扩展名为.py的文件。
只需编写一条import语句并在其中指定模块名。
使用时,就可以使用下面的语法。
module_name.function_name()
- 导入模块中的特定函数:
多个时,就用逗号分隔
from module_name import function_name1,function_name2
-导入函数或模块时,指定别名
from module_name import function_name as ph
使用as关键字
- 导入模块中的所有函数
from module_name import *
- 函数命名法则
1 用小写字母与下划线命名
2 用文档字符串格式注释
3 默认形参不加空格
4 注释清晰明了