目录
1. 模块概述
Python中有很多功能强大的模块,这些模块有的存在于Python系统库中,有的存在于第三方库中,这些模块会为我们提供各种各样的功能。
我们举个例子来形容一下模块,我们在准备一个新房的时候,我们会在里面置备一些物品,例如电饭煲、微波炉、电话、电脑等,电饭煲为我们提供煲饭、煲粥、蒸米饭等功能,微波炉为我们提供低温加热、中温加热、高温加热等功能,手机为我们提供接电话、打电话、存号码等功能、电脑为我们提供编程、查阅资料、网络维护等功能。如果我们再买来一台榨汁机,榨汁机为我们提供了榨果汁、做奶昔、做果酱等功能。
对于上面的例子,我们可以把电饭煲、微波炉、电话、电脑等最初就在家中准备好的物品看作是内部模块,我们在家中就可以直接使用它们的功能,也就是说我们只要把这个物品拿出来我们就可以使用,而后来买的榨汁机,我们可以看作是我们从第三方库中引入的模块,我们只要从第三方库中买来之后,我们才可以拿出来使用它的一系列功能。我们总结一下,内部模块就是存储在内部可以直接调用的模块,调用了这个模块我们就可以使用它的功能,而第三方库中的模块则是需要我们先下载,下载完之后我们才可以调用来使用。
看下面的示意图:
我们再来看一个例子,我们在前面曾多次提到过random模块,在random模块中为我们提供了一系列的功能,我们在这里简单的使用一下这个模块。
1 2 3 |
|
输出结果:
1 |
|
要注意的是,当我们使用模块中的功能时一定要先引入这个模块,如果不引入会出现下面的情况:
1 2 3 4 |
|
我们在导入了模块名之后就可以使用模块中的所有方法。
下面我们来介绍一下模块的几种调用方式。
1) import 模块名
这种方式就是我们常用的调用方式,直接调用了模块中的所有方法,我们可以直接在程序中使用。
例如:
当我们调用了random之后,我们在使用的时候可以看到它所包含的一系列方法。
2) import 模块名 as 别名(注意在命名的时候不要使用符号)
1 2 3 |
|
输出结果为:
1 |
|
这种方式等同于给这个模块又取了一个名字,我们可以通过这个别名来使用模块中的方法。
3) from 模块名 import 函数名
1 2 3 |
|
输出结果为:
1 |
|
这种方式仅仅调用了模块中的一个函数,我们在使用这函数的时候可以直接使用。
如果使用这个模块中的其他方法,则会出现错误信息。
2.创建模块
我们引入的模块通常有三种类型,
- 一种是系统库中存在的模块,
- 一种是第三方模块,
- 最后一种就是我们自己定义来的模块。
当我们在写一个程序的时候,为了避免一个主程序的代码过于复杂,我们会将一些函数或功能写在单独的文件中,然后通过主程序调用这些自己定义的模块,我们自己定义的模块注意扩展名要以.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实现。
2.1. 创建模块
我们可以采用自定义模块来解决上面的问题,首先我们分析一下我们有几个功能要创建模块,洗牌和发牌这些都是可以放在主程序中的,每张牌的花色和数值我们是可以放在模块中的,那么我们就先来创建2个模块来完成这两个功能。
首先完成获取颜色的模块及其函数:
1 2 3 4 5 6 7 8 9 |
|
模块名为getcolor.py。
接下来创建获取值的模块及其函数:
1 2 3 4 5 6 7 8 9 10 11 |
|
模块名为getvalue.py。
2.2. 调用模块并完善主程序
调用自己定义的模块,关键代码如下:
1 2 |
|
完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
输出结果为:
1 2 3 4 5 6 7 8 9 10 11 |
|
在这个题中,我们采用的是导入模块的第三种方式,直接引入模块的函数功能,如果我们采用第一种导入模式的时候,注意使用方式要加上模块名,例如:
1 2 |
|
一定要注意模块名的添加。
3.math模块
Python的math模块为我们提供了一系列关于数学方面的功能,可以帮助我们进行指数、对数、平方根、三角函数等运算。
3.1. 冥和对数
我们在求某个数的平方根或者是平方和又或者是幂运算的时候,往往要借助math模块。
取对数运算:math.log(x[,底数]),这种方式会返回一个以基数为底的x的对数,如果省略底数就是以2为底。
例如:
1 2 3 4 5 |
|
输出结果为:
1 2 |
|
取平方根运算:math.sqrt(x),返回x的平方根。
例如:
1 2 3 4 5 |
|
输出结果为:
1 2 |
|
取幂运算:pow(x,y),返回的是x的y次幂。
例如:
1 2 3 4 5 |
|
输出结果为:
1 2 |
|
3.2. 三角函数
三角函数的使用和上面的用法类似。
三角正弦值:math.sin(x)
三角余弦值:math.cos(x)
三角正切值:math.tan(x)
弧度的反正弦:math.asin(x)
弧度的反余弦:math.acos(x)
弧度的反正切:math.atan(x)
如果是将弧度转换为角度或者将角度转换为弧度,采用下面的用法。
弧度转角度:math.degress(x)
角度转弧度:math.radinans(x)
看下面的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
输出结果为:
1 2 3 4 5 6 7 8 |
|
需要注意的是我们在Python里使用math.pi来表示‘π’。
3.3. 舍入函数
math模块中还提供了几个函数帮助我们进行舍入操作。
math.ceil(x):返回大于x或等于x的最小整数。
math.floor(x):返回小于x或等于x的最大整数。
同时在Python中有一个内置函数round(x)为我们提供四舍五入的操作。
代码如下:
1 2 3 4 5 6 7 8 9 |
|
输出结果为:
1 2 3 4 |
|
4.random模块
在前面我们曾多次提到过random模块,在这节将详细的介绍一下random模块的用法。random模块主要为我们提供一些生成随机数的功能,下面表格总结了random模块中几个常用函数。
函数名 | 功能 |
random.random() |
生成一个[0,1)的实数。 |
random.randint(a,b) |
生成一个[a,b]的数字,包含a和b。 |
random.randrange(a,b) |
生成一个[a,b)的数字,包含a,不包含b。 |
random.shuffle(x) |
把序列x打乱。 |
random.choice(x) |
从x中返回一个随机项,x需要是一个可变序列。 |
random.uniform(a,b) |
生成一个a,b之间的浮点数,区间可以是浮点数。 |
4.1. random.random()
生成一个0-1的随机浮点数,看下面的例子:
1 2 3 4 5 6 7 |
|
输出结果为:
1 2 3 |
|
我们可以看出返回的浮点数的值和位数都不一定相同。
4.2. random.randint(a,b)
我需要注意randint和randrange的区别,randint是包含a和b,后面会提到的randrange是不含a和b的。
我们可以通过测试来看一下是否包含上下限,代码如下:
1 2 3 4 5 6 7 |
|
输出结果为:
1 2 3 |
|
我们可以看出是包含a和b的值的。
4.3. random.randrange(a,b)
我们主要通过测试来看一下这种方法是否包含a和b的值,看下面代码:
1 2 3 4 5 6 7 8 9 |
|
输出结果为:
1 2 3 4 |
|
通过测试结果我们可以看出只有1和2,是不包含下界3的,大家也可以自己尝试一下运行一下。
4.4. random.shuffle(x)
random.shuffle(x)函数我们在第二节中使用过,它可以将一个序列进行重新排序,但是需要注意,它只针对于可改变的序列,因此它常被用于打乱列表中的元素。
1 2 3 4 5 |
|
输出结果为:
1 2 |
|
4.5. random.choice(x)
random.choice(x)可以返回一个序列中的一个随机元素,它的使用方式如下:
1 2 3 4 5 6 7 |
|
输出结果为:
1 2 3 |
|
4.6. random.uniform(a,b)
用于生成指定范围内的随机浮点数,代码如下:
1 2 3 4 5 6 7 |
|
输出结果为:
1 2 3 |
|
5.datetime模块
当我们在Python中需要使用到时间的时候,有两个关于时间的模块,分别是time和datetime。time模块偏底层,在部分函数运行的时候可能会出现不同的结果,而datetime模块提供了高级API,使用起来更为方便,我们通常在使用的时候会涉及到包含时间和日期的datetime、只包含日期的date以及只包含时间的time,本节我们就对这三种方法进行学习。
1. datetime
datetime的使用方法为:
1 |
|
其中year,month和day是不能缺少的,tzinfo为时区参数,可以为None或其他参数,其余参数的范围如下:
MINYEAR <= year <= MAXYEAR,
1 <= month <= 12,
1 <= day <= number of days in the given month and year,
0 <= hour < 24,
0 <= minute < 60,
0 <= second < 60,
0 <= microsecond < 1000000,
fold in [0, 1].
下面讲几种常用的方法:
1) datetime.datetime.now()
返回当前的日期和时间。
代码如下:
1 2 3 |
|
输出结果为:
1 |
|
2) date()
返回当前时间的日期。
代码如下:
1 2 3 |
|
输出结果:
1 |
|
3) time()
返回当前的时间对象。
代码如下:
1 2 3 |
|
输出结果为:
1 |
|
4) utctimetuple()
返回UTC时间元组。
代码如下:
1 2 3 |
|
输出结果为:
1 2 |
|
2. date
date对象是日期的专属对象,语法格式如下:
1 |
|
date类中的常用功能有2种:
1) datetime.date.today()
这种用法直接返回了当前的日期,代码如下:
1 2 3 |
|
输出结果为:
1 |
|
2) datetime.date.fromtimestamp()
这种方式返回与时间戳对应的日期,代码如下:
1 2 3 4 5 6 |
|
输出结果为:
1 2 |
|
在这个例题中我们先引入了time模块中的方法,time模块中的time.time()能返回当前时间戳,然后我们使用上面的方法可以返回与时间戳对应的日期。
3. time
time类中包含了一整天的信息,语法结构如下:
1 |
|
最后一个时区可以省略,看下面例子:
1 2 3 |
|
输出结果为:
1 |
|
4. 总结
由于datetime模块中封装了time模块,所以我们使用datetime模块可以保证数据更为精确,在使用过程中也可以穿插着time模块中的部分功能,例如暂停time.sleep()等方法。