第8章 函 数
8.1 定义函数
1.函数分为函数入口和函数代码块
2.函数代码块也需要严格缩进,代表函数的内容
3.使用文档字符串备注是三对双引号
8.1.1 向函数传递信息
1.函数有可以传递参数也可以不传递,参数相当于函数代码需要执行的数据
8.1.2 实参和形参
1.形参指函数中对参数的使用描述
2.实参指函数调用入口传递的参数描述
动手试一试
8-1 消息:编写一个名为 display_message()的函数,它打印一个句子,指出你在本
章学的是什么。调用这个函数,确认显示的消息正确无误。
8-2 喜欢的图书:编写一个名为 favorite_book()的函数,其中包含一个名为 title
的形参。这个函数打印一条消息,如 One of my favorite books is Alice in Wonderland。
调用这个函数,并将一本图书的名称作为实参传递给它。
8.2 传递实参
1.可以传递关键字、位置参数
8.2.1 位置实参
1.位置实参需要注意参数的位置顺序,不然调用错参数
2.位置实参其实也就是多个参数传递
8.2.2 关键字实参
1.直接指定函数中形参的名字,这样函数调用形参不会错
8.2.3 默认值
1.当一个函数的某一个参数固定的时候,我们可以直接写死
2.如果我们已经使用了参数默认值,如果传递的时候仍写值,那么会覆盖默认值
8.2.4 等效的函数调用
1.函数传递参数有几种方式,我们只需要使用自己按理想输出的方式就行
8.2.5 避免实参错误
1.告诉我们需要传递参数
动手试一试
8-3 T 恤:编写一个名为 make_shirt()的函数,它接受一个尺码以及要印到 T 恤上
的字样。这个函数应打印一个句子,概要地说明 T 恤的尺码和字样。
使用位置实参调用这个函数来制作一件 T 恤;再使用关键字实参来调用这个函数。
8-4 大号 T 恤:修改函数 make_shirt(),使其在默认情况下制作一件印有字样“I love
Python”的大号 T 恤。调用这个函数来制作如下 T 恤:一件印有默认字样的大号 T 恤、
一件印有默认字样的中号 T 恤和一件印有其他字样的 T 恤(尺码无关紧要)。
8-5 城市:编写一个名为 describe_city()的函数,它接受一座城市的名字以及该城
市所属的国家。这个函数应打印一个简单的句子,如 Reykjavik is in Iceland。给用
于存储国家的形参指定默认值。为三座不同的城市调用这个函数,且其中至少有一座城
市不属于默认国家。
8.3 返回值
1.函数可以处理数据进行返回,使用return关键字
2.这样简化主程序的代码
8.3.1 返回简单值
1.使用函数处理某样东西,这样方便我们下次重复调用
8.3.2 让实参变成可选的
1.当某一个参数可选择有或者没有的时候,我们使用默认值为空
2.接下来的程序只需要判断可选参数是否为空执行不同语句
8.3.3 返回字典
1.根据传入的参数构造一个字典进行返回
8.3.4 结合使用函数和 while 循环
1.可以在while循环中使用函数重复调用
动手试一试
8-6 城市名:编写一个名为 city_country()的函数,它接受城市的名称及其所属的
国家。这个函数应返回一个格式类似于下面这样的字符串:
"Santiago, Chile"
至少使用三个城市国家对调用这个函数,并打印它返回的值。
8-7 专辑:编写一个名为 make_album()的函数,它创建一个描述音乐专辑的字典。
这个函数应接受歌手的名字和专辑名,并返回一个包含这两项信息的字典。使用这个函
数创建三个表示不同专辑的字典,并打印每个返回的值,以核实字典正确地存储了专辑
的信息。
给函数 make_album()添加一个可选形参,以便能够存储专辑包含的歌曲数。如果调
用这个函数时指定了歌曲数,就将这个值添加到表示专辑的字典中。调用这个函数,并
至少在一次调用中指定专辑包含的歌曲数。
8-8 用户的专辑:在为完成练习 8-7 编写的程序中,编写一个 while 循环,让用户
输入一个专辑的歌手和名称。获取这些信息后,使用它们来调用函数 make_album(),并
将创建的字典打印出来。在这个 while 循环中,务必要提供退出途径。
8.4 传递列表
1.可以传递一个列表中包含字典,提高传输效率
8.4.1 在函数中修改列表
1.使用函数来明确代码功能之间的切割,从而减少耦合
def print_models(unprinted_designs, completed_models):
"""
模拟打印每个设计,直到没有未打印的设计为止
打印每个设计后,都将其移到列表completed_models中
"""
while unprinted_designs:
current_design = unprinted_designs.pop()
# 模拟根据设计制作3D打印模型的过程
print("Printing model: " + current_design)
completed_models.append(current_design)
show_completed_models(completed_models)
# 按 Shift+F10 执行或将其替换为您的代码。
# 按 双击 Shift 在所有地方搜索类、文件、工具窗口、操作和设置。
def show_completed_models(completed_models):
"""显示打印好的所有模型"""
print("\nThe following models have been printed:")
for completed_model in completed_models:
print(completed_model)
# 按装订区域中的绿色按钮以运行脚本。
if __name__ == '__main__':
unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
completed_models = []
print_models(unprinted_designs, completed_models)
8.4.2 禁止函数修改列表
1.当我们需要保持列表的原始数据,我们可以传递列表的副本进行操作
def print_models(unprinted_designs, completed_models):
"""
模拟打印每个设计,直到没有未打印的设计为止
打印每个设计后,都将其移到列表completed_models中
"""
while unprinted_designs:
current_design = unprinted_designs.pop()
# 模拟根据设计制作3D打印模型的过程
print("Printing model: " + current_design)
completed_models.append(current_design)
show_completed_models(completed_models)
# 按 Shift+F10 执行或将其替换为您的代码。
# 按 双击 Shift 在所有地方搜索类、文件、工具窗口、操作和设置。
def show_completed_models(completed_models):
"""显示打印好的所有模型"""
print("\nThe following models have been printed:")
for completed_model in completed_models:
print(completed_model)
# 按装订区域中的绿色按钮以运行脚本。
if __name__ == '__main__':
unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
completed_models = []
print_models(unprinted_designs[:], completed_models)
print(unprinted_designs)
动手试一试
8-9 魔术师:创建一个包含魔术师名字的列表,并将其传递给一个名为
show_magicians()的函数,这个函数打印列表中每个魔术师的名字。
8-10 了不起的魔术师:在你为完成练习 8-9 而编写的程序中,编写一个名为
make_great()的函数,对魔术师列表进行修改,在每个魔术师的名字中都加入字样“the
Great”。调用函数 show_magicians(),确认魔术师列表确实变了。
8-11 不变的魔术师:修改你为完成练习 8-10 而编写的程序,在调用函数
make_great()时,向它传递魔术师列表的副本。由于不想修改原始列表,请返回修改后
的列表,并将其存储到另一个列表中。分别使用这两个列表来调用 show_magicians(),
确认一个列表包含的是原来的魔术师名字,而另一个列表包含的是添加了字样“the
Great”的魔术师名字。
8.5 传递任意数量的实参
1.使用*xxxxs作为形参,这样不管实参传递多少过来,都会被这个元组形参接收
8.5.1 结合使用位置实参和任意数量实参
1.位置实参最好放在任意实参前面,这样不会导致报错 2.如果要放在任意数量实参后面,需要指定参数
8.5.2 使用任意数量的关键字实参
1.当我们需要接受任意键值对的实参时,我们使用**xxxxs接收,代表创建字典进行存储
动手试一试
8-12 三明治:编写一个函数,它接受顾客要在三明治中添加的一系列食材。这个
函数只有一个形参(它收集函数调用中提供的所有食材),并打印一条消息,对顾客点
的三明治进行概述。调用这个函数三次,每次都提供不同数量的实参。
8-13 用户简介:复制前面的程序 user_profile.py,在其中调用 build_profile()来
创建有关你的简介;调用这个函数时,指定你的名和姓,以及三个描述你的键值对。
8-14 汽车:编写一个函数,将一辆汽车的信息存储在一个字典中。这个函数总是接
受制造商和型号,还接受任意数量的关键字实参。这样调用这个函数:提供必不可少的
信息,以及两个名称—值对,如颜色和选装配件。这个函数必须能够像下面这样进行调用:
car = make_car('subaru', 'outback', color='blue', tow_package=True)
打印返回的字典,确认正确地处理了所有的信息
8.6 将函数存储在模块中
1.可以使用import导入模块来进行拆分代码
2.使用别人的模块代码
8.6.1 导入整个模块
1.导入模块之后就可以使用模块+函数名来达到使用函数
8.6.2 导入特定的函数
1.使用from xxx import xxx语法进行导入模块的函数,这样可以直接调用这个函数,无需前面跟模块名
8.6.3 使用 as 给函数指定别名
1.如果指定了别名,我们需要用别名进行调用
8.6.4 使用 as 给模块指定别名
1.只使用模块就需要用import
8.6.5 导入模块中的所有函数
1.使用*号代表所有,并且调用模块函数不需要指定模块名 2.最好只导入自己使用的函数,如果函数冲突会覆盖函数的使用
8.7 函数编写指南
1.函数名应该具备描述性名称
2.使用小写字母和下划线
动手试一试
8-15 打印模型:将示例 print_models.py 中的函数放在另一个名为 printing_
functions.py 的文件中;在 print_models.py 的开头编写一条 import 语句,并修改这个文
件以使用导入的函数。
8-16 导入:选择一个你编写的且只包含一个函数的程序,并将这个函数放在另一
个文件中。在主程序文件中,使用下述各种方法导入这个函数,再调用它:
import module_name
from module_name import function_name
from module_name import function_name as fn
import module_name as mn
from module_name import *
8-17 函数编写指南:选择你在本章中编写的三个程序,确保它们遵循了本节介绍
的函数编写指南。
8.8 小结
1.如何使用函数,函数的传参
2.如何使用位置实参和关键字实参和任意实参
3.调用函数的返回值
4.函数结合列表,字典,if,while结合使用
5.将某些函数存储在独立的模块文件中