「N体饭」Python零基础入门
作者:许立轩
简介:
这是一个Python计算机语言由浅入深的教程;
如果您是计算机“小白”, 您可以跟着教程一步一步地了解到Python是什么、能做什么;
如果您是久经沙场的极客,您也可以从中有所收获 :)
模块与包
大纲
视频地址:https://www.bilibili.com/video/BV11K4y1v7j6/
前言
这节课我们来聊一下模块与包,如果把我们的函数比作货物,那么模块就是一辆货车,包就是货车的停车场
比起函数,模块与包能更高程度地组织、复用我们的代码
它们之间的关系,大概可以长这样
python已经自带了很多"货车",它们叫做内置模块,我们可以直接使用它们
内置模块
我们可以戳官方文档查看所有python内置模块 https://docs.python.org/3/library/index.html
也可以通过以下命令查看python所有可用的模块(不单单是内置模块,可能还包括一些第三方模块)
pydoc3 modules # 或者 python -m pydoc modules
下面是一些常用的内置模块
| 模块名 | 作用 |
|---|---|
| asyncio | 异步协程 |
| base64 | base64编码解码 |
| collections | 一些额外的数据结构 |
| copy | 深复制相关 |
| datetime | 日期时间相关 |
| functools | 函数操作相关 |
| hashlib | 哈希加密相关 |
| io | 输入输出相关 |
| json | json序列化 |
| logging | 日志相关 |
| math | 一些数学函数 |
| multiprocessing | 多进程相关 |
| os | 文件操作相关 |
| pickle | python序列化 |
| random | 包含一些伪随机函数 |
| re | 正则操作 |
| sqlite3 | 操作sqlite数据库 |
| string | 字符串相关 |
| sys | 解释器相关 |
| threading | 多线程相关 |
| time | 时间相关 |
| urllib | http相关 |
| urllib2 | http相关 |
| urlparse | http相关 |
| Tkinter | python图形界面 |
| __builtins__ | 存放所有内置函数或变量 |
我们并不需要掌握所有的内置模块,只需要慢慢地掌握一些重要的内置模块即可
模块的导入
模块必须要导入后,才可以使用
我们可以通过两种方式导入模块
import语句
我们可以通过 import 模块名 来导入一个模块
比如我们导入random这个模块,它包含一些伪随机的函数,比如randint
randint的格式长这样randint(a, b),它用于返回[整数a, 整数b]之间随机一个整数(包括a与b)
# 导入random模块 import random # 然后我们可以通过 模块名.函数名 这样的格式来调用该模块下的函数 # random.randint(1, 5),表示返回值有可能是1~5 print(random.randint(1, 5)) print(random.randint(1, 5)) print(random.randint(1, 5))
一个模块只会被导入一次,不管你执行了多少次import
这样可以防止导入模块被一遍又一遍地执行
比如,还记得我们的__hello__模块吗,它的作用是打印helloworld
# 第一次import有输出 import __hello__ # 第二次import没有输出 import __hello__
我们可以通过importlib模块的reload函数,来重新导入模块
import importlib import __hello__ import __hello__ __hello__ = importlib.reload(__hello__)
from ... import语句
有些时候,我们只需要用到货车上的某一货物,我们不需要每次都上车用货,只需要把货卸下来用即可
我们通过 from 模块 import 内容1,内容2,内容3 这个语法,来只导入模块的某一部份
from random import randint print(randint(1, 5)) print(randint(1, 5)) print(randint(1, 5))
也可以通过from 模块名 import *,来把货车上的货全部卸下来
from random import * print(randint(1, 10))
查看模块内容
我们可以通过内置函数dir,来查看模块的内容
import random a = dir(random) print(a) # ['BPF', 'LOG4', 'NV_MAGICCONST', 'RECIP_BPF', 'Random', 'SG_MAGICCONST', 'SystemRandom', 'TWOPI', '_BuiltinMethodType', '_MethodType', '_Sequence', '_Set', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_acos', '_bisect', '_ceil', '_cos', '_e', '_exp', '_inst', '_itertools', '_log', '_os', '_pi', '_random', '_sha512', '_sin', '_sqrt', '_test', '_test_generator', '_urandom', '_warn', 'betavariate', 'choice', 'choices', 'expovariate', 'gammavariate', 'gauss', 'getrandbits', 'getstate', 'lognormvariate', 'normalvariate', 'paretovariate', 'randint', 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'triangular', 'uniform', 'vonmisesvariate', 'weibullvariate']
注意,与函数的文档类似,其中魔法属性__doc__为模块的文档; __name__指向模块的名字,__file__指向该模块的导入文件名
创建模块
在python中,一个py文件就是一个模块,比如我们有一个hello.py文件,如果要导入它的话,它的模块名就叫hello
模块也可以有文档,py文件开头的第一个字符串就被认为是其文档,比如
我们在桌面新建一个hello.py这个文件,并复制粘贴以下内容
"""
我是一个模块文档
now, you see me!
"""
print('如果你能看到我,就表示成功导入了我')
def hi():
print('哈哈,我是hi函数哦')
print('恭喜你创建了一个属于自己的模块')
然后我们在桌面进入交互模式,并导入我们的hello模块
import hello print(hello.__doc__) print(hello.__name__) print(hello.__file__) hello.hi()
包组织模块
我们可以通过包来组织模块,啥是包呢?
在python中,一个py文件就是一个模块,那么包含它的文件夹就是一个python包
如果文件夹下存在__init__.py文件,那么该文件夹就会被认为是python包
下面我们来创建一个包(文件夹),它的名字叫hello,它包含两个文件a.py、b.py,还有一个__init__.py以标识文件夹为一个python包
结构长这样
hello ├── a.py ├── b.py └── __init__.py
__init__.py的内容为空即可
a.py的内容
def hello_a():
print('hello,我是模块a内的hello_a函数')
b.py的内容
def hello_b():
print('hello,我是模块b内的hello_b函数')
在hello的同级目录处,我们可以通过以下代码使用hello_a与hello_b函数
from hello import a from hello import b a.hello_a() b.hello_b()
或者
from hello.a import hello_a from hello.b import hello_b hello_a() hello_b()
我们甚至可以包中有包(文件夹里还有个子文件夹)
比如我们再把目录结构改成下面这样
hello
├── a.py
├── b.py
├── __init__.py
└── test
├── c.py
└── __init__.py
c.py的内容
def hello_c():
print('hello,我是模块c内的hello_c函数')
然后我们可以这样使用hello_c函数
from hello.test import c c.hello_c()
或者
from hello.test.c import hello_c hello_c()
总结
在这节课中,我们掌握了模块的基础知识
我们学习了内置模块、如何创建自己的模块并且导入使用它,还有用包来组织我们的模块