我们引入的模块通常有三种类型,一种是系统库中存在的模块,一种是第三方模块,最后一种就是我们自己定义来的模块。当我们在写一个程序的时候,为了避免一个主程序的代码过于复杂,我们会将一些函数或功能写在单独的文件中,然后通过主程序调用这些自己定义的模块,我们自己定义的模块注意扩展名要以.py结尾。
本章节我们通过一个发牌游戏来学习自定义模块,题目为:
4个人玩牌,电脑随机将52张牌(不含大小王)发给4个人,在屏幕上显示每位牌手的牌。
问题分析:
1. 52张牌,按梅花0-12,方块13-25,红桃26-38,黑桃39-51顺序编号并存储在pocker列表中(未洗牌之前)。
2. 定义一个洗牌功能,随机产生两个位置索引,交换两个牌的位置,进行100次随机交换,达到洗牌的目的。
3. 发牌时,交换后pocker列表,按顺序加到四个牌手的列表中。
4. 52张牌发给4个人,每人13张,13轮循环,每次循环发给四个人。
5. 每人发一张牌的动作一样,用函数main实现。
6. 发一张牌的动作可以包含两部分:获取花色,获取数值,分别用get_color和get_value实现。
1. 创建模块
我们可以采用自定义模块来解决上面的问题,首先我们分析一下我们有几个功能要创建模块,洗牌和发牌这些都是可以放在主程序中的,每张牌的花色和数值我们是可以放在模块中的,那么我们就先来创建2个模块来完成这两个功能。
首先完成获取颜色的模块及其函数:
def get_color(n): if n<13: return '梅花' elif n<26: return '方块' elif n<39: return '红桃' else: return '黑桃'
模块名为getcolor.py。
接下来创建获取值的模块及其函数:
def get_value(n): if n==0 or n==13 or n==26 or n==39: return 'A' elif n==12 or n==25 or n==38 or n==51: return 'K' elif n==11 or n==24 or n==37 or n==50: return 'Q' elif n==10 or n==23 or n==36 or n==49: return 'J' else: return n%13
模块名为getvalue.py。
2. 调用模块并完善主程序
调用自己定义的模块,关键代码如下:
from getcolor import get_color from getvalue import get_value
完整代码如下:
import random from getcolor import get_color from getvalue import get_value n = 52 def gen_pocker(n): random.shuffle(n) return n def main(): List = [] # 代表一副牌,现在表示还没有牌,只是一个牌盒 for i in range(0, 52): List.append(i) # 按顺序往牌盒中放入52张牌 List = gen_pocker(List) # 将牌盒中的牌打乱顺序 List1 = [] # 定义4个牌手 List2 = [] List3 = [] List4 = [] for i in range(0, 52): # 实现发牌 if i < 13: # 打乱后的前13张牌发给牌手1,实现牌手1手牌中如何含有花色和数字 List1.append(get_color(List[i]) + str(get_value(List[i]))) elif i < 26: List2.append(get_color(List[i]) + str(get_value(List[i]))) elif i < 39: List3.append(get_color(List[i]) + str(get_value(List[i]))) else: List4.append(get_color(List[i]) + str(get_value(List[i]))) print(List) print("牌手1", List1) print("牌手2", List2) print("牌手3", List3) print("牌手4", List4) main()
输出结果为:
[48, 30, 25, 51, 10, 34, 41, 19, 38, 8, 13, 3, 24, 28, 43, 35, 6, 49, 37, 0, 33, 27, 11, 14, 4, 31, 21, 50, 9, 46, 12, 47, 1, 44, 18, 22, 26, 32, 20, 42, 45, 7, 17, 36, 29, 2, 15, 40, 39, 5, 16, 23] 牌手1 ['黑桃9', '红桃4', '方块K', '黑桃K', '梅花J', '红桃8', '黑桃2', '方块6', '红桃K', '梅花8', '方块A', '梅花3', '方块Q'] 牌手2 ['红桃2', '黑桃4', '红桃9', '梅花6', '黑桃J', '红桃Q', '梅花A', '红桃7', '红桃1', '梅花Q', '方块1', '梅花4', '红桃5'] 牌手3 ['方块8', '黑桃Q', '梅花9', '黑桃7', '梅花K', '黑桃8', '梅花1', '黑桃5', '方块5', '方块9', '红桃A', '红桃6', '方块7'] 牌手4 ['黑桃3', '黑桃6', '梅花7', '方块4', '红桃J', '红桃3', '梅花2', '方块2', '黑桃1', '黑桃A', '梅花5', '方块3', '方块J']
在这个题中,我们采用的是导入模块的第三种方式,直接引入模块的函数功能,如果我们采用第一种导入模式的时候,注意使用方式要加上模块名,例如:
import getcolor print(getcolor.get_color(2))
一定要注意模块名的添加。
3. 总结
通过这个例子我们学习了怎么去创建自定义模块及模块的使用,自己去练习一下可以学习到这种剖析题目的解题思维,下面几节我们来学习几个常用的内置模块。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程