目录
目标
拧一颗螺丝,只会用到螺丝刀;但是修一台汽车,需要一整套汽修的工具。函数就像螺丝刀,可以帮助我们解决一类问题。那么当我们遇到很多问题时,难道要东拼西凑各种函数来解决吗?
其实,对于很多有关联的问题,Python已经提供了标准的解决方案。这些解决方案,都被封装在了一个叫做模块的东西里面。今天,我们先来了解模块的两种导入方式,并介绍一些常见模块的使用方法。
模块
简单来说,函数是对代码的封装;类是对属性和方法的封装。而模块,则可以看成是一堆函数、类和一些代码封装而成的。
定义 :模块是已经写好的Python文件,以.py
结尾。模块可以包含函数、类和一些代码,它们之间的功能是相互关联的。
隐喻:如果把模块比作工具箱,那么函数、类就是里面的螺丝刀、锤子等工具
Python中的模块,大致分为内置模块(安装Python时自带的模块)、第三方模块(有其他开发者所编写,提供给公众免费使用的模块)和自定义模块三种。而我们将主要学习前面两种模块。
今天,我们以内置模块为例,来讲解模块的基本知识。
无论是什么模块,都需要先导入再使用。模块有常用的两种导入方式:**import
**和
from...import
。下面,我们来学习这两种导入方式之间的差异。
import
前面,我们把模块比作了工具箱,里面有很多函数和类的工具。那么,使用关键词**import
**直接导入模块,就相当于我们导入了整个工具箱。
导入datetime模块,使用模块中的类datetime的now()方法,获取了当前的日期时间。
python
# 导入模块 datetime
import datetime
# 使用模块datetime中的类datetime的now方法获取当前日期时间,赋值给nowTime
nowTime = datetime.datetime.now()
print(nowTime)
import
关键字import,中文意思是"导入",表明我们要在这里导入模块。
模块名
一个名为**datetime
**的模块,用于处理日期和时间。
模块中的类
一个类,表明我们在调用datetime模块里的**datetime
类。datetime
**类是一个日期时间类,里面提供了一些获取日期时间的方法与属性。注意,很多模块内都有和模块同名的类,注意别混淆了。
datetime类中的方法
一个方法,表明我们要调用的now()
方法属于datetime类。该方法,用于获取当前的日期时间。
语法格式
导入"工具箱"的缺点,就是需要先从工具箱内拿出合适的工具。因为,类属于模块,方法属于类。所以,调用模块中类的方法时,需要从大到小层层调用。采用句点表示法的格式:模块名.类名.方法名()
。示例中,表示使用datetime模块中datetime类的now()
方法。
代码小结
导入模块后,使用模块中的类的方法时,就可以使用这样的格式
当然,我们获取了当前时间后,还能通过各种属性,来获取对应的年月日时分秒。依次使用对应的英文:year、month、day、hour、minute、second
。
示例中,使用**.year
** 属性获取了当前日期的年份;使用**.month
**属性获取了当前日期的月份。
题目
获取当前的年份
通过导入 datetime模块,使用 datetime类的now方法,获取当前日期。最后通过year属性,获取当前日期的年份,并格式化输出内容。格式化输出示例:现在是xxxx年。
参考代码
python
# 导入模块 datetime
import datetime
# 获取当前日期时间,赋值给nowTime
nowTime = datetime.datetime.now()
# 获取当前日期的年份,赋值给nowYear
nowYear = nowTime.year
# 格式化输出:现在是xxxx年
print(f"现在是{nowYear}年")
运行结果
from...import
其实,在很多时候,我们很难用完工具箱的全部工具。所以,我们在处理问题前,可以先找到合适的工具,再去处理它。也就是说,对于功能强大的模块,我们只需要导入我们要使用的函数或者类就行了。
此时,就需要用到**from...import
**语句。
从datetime模块中,导入了类datetime,并使用该类的now()方法,获取了当前的日期时间,并输出。
python
# 从模块datetime中,导入类datetime
from datetime import datetime
# 使用类datetime的now方法获取当前日期时间,赋值给nowTime
nowTime = datetime.now()
print(nowTime)
两个关键字
from...import,表示我们从模块中导入一个指定的函数或类。示例中,表示从datetime模块中,导入了datetime类。
模块名
关键字from后的datetime是模块,表示要从模块datetime中导入类或函数。
一个类
关键字import后的datetime是一个类,表示我们是从datetime模块里导入了datetime类。
语法格式
因为**from...import
,相当于从工具箱拿出了工具。所以,当调用模块中的类时,无需附加模块名作为前缀,直接使用类名作为前缀即可,即类名.方法名()
。示例中,表示使用了datetime类的now()
**方法。
也就是说,使用**import
导入模块,是导入整个模块,在调用时需要模块前缀。而使用from...import
**导入模块时,是导入模块的类或函数,在调用时可以直接使用函数或类的方法。以后,我们要使用模块时,可以根据自己的需要选择合适的导入方式。
随机模块
前面,我们以处理日期时间的datetime模块为例,讲解了模块的两种导入方式。下面,我们再介绍一个常用的内置模块 -- 随机模块。
导入random模块,使用模块中uniform函数,生成了一个0到1随机数并输出。
python
# 导入模块 random
import random
# 使用模块random中的uniform函数生成随机数,并赋值给randomNum
randomNum = random.uniform(0,1)
print(randomNum)
导入模块
使用import的方式,导入整个随机模块random。
使用模块中的函数
因为导入了整个模块,所以使用其中的函数时,需要模块名作为前缀,即**模块名.函数名()
的格式。示例中,uniform
函数用于产生指定范围随机浮点数。比如,random.uniform(0,1)
**表示生成0到1的随机浮点数。
代码小结
当我们要导入模块并使用模块的函数时,就可以使用这样的格式:
random模块内不仅有生成随机浮点数的函数,还有生成随机整数,实现随机抽取等一系列函数。图中展示了random模块中这几个常用的函数。
下面,我们再来简单介绍下**randint
和choice
**函数的用法。
randint函数
random模块的**randint
函数,可以产生指定范围的随机整数。整数的范围,由randint
函数中的参数决定。示例中,random.randint(1,7)
**表示生成1到7的随机整数,包括整数1和7。
骰子大战
通过关键字import导入random模块。
分两次使用该模块下的randint()
函数,生成1到6之间的随机整数。
第一次,将结果赋值给变量player,作为玩家的点数;
第二次,将结果赋值给变量computer,作为电脑的点数。
最后通过if-elif-else语句判断玩家和电脑的输赢:
如果,player大于computer,则输出"玩家胜利,电脑弱爆了"
如果,player等于computer,则输出"平局,再来一盘"
否则,输出"电脑胜利,决战到天亮!"
参考代码
python
# 导入模块 random
import random
# 生成1到6的随机整数,赋值给player
player = random.randint(1,6)
# 生成1到6的随机整数,赋值给computer
computer = random.randint(1,6)
print(f"玩家丢出{player}点")
print(f"电脑丢出{computer}点")
# 通过if-elif-else语句判断玩家和电脑的输赢
if player > computer:
print("玩家胜利,电脑弱爆了")
elif player == computer:
print("平局,再来一盘")
else:
print("电脑胜利,决战到天亮!")
运行结果1 (结果不止1种)
运行结果2 (结果不止1种)
choice函数
random模块的**choice
函数,可以从序列中随机选取一个元素。示例中,random.choice(option)
**表示从列表option中,随机选取一个元素。
其实,无论是内置模块,还是第三方模块,导入的方式都是一样的。今天,我们使用的内置模块,是Python自带的,具有较高的通用性。
下次,我们将进一步学习由个人组织开发,个性化较高的第三方模块。