Python第十一章 模块、包

第十一章 模块、包

11.1 模块

11.1.1 模块概述

Python 模块(Module),是一个 Python 文件,以 .py 结尾. 模块能定义函数,类和变量,模块里也能包含可执行的代码.

模块的作用: python中有很多各种不同的模块, 每一个模块都可以帮助我们快速的实现一些功能, 比如实现和时间相关的功能就可以使用time模块,我们可以认为一个模块就是一个工具包, 每一个工具包中都有各种不同的工具供我们使用进而实现各种不同的功能.

11.1.2 导入模块

模块在使用前需要先导入 导入的语法如下:

[from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名]

常用的组合形式如:

  • import 模块名
  • from 模块名 import 类、变量、方法等
  • from 模块名 import *
  • import 模块名 as 别名
  • from 模块名 import 功能名 as 别名

【说明】

  1. from可以省略,直接import即可
  2. as别名可以省略
  3. 通过”.”来确定层级关系
  4. 模块的导入一般写在代码文件的开头位置

下面来一一演示


1、基本语法 import 模块名

import 模块名
import 模块名1, 模块名2

拿time模块来演示

import time
print("开始")
time.sleep(3)
print("结束")

我们可以Ctrl + 点击点击鼠标模块查看内容

image-20230927141623757

2、from 模块名 import 类、变量、方法等

from 模块名 import 功能名

功能名()

演示如下

from time import sleep

print("开始")
sleep(3)  # 不需要写模块名time.了
print("结束")

**3、from 模块名 import ***

import *表示导入模块中的所有内容

from time import *

print("开始")
sleep(3)  # 不需要写模块名time.了
print("结束")

4、import 模块名 as 别名

import time as t

print("开始")
t.sleep(3)  # 不需要写模块名time.了
print("结束")

【说明】import起了别名之后,后面必须使用别名

可以起多个别名

import time as t, random as r

print("开始")
t.sleep(3)  # 不需要写模块名time.了
print(r.randint(1, 3))
print("结束")

5、from 模块名 import 功能名 as 别名

from time import sleep as s
print("开始")
s(3)
print("结束")

可以定义多个功能的别名

from random import randint as rint, randrange as rrange
print(rint(1, 4))
print(rrange(1))

11.1.3 不同模块方法命名冲突

当导入多个模块的时候,且模块内有同名功能. 当调用这个同名功能的时候,调用到的是后面导入的模块的功能

# my_module1.py 模块
def test_func(a, b):
    print(f"{a} + {b} = {a + b}")
# my_module2.py 模块
def test_func(a, b):
    print(f"{a} - {b} = {a - b}")
from my_module1 import test_func
from my_module2 import test_func
test_func(1, 3) # 1 - 3 = -2  # 执行后面的代码

为了避免冲突,就把模块名一同引入

import my_module1
import my_module2

my_module2.test_func(1, 3)  # 1 - 3 = -2
my_module1.test_func(1, 3)  # 1 + 3 = 4

11.1.4 __all__

如果一个模块文件中有__all__变量,当使用from xxx import *导入时,只能导入这个列表中的元素

【注意】__all__ 声明仅仅对 from xxx import *有阻隔效果,对其他导入方式是无效的

# mymodule1.py
__all__ = ['func1', 'func2'] # 只能导入func1, func2

def func1():
    print("这是func1")

def func2():
    print("这是func2")

def func3():
    print("这是func3")
from my_module1 import *
func1()
func2()
func3() # 这里会报错,找不到方法

但是其他导入方法是有效的

import my_module1
my_module1.func3() # 可以使用
from my_module1 import func3
func3()  # 可以使用

11.1.5 自定义模块

Python中已经帮我们实现了很多的模块. 不过有时候我们需要一些个性化的模块, 这里就可以通过自定义模块实现, 也就是自己制作一个模块

其实只要自定义一个.py文件即可

案例:新建一个Python文件,命名为my_module.py,并定义test函数

# my_module.py
def test_func(a, b):
    print(f"{a} + {b} = {a + b}")

然后在另一个文件导入

import my_module
my_module.test_func(1, 3) # 1 + 3 = 4

【注意】每个Python文件都可以作为一个模块,模块的名字就是文件的名字. 也就是说自定义模块名必须要符合标识符命名规则

11.1.6 模块测试 & __main__

在实际开发中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,

这个开发人员会自行在py文件中添加一些测试信息,例如,在my_module.py文件中添加测试代码test(1,1)

def test_func(a, b):
    print(f"{a} + {b} = {a + b}")

# 测试
test_func(1, 3)

此时,无论是当前文件,还是其他已经导入了该模块的文件,在运行的时候都会自动执行test函数的调用

解决方案

def test_func(a, b):
    print(f"{a} + {b} = {a + b}")


# 测试
if __name__ == '__main__':
    test_func(1, 3)

原理:在每个Python程序中,都会有内置变量 __name__,当运行模块的时候,__name__会赋值为 __main__,从而允许,但是在from的时候,__name__就不是main,也就不会执行下面的代码了

测试一下

# my_module.py 运行模块
def test_func(a, b):
    print(f"{a} + {b} = {a + b}")


# 测试
if __name__ == '__main__':
    test_func(1, 3)
    print(__name__) # __main__  # 输出这个值

其他模块导入以后

import my_module
my_module.test_func(1, 3) # 1 + 3 = 4
print(my_module.__name__) # my_module,可以看到__name__命名为模块名了

11.2 包

11.2.1 包概述

什么是Python包?

  • 从物理上看,包就是一个文件夹,在该文件夹下包含了一个 _init_.py 文件,该文件夹可用于包含多个模块文件
  • 从逻辑上看,包的本质依然是模块

image-20230927150340975

可以理解为,含有_init_.py文件的文件夹就是包

包的作用: 当我们的模块文件越来越多时,包可以帮助我们管理这些模块, 包的作用就是包含多个模块,但包的本质依然是模块

11.2.2 创建并导入包

  1. 新建包my_package
  2. 新建包内模块:my_module1my_module2
  3. 模块内代码如下

image-20230927150506249

【注意】新建包后,包内部会自动创建__init__.py文件,这个文件控制着包的导入行为

但是在导入包的时候,注意,落点是模块而不是包

import my_package  # 这样是无法调用模块的

不同的导入方式有不同的调用语法

方式一:包名.模块名.目标

import my_package.my_module1
import my_package.my_module2

my_package.my_module1.info_print1()  # my_module1
my_package.my_module2.info_print2()  # my_module2

方式二:模块名.目标

from my_package import my_module1
from my_package import my_module2

my_module1.info_print1()  # my_module1
my_module2.info_print2()  # my_module2

方式三:目标

from my_package.my_module1 import info_print1
from my_package.my_module2 import info_print2

info_print1()  # my_module1
info_print2()  # my_module2

11.2.3 __init__.py限制模块

在包的 __init__.py文件中,可以用__all__来限制 from 包 import *的时候导入的模块

# __init__.py
__all__ = ["my_module2"]
from my_package import *
my_module2.info_print2()
my_module1.info_print1() # 报错,无法导入

【注意】同理,这个也只能限制 from 包 import *语法导入的模块

from my_package import my_module1
my_module1.info_print1() # 可以导入

11.2.4 第三方包

(1) 第三方包概述

我们知道,包可以包含一堆的Python模块,而每个模块又内含许多的功能。所以,我们可以认为:一个包,就是一堆同类型功能的集合体。

在Python程序的生态中,有许多非常多的第三方包(非Python官方),可以极大的帮助我们提高开发效率,如:

  • 科学计算中常用的:numpy包
  • 数据分析中常用的:pandas包
  • 大数据计算中常用的:pyspark、apache-flink包
  • 图形可视化常用的:matplotlib、pyecharts
  • 人工智能常用的:tensorflow等

这些第三方的包,极大的丰富了Python的生态,提高了开发效率。但是由于是第三方,所以Python没有内置,所以我们需要安装它们才可以导入使用

(2) 安装第三方包

有两种方式安装

  1. 命令行pip命令安装
  2. PyCharm安装

下面逐一演示


1、命令行pip命令安装

语法

pip install 包名称 # 即可通过网络快速安装第三方包

numpy包为例,并且使用清华的镜像

【技巧】由于pip是连接的国外的网站进行包的下载,所以有的时候会速度很慢。

我们可以通过如下命令,让其连接国内的网站进行包的安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名称

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy

image-20230927151851211

可以在命令行测试

image-20230927151935613

导入的时候发现成功,即可


2、PyCharm安装

右下角点击解释器的设置

image-20230927152051415

可以看到已经安装的第三方的包

image-20230927152128075

如果要添加包,可以点击+

image-20230927152200912

然后搜索、加入选项,install即可

image-20230927152315180

可以关闭,右下角会出现等待

image-20230927152408937

image-20230927152450649

然后可以看到成功了

image-20230927152515352

import pandas
posted @ 2023-10-07 11:39  Crispy·Candy  阅读(38)  评论(0编辑  收藏  举报