1. 模块

1) 什么是模块

为了使代码方便维护,可以将代码进行分类放到不同的文件里。所有的代码按照一定的规则分布在各个 .py文件里,需要使用时只要导入相应的文件即可。在Python中,这样的文件称为模块。

模块的作用:

  • 更好地组织代码结构;
  • 提高代码复用率。

2) 导入模块

当需要使用模块的时候,用import语句导入对应的模块即可。如:在main.py中使用other.py模块,用“import 模块名”导入模块,相当于在main.py里借用并运行了other.py文件里的代码。一般模块中的代码大多是定义好的变量和函数等。



# other.py
pi = 3.14159265359
def half(x):
  return x/2
 
# main.py
import other    # 导入other模块
print(other.pi)
# 输出:3.14159265359
print(other.half(4))
# 输出:2.0



导入模块后,要使用模块中的变量、函数,需要通过“模块名.变量名”和“模块名.函数名()”的方式。

此外,import语句还有一种用法是import...as...,如import other as o,之后就可以使用o来代替other,如print(o.pi)。数据分析常用的pandas和numpy常被简写为pd和np。

若同时导入多个模块,可以用逗号隔开,如import a, b, c 可以同时导入 a.py、b.py、c.py 三个文件。

3) 导入部分模块

可以使用from...import...语句只导入需要的变量、函数等。

格式:from 模块名 import 变量名/函数名

导入后的变量/函数可以直接使用,无需再加上“模块名.”前缀,若仍以加前缀的方式访问,代码将会报错NameError: name 'xxx' is not defined on line x.



# other.py
pi = 3.14159265359
def half(x):
  return x/2
 
# main.py
from other import pi, half   # 从other模块导入pi和half
print(pi)
# 输出:3.14159265359
print(half(4))
# 输出:2.0



4) 程序入口

当做复杂项目时,会将代码拆分到各个模块中,因此,需要一个程序入口将整个项目的代码串联运行起来。为了指明某个文件是程序入口,可以在代码中这样写:



# xxx.py
代码块A
if __name__ == '__main__':
  代码块B



__name__是Python中一个特殊的内置变量,它的值默认是模块名,当文件被直接运行时,即通过命令行执行python xxx.py运行代码时,__name__的值会被改为__main__。因此,可以根据__name__这个特性来判断模块是以导入的方式使用,还是作为程序入口文件直接运行,从而执行相应的操作。



def bootstrap():
  print('项目启动')
if __name__ == '__main__':
  bootstrap()



上面代码只有在作为程序入口直接运行时才会自动执行bootstrap()启动项目,同时也提供了bootstrap()函数给其他模块使用:



# main.py
def bootstrap():
  print('项目启动')
if __name__ == '__main__':
  bootstrap()
 
# other.py
import main
main.bootstrap()



Exercise:



# other.py
print('我是other模块')
if __name__ == '__main__':
  print('我被直接运行了(other)')
 
# main.py
import other
print('我是main模块')
if __name__ == '__main__':
  print('我被直接运行了(main)')

# 输出:
# 我是other模块
# 我是main模块
# 我被直接运行了(main)



2. 内置模块

1) 内置模块——时间

①time模块



import time
# 暂停程序的执行,参数为秒
time.sleep(3)      # 暂停3秒再执行后续代码
# 获取当前时间的Unix时间戳
print(time.time())
# 输出:1586502040.88338
# 获取当前时间
print(time.ctime())
# 输出:Fri Apr 10 15:03:30 2020



②datetime模块

datetime模块包括很多函数和类,用于日期和时间的解析、格式化和计算。



# 导入datetime模块中的datetime对象
from datetime import datetime
# 获取当前时间
print(datetime.now())
# 输出:2020-04-10 15:09:07.993780
# 将Unix时间戳转换成时间
print(datetime.fromtimestamp(1586502547.993780))
# 输出:2020-04-10 15:09:07.993780



此外,利用timedelta()可以实现日期和时间的计算。



from datetime import datetime, timedelta
print(datetime.now() – timedelta(days = 5))
# 输出:2020-04-05 15:15:24.568680



调用timedelta()时传入的是关键字参数,除了days之外,timedelta()还支持传入weeks, hours, minutes, seconds, milliseconds, microseconds。

timedelta()也支持同时传入多个参数,比如计算两个半小时后的时间:



from datetime import datetime, timedelta
print(datetime.now() + timedelta(hours = 2, minutes = 30))
# 输出:2020-04-10 17:51:55.606280



2) 内置模块——数字

①random模块



# 导入random模块
import random
# 随机生成0-1之间的浮点数,包括0,不包括1
print(random.random())
# 输出:0.878022926133
# 随机生成0-5之间的整数,包括0和5
print(random.randint(0, 5))
# 输出:3
# 随机生成0-5之间的浮点数,包括0和5
print(random.uniform(0, 5))
# 输出:4.86369987147
# 从非空序列中随即返回一个元素
print(random.choice([1, 2, 3]))
# 输出:2



②math模块



# 导入math模块
import math
# 向上取整
print(math.ceil(2.3))
# 输出:3
# 向下取整
print(math.floor(2.9))
# 输出:2
# 取平方根
print(math.sqrt(4))
# 输出:2.0
# 数学常数Π
print(math.pi)
# 输出:3.14159265359
# 数学常数e
print(math.e)
# 输出:2.71828182846