「N体饭」Python零基础入门

作者:许立轩

简介:

这是一个Python计算机语言由浅入深的教程;
如果您是计算机“小白”, 您可以跟着教程一步一步地了解到Python是什么、能做什么;
如果您是久经沙场的极客,您也可以从中有所收获 :)

模块与包

大纲

视频地址https://www.bilibili.com/video/BV11K4y1v7j6/

前言

这节课我们来聊一下模块与包,如果把我们的函数比作货物,那么模块就是一辆货车,包就是货车的停车场

比起函数,模块与包能更高程度地组织、复用我们的代码

它们之间的关系,大概可以长这样

「N体饭」python零基础入门系列 11.模块与包

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_ahello_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()

总结

在这节课中,我们掌握了模块的基础知识

我们学习了内置模块、如何创建自己的模块并且导入使用它,还有用包来组织我们的模块

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-01-29
  • 2022-12-23
  • 2022-01-12
  • 2021-10-17
  • 2022-12-23
  • 2021-10-12
猜你喜欢
  • 2021-05-09
  • 2021-11-12
  • 2021-12-12
  • 2021-12-30
  • 2021-07-11
  • 2021-08-31
相关资源
相似解决方案