函数
一、定义函数——def
1.定义函数
#关键字def定义一个函数,括号内也可指出为完成任务而需要的信息
def greet():
#函数体:描述函数做什么,文档字符串用三引号括起
"""显示简单的问候语"""
#函数体内的代码
print("Hello")
#调用这个函数,即使用它
greet()
2.向函数传递信息
3.实参和形参
实参(调用函数时传递给函数的信息)存储在形参中,如上述’elaine‘是实参;username是形参
二、传递实参
1.位置实参
调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。
其中最简单的关联方式是基于实参的顺序——即位置实参
如果实参的顺序不正确,结果可能出乎意料
2.关键字实参
调用函数时,我们向Python明确地指出了各个实参对应的形参
describe_pet(animal_type='hamster', pet_name='harry')
describe_pet(pet_name='harry', animal_type='hamster')
3.默认值
编写函数时,可给每个形参指定默认值,在调用函数时给形参提供了实参,Python将使用指定的实参值;否则将使用形参的默认值。
Python 依然将这个实参视为位置实参,因此如果函数调用中只包含宠物的名字,这个实参将关联到函数 定义中的第一个形参
所以使用默认值时,将默认值放到最后面
#使用这个函数最简单的方式是只提供dog的名字describe_pet('huahua')
#这个实参将关联到函数定义中的第一个形参pet_name
def describe_pet(pet_name, animal_type='dog'):
4.等效的函数调用
鉴于可混合使用位置实参、关键字实参和默认值,通常有多种等效的函数调用方式。
# 一条名为Willie的小狗
describe_pet('willie')
describe_pet(pet_name='willie')
#一只名为Harry的仓鼠
describe_pet('harry', 'hamster')
describe_pet(pet_name='harry',animal_type='hamster')
describe_pet(animal_type='hamster', pet_name='harry')
三、返回值
1.返回简单值
函数返回的值被称为返回值。
在函数中,可使用return语句将值返回到调用函数的代码行。
返回值让你能够将程序的大部分繁重工作移到函数中去完成,从而简化主程序。
def name(first,last):
"""返回首字母大写的姓名"""
full_name = first + " " + last
return full_name.title()#转换为首字母大写格式并将结果返回到函数调用行
#调用返回的函数时,需要提供一个变量用于存储返回的值
musician = name('Zhou','Jaiyi')
print(musician)
2.让实参变成可选的
可使用默认值(放在无默认值的形参后面)
让实参变成可选的。
def name(first,last,middle = ''):
"""返回首字母大写的姓名"""
if middle:
full_name = first + ' ' + middle + ' ' + last
else:
full_name = first + " " + last
return full_name.title()#转换为首字母大写格式
musician = name('Zhou','yi','Jia')
dancer = name('yi','yi')
print(musician)
print(dancer)
3.返回字典
def name(first,last,age = ''):
"""返回一个包含人信息的字典"""
person = {'first_name' : first,'last_name' : last}
if age:
person['age'] = age
return person#将结果返回到函数调用行
musician = name('Zhou','Jiayi',age=21)#用于存储返回的值
dancer = name('y','y')
print(musician,dancer)
四、传递列表
1.在函数中修改列表(将列表传递给函数)
def print_models(designs,models): """打印每个设计(design)后挪入模型(models)中,输出挪入过程""" while designs:
current_design = designs.pop()
print(current_design)
models.append(current_design)
def show_models(models):
"""显示所有models"""
for model in models:
print(model)
designs = ['iphone11' , 'iphone11Pro' , 'iphone12' , 'iphone12Pro'] models = [] print_models(designs,models)#print_models(designs[:],models) 详见四、2.
show_models(models)
It’s一种理念——每个函数都只负责一项具体的工作,将复杂的任务划分为一系列的步骤,更易于扩展和维护,修改效率更高。函数是可以调用另一个函数的。
2.函数不修改原列表进行操作
将列表的副本传给函数——function_name(list[:])
切片表示法[:]创建列表的副本
具体查看四、1.注释
虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由需要传递副本,否则还是传递原始列表给函数,因为让函数使用现成列表可避免花时间和内存创建副本,从而提高效率,在处理大型列表时尤其如此。
五、传递任意数量的实参
#星号让Python创建一个名为toppings的空元组
#并将收到的所有值都封装到这个元组中
def pizza(*toppings):
"""print all the sources guests needed"""
print(toppings)
#Python将实参封装到一个元组中,即使是一个值
pizza('pepper','mushroom','cheese')
1.结合使用 位置实参和任意数量实参
如果要让函数接收不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。
Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
#Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中
def pizza(size,*toppings):
"""print info guests needed"""
print("\nMaking pizza(" + str(size) + " inch)")
for topping in toppings:
print("- " + topping)
#Python将实参封装到一个元组中,即使是一个值
pizza(12,'pepper','mushroom','cheese')
2.使用任意数量的关键字实参
#两个星号让Python创建一个名为user_info的空字典
#所有键值对都封装到这个字典中
#函数build_profile()的定义————
#要求提供姓和名,同时允许用户根据需要提供任意数量的名称-值对
def build_profile(first,last,**user_info):
"""字典中包含用户信息"""
profile = {}#创建空字典
profile['fname'] = first#将形参加入空字典
profile['lname'] = last #将形参加入空字典
#遍历user_info中的键值对
for key,value in user_info.items():
#将每个键值对都加入到字典profile中
profile[key] = value
#将字典profile返回给函数调用行
return profile
user_profile = build_profile('albert','elena',
location='prince',
field='physics')
print(user_profile)
3.练习
编写一个函数,它接受顾客要在三明治中添加的一系列食材。这个 函数只有一个形参(它收集函数调用中提供的所有食材),并打印一条消息,对顾客点 的三明治进行概述。调用这个函数三次,每次都提供不同数量的实参。
用户简介:复制前面的程序 user_profile.py,在其中调用 build_profile()来 创建有关你的简介;调用这个函数时,指定你的名和姓,以及三个描述你的键值对。
def build_profile(first,last,**extra):
"""返回我的简介字典——profile{}"""
profile = {}
profile['fname'] = first
profile['lname'] = last
#将extra{}中的键值对填充为profile{}的键值对
for key,value in extra.items():
profile[key] = value
return profile
my_profile = build_profile('Jiayi','Zhou',
job = 'student',
age = '21')
print(my_profile)
def make_car(maker,size,**extra):
"""返回字典"""
car_profile = {}
car_profile['c_maker'] = maker
car_profile['c_size'] = size
for key,value in extra.items():
car_profile[key] = value
return car_profile
car = make_car('subaru' , 'outback',
color = 'blue',
tow_package = 'True')
print(car)
六、函数与模块
1.导入整个模块
要让函数是可导入的,得先创建模块。模块是扩展名为.py的文件,包含要导入到程序中的代码。
①编写一条import语句并在其中指定模块名,就可在程序中使用该模块中的所有函数。
import moudule_name#improt 模块名
②导入了名为module_name.py的整个模块,就可用下面的语法来使用其中任何一个函数:
module_name.function_name ()#调用模块中的函数—————模块名.函数名()
2.导入函数
from module_name import function_name#导入模块中的特定函数
from module_name import function_0 , function_1 , function_#导入任意数量的函数
from pizza import * #导入模块中所有的函数
3.使用as给函数、模块指定别名
如果要导入的函数的名称可能与程序中现有的名称冲突,或者函数的名称太长,可指定简短 而独一无二的别名——函数的另一个名称,类似于外号。要给函数指定这种特殊外号,需要在导 入它时这样做。
from module_name import function_name as fn#给函数指定别名
import module_name as mn#给模块指定别名