【20天搞定python基础】第十七天:Python模块实战
千锋python
2021年05月31日 18:50
收录于文集
共23篇

【千锋教育干货暴击】

如果你想更好的学习Python乃至转行,弯道超车,快人一步!本课程零基础即可加入学习,抓住大数据、机器学习、人工智能时代的红利,开启你的第一行代码吧!

   ↓    ↓    ↓

千锋教育Python教程_700集零基础Python入门到精通教程(保姆级新手教程)​

千锋教育Python教程全套_python零基础入门到精通(学完可达到Python工程师水平)​


哈利波特用他的魔法打败了伏地魔!用的法器就是魔法棒(魔杖),既然魔杖可以配合咒语施展魔法,让巫师体内的魔力集中的释放出来,那么我们 Python 有没有这么神奇的知识?

这就是模块,使用模块可以召唤更多的函数,类,变量等,让我们写起程序来更加的方便,得心应手。

模块内容主要包含:

  1. 模块简介

  2. 模块导入

  3. 包的导入

  4. name

  5. 常见系统模块介绍

什么是模块呢?

在python中一个脚本(.py)文件就是一个模块,创建模块实际上就是创建一个.py文件,可以被其他模块导入并使用。(提示定义的注意事项)

之前学习过函数,知道它是组织好的,可以重复使用的,用来实现某个单一功能的代码。

学习了类,发现类比函数更强大,它封装了属性与方法,可以实现更多的功能。

模块就更加强大了,里面可以包含更多的变量、函数、类等。说明模块中包含的内容更丰富,使用更加方便。

所以我们使用模块的好处就更加显而易见了。

  1. 模块内可以有函数、类、变量,利用这些可以更简单的完成许多工作

  2. 模块可以在文件中永久保存代码

  3. 模块间可以相互调用(通过import或者 from...import)

定义模块

我们定义一个模块:harry.py,同时复习一下前面的内容。

代码块
JavaScript
自动换行
复制代码
# 变量
name = 'Harry Potter'
age = 10

# 函数
def fight(tool=None):
 if tool:
   print('在魔法学校驾驶'+tool+'练习飞行课!')
 else:
   print('走到魔法学校,就会练习飞行课!')
      
# 类: 课程类
class Course:
 def __init__(self,name,c_list):
   self.name = name  # 学员名
   self.c_list = []  # 课程列表
  
  # 选修课  c_name 表示课程名
 def add_course(self,c_name):
   if c_name:
    self.c_list.append(c_name)
   else:
    print('选修课程不能为空哦!')
 
 # 取消选修课   
 def remove_course(self,c_name):
   if c_name:
    self.c_list.remove(c_name)
   else:
    print('选修课程不能为空哦!')   
 
复制成功

为了更好的表示模块间可以相互导入使用,我们再定义一个模块:magic.py (只有一个函数)

代码块
JavaScript
自动换行
复制代码
def use_magic():
  print('我会施展厉害的魔法!')
复制成功

模块导入

模块导入是指在一个模块中想使用其他模块的变量、函数或者类,要通过导入的方式实现。 导入的模块分为:

无论是导入自己的还是第三方的模块都可以使用下列的方式。

模块的导入方式有:两种

  1. import 导入

所谓import顾名思义,通过英文单词就是:引入、导入的

注意:一般导入语句都是放在模块的开头。

此时演示: harry.py 在 magic.py 中的导入

导入的目的主要是可以使用模块中的变量、函数与类。但是导入之后我们再怎么使用呢?

代码块
JavaScript
自动换行
复制代码
import harry

.....

# 使用变量 name
print(harry.name)

# 调用函数
harry.fight()

# 类对象的创建
c = harry.Course('哈利')
c.add_course('黑魔法防御术')
print(c.name)
复制成功

import还有另外一种用法,就是import…as… ,使用as的目的就是重新命名。如果日后在使用的时候发现模块名太长了,在使用的时候每次也要写这么长,太不方便了。比如后面数据分析用到的matplotlib名字长,那就可以起个别名。

其实这个别名就类似你的小名或者外号一样的。

代码块
JavaScript
自动换行
复制代码
import  harry  as  hy

#使用的时候就变成了

print(hy.name)
print(hy.age)

# 调用函数
hy.fight()

# 类对象的创建
c = hy.Course('哈利')
c.add_course('黑魔法防御术')
print(c.name)

复制成功
  1. from...import 导入

为什么还有 from...import 的导入方式?

因为上面的导入虽然可以使用别名,但是调用函数或者使用类创建对象的的时候,每次前面必须要带着模块名,比较麻烦。

如果直接对函数进行调用或者类创建对象,岂不更香?from...import 来啦

语法:

语法如下:

代码块
JavaScript
自动换行
复制代码
from harry import name,age,fight,Course

#使用的时候就变成了

print(name)
print(age)

# 调用函数
fight()

# 类对象的创建
c = Course('哈利')
c.add_course('黑魔法防御术')
print(c.name)
复制成功

继续举例,在 magic.py 中定义一个函数,在函数中使用fight()函数

代码块
JavaScript
自动换行
复制代码
from harry import Course
.....
中间省略
.....
# 操作课程
def go_home(name,tool):
  # 调用 fight 方法
  fight(tool)
  print(name+'学会了直接回家吧!')

# 调用 go_home
go_home('罗恩','汽车')
复制成功

当然如果导入的内容比较多,可以使用 from 模块 import * 导入该模块下所有的内容

导入为什么这么好用呢?

导入模块其实就是在执行py文件;开辟一块新内存,将内容加载到内存中;每次使用直接从内存中获取

包介绍和包的导入

为了更好的组织模块,会将多个模块存到包。Python 处理包也是相当方便的。简单来说,包就是文件夹,但该文件夹下必须存在 _init_.py 文件 通常**_init_.py** 文件为空,但是我们还可以为它增加其他的功能。

  1. 我们在导入一个包时,实际上是执行 _init_.py 里面的代码

  2. _init_.py主要控制包的导入行为,通过 all但是不展开说

常见的包结构如下(可以简单的画图):

新建一个 package 包名字:potter,将 harry.py放到包中,此时观察 magic.py 文件的内容出现报错了。

为什么呢?

包的导入仍使用 import 、 from ... import 语句,可以使用

使用的时候就比较麻烦,就是: 包名.模块名.变量

magic.py

代码块
JavaScript
自动换行
复制代码
import potter.harry

.....

# 使用变量 name
print(potter.harry.name)

# 调用函数
potter.harry.fight()

# 类对象的创建
c = potter.harry.Course('哈利')
c.add_course('黑魔法防御术')
print(c.name)
print(c.c_list)
复制成功

代码块
JavaScript
自动换行
复制代码
from potter.harry import name,age,fight,Course

#使用的时候就变成了

print(name)
print(age)

# 调用函数
fight()

# 类对象的创建
c = Course('哈利')
c.add_course('黑魔法防御术')
print(c.name)
print(c.c_list)
复制成功

如果里面出现与导入包相同的变量名\函数名\类,使用的顺序是什么样子的?

模块和包的搜索路径

当Python执行import语句时,它会在一些路径中搜索Python模块和扩展模块。可以通过sys.path查看这些路径,比如:

代码块
JavaScript
自动换行
复制代码
# 可以在终端演示
import sys
print(sys.path)

# 注意打印结果中的""表示当前目录,如果有的话
复制成功

所以当import某个模块时,解释器首先搜索具有该名称的内置模块,如果没有找到,将在变量 sys.path 给出的目录列表中搜索名为 模块名.py 的文件。sys.path 包含了一下几个目录:

  1. 脚本的当前目录;

  2. PYTHONPATH环境变量;就是当初安装的时候在环境变量中设置的内容

  3. python安装时的系统目录;

此时在 magic.py 中声明一个name 变量,赋值为:罗恩

代码块
JavaScript
自动换行
复制代码
from potter.harry import *    
# 注意此时导入的 harry 中也有name 变量
name = '罗恩'
print(name)
# 此时打印结果是罗恩
复制成功

案例

在 potter 包中,新建一个模块 test.py和 magic1.py

代码块
JavaScript
自动换行
复制代码
def use_magic():
  print('我会施展厉害的魔法!')

print('我是一个新的 magic 模块')
复制成功

在此模块中分别导入 harry.py 中的变量,函数,类 (可以使用 from potter.harry import *)和 magic1.py(from magic1 import use_magic) 中定

此时运行 test.py (注意:test 中只有导入语句没有其他的内容) 观察是否有打印内容.

这是为什么会有打印出来? 引出__name__的使用

在 magic1.py 中打印一下_name_, 直接运行 

magic1.py 文件观察打印的内容

然后再次运行一下 test.py 文件,观察结果.

_name__就表示当前模块的名称,自身运行打印结果是:_main,但是如果其他模块导入则打印的就是包名.模块名了

所以可以通过判断_name__是否等于_main__来来阻止导入模块中的一些打印内容不执行

修改 magic1.py

代码块
JavaScript
自动换行
复制代码
def use_magic():
  print('我会施展厉害的魔法!')
if __name__ == '__main__':
  print('我是一个新的 magic 模块')
复制成功

系统的其他模块

上面我们介绍的都是自定义模块,我们也可以使用系统的模块

  1. time &datetime模块

  2. random

  3. os

time &datetime模块time模块中可以获取时间戳和休眠等a、timestamp时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量

代码块
JavaScript
自动换行
复制代码
import time
t1 = time.time()
print(t1)
print(time.ctime(t1))
复制成功

b、sleep()

代码块
JavaScript
自动换行
复制代码
import time
for i in range(5):
  print(i)
  time.sleep()
复制成功

datatime模块重新封装了time模块,提供更多接口,提供的类有:date,time,datetime,timedelta,tzinfo。

比如 datetime 类下的 now()

代码块
JavaScript
自动换行
复制代码
from datetime import datetime

print(datetime.now())  # 获取格式好的时间和日期
复制成功

timedelta类进行时间加减使用timedelta可以很方便的在日期上做天days,小时hour,分钟,秒,毫秒,微妙的时间计算。

代码块
JavaScript
自动换行
复制代码
from  datetime import *

dt = datetime.now()
#日期减一天
dt1 = dt + timedelta(days=-1)#昨天
dt2 = dt - timedelta(days=1)#昨天
dt3 = dt + timedelta(days=1)#明天

print(dt1)
复制成功

random 模块

主要是跟随机数有关的操作,都在此模块中

代码块
JavaScript
自动换行
复制代码
vimport random

print(random.random())   # 0到1的随机小数,是一个float浮点数
print(random.randint(1,10))  # 1到10之间的随机整数
print(random.randrange(1,10)) # 1到10之间的随机数(记得range只有头没有尾巴)
names = ['赵丽颖','杨幂','迪丽热巴','高圆圆','刘诗诗']
# 随机选出一位美女
print(random.choice(names))
复制成功

os 模块

os模块: 对操作系统进行一系列操作模块。

代码块
JavaScript
自动换行
复制代码
import os
#getcwd() 获取当前工作目录(当前工作目录默认都是当前文件所在的文件夹)
result = os.getcwd()
print(result)

# mkdir()  创建文件夹
os.mkdir('images')

#listdir() 获取指定文件夹中所有内容的名称列表
result = os.listdir('./potter')
print(result)

# 删除一个文件
os.remove('文件名')  删除一个文件

print(os.environ)  # 获取系统环境变量

#当然也可以使用 os.path 下面的各种操作,os.path 是 os 模块的子模块

# abspath()  将相对路径转化为绝对路径
path = './potter'#相对
result = os.path.abspath(path)
print(result)

# getsize()  获取文件的大小
path = './potter/harry.py'
result = os.path.getsize(path)
print(result)

#isfile() 检测是否是文件
path = './potter/harry.py'
result = os.path.isfile(path)
print(result)

#isdir()  检测是否是文件夹
result = os.path.isdir(path)
print(result)
复制成功

当然还会有很多的模块内容,后面有机会我们会继续给大家分享。


需要资料也可以关注微信公众号:Python专栏,事不宜迟,一起进步吧!