Python基础语法—— 模块和包

Python 基础——模块和包


在python中,为了更好的对 python 代码进行组织化管理,python 中出现了模块和包的概念,类似于现实生活中衣柜和衣服,那么衣柜就是包,而衣柜中的某个区域是模块,而模块下的功能就是衣服。那么到底什么是模块和包呢?我们一起来看看吧!

模块

一、模块简介

1、什么是模块?

​ Python模块(Moduce),是一个Python文件,那么什么是python文件呢?以 .py 扩展名结尾的文件就是python文件,python文件中包含了python类、对象的定义以及python语句等……。

2、模块的来源

​ (1)内置的(python解释器自带)

# 例如:randam , functools , threading ……等模块

​ (2)第三方的(别人写的,需要下载安装)

# 例如:在学习协程时使用到的 gevent 模块就是第三方的
# 也就是说不安装这个,我们在pycharm中导入会报错,因为没有这个模块

​ (3)自定义的(自己写的)

# 例如:我想计算一些数字的和,那么我就可以自己创建一个模块,在使用的时候导入即可
3、模块的作用

​ (1)如果使用内置和第三方的模块,那么就是典形的拿来主义,这样我们在开发的时候就不会去自定义模块了,这样就极大的提高了我们的开发效率

​ (2)如果使用自定义模块,比如我们在项目开发的过程中,难免会遇到公共的方法或者类,啥意思呢?也就是说你要大量的多次的使用这个类或者方法,那么我们就可以自定义模块,在需要使用的时候直接导入就能使用,那么这就极大的提高了我们的开发效率

二、模块的导入方式

1、import 语句

​ **注意:**导入单个或多个模块

语法:

# 导入单个模块
import randaom
# 导入多个模块
import os,functools

示例:

import random,functools

a = random.randint(0,5)
mylist = [1,2,3,4,5]
result = functools.reduce(lambda a,b:a+b,mylist)
2、from ……import 语句

​ **(1)注意:**导模块下的单个或者多个功能

语法:

# 导入某个模块下的单个功能
from random import randint
# 导入某个模块下的多个功能
from os import mkdir,path

示例:

from os import mkdir,path

file = path.exists("./python.py")
mkdir("python文件夹")

​ **(2)注意:**导入该模块下的全部功能

语法:

from os import *

示例:

from os import *

file = path.exists("./python.py")
mkdir("python文件夹")
chdir("python文件")
3、给模块或公共起别名

​ **注意:**使用 as 关键字在模块或者功能后添加别名

语法:

# 给某个模块起别名
import random as ram
# 给模块下的某个功能起别名
from os import mkdir as doc

示例:

import random as ram
from os import mkdir as doc

a = ram.randint(1,9)
doc("python文件夹")

三、自定义模块

​ 在python中每个python文件都可以作为一个模块来使用,模块的名字就是python文件的名字,那么我们自定义模块的名称不能胡乱起吧?比如汉字、数字、特殊符号?这些都比可以。那么也就是说自定义模块的名称必须符合一定的标准。

1、模块的命名规则

​ (1)模块推荐使用小写字母命名。

​ 因为类就是首字母大写,如果模块也使用大写字母,那么如果你的类和模块的名称一致了,那么将很容易出错和混淆,所以为了避免这种情况,我们推荐模块使用小写

​ (2)尽量不要使用下划线,除非有很多字母

2、定义模块

​ 例如,我们定义一个模块,这个模块用于冒泡排序,那么这个模块的名称就为 bubble.py ,这里边有一个冒泡排序算法,我们就叫做sort

def sort(my_list,reverse=False):
    """
    该函数用于冒泡排序
    :param my_list: 一个列表
    :param reverse: 判断是升序还是降序,默认为False升序
    :return: 
    """
    for i in range(0,len(my_list)-1):
        for j in range(0,len(my_list)-1-i):
            if not reverse:
                if my_list[j] <my_list[j+1]:
                    my_list[j],my_list[j+1] = my_list[j+1],my_list[j]
            else:
                if my_list[j] > my_list[j+1]:
                    my_list[j],my_list[j+1] = my_list[j+1],my_list[j]
3、模块的测试
1、为什么要进行测试?

​ 在实际开发中,当一个开发人员写完一个模块后,为了让该模块能够在项目中达到期望的效果,这个开发人员必须在创建这个模块的功能时,需要对该模块的每个功能进行测试。

2、测试的方案

​ (1)重新创建一个python文件用于导入测试模块,这种测试方式效率低且麻烦

​ (2)在模块文件中进行直接调用测试,这种方案有一个致命的缺陷,如果稍不留意会导致测试的代码在应用场景中被执行,这肯定不是大家所期望的

​ (3)直接在该模块中测试,但是这种测试方法和第二种不一样,并且还会解决这种问题,也就是说在当前模块中测试,并且不会在应用场景中被执行

格式:

if __nam__ == "__main__":
    # 要测试的代码

说明:

_name_ :查看当前运行的函数名称

_main_ :指的是该文件中主函数的名称

示例:

if __name__ == "__main__":
    my_list = [23,55,6,32,99,9,4,2]
    sort(my_list,reverse=True)
    print(my_list)

四、模块的定位顺序

​ 当你导入一个模块,python解释器对模块位置的搜索顺序为:

  • 当前目录

  • 如果不在当前目录,python则搜索在 shell 变量 pythonpath 下的每个目录

  • 如果都找不到,python会查看默认路径。UNIX 下,默认路径一般为 /user/local/lib/python;Windows下,默认路径一般为 当前python.exe下的lib目录中

    **注意:**模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,pythonpath 和 由安装过程决定的默认目录。

五、模块的注意事项

​ (1)自定义的模块名不要和已有模块名重复,否则会导致当前模块功能无法使用

​ (2)使用 from……import 时,如果功能名字重复,调用到的是最后定义的或导入的功能

​ (3)导入了模块之后的程序代码中的变量一般不能和模块的名称一致,否在在调用模块的时候,这个名字已经是变量了,不再是模块,因为python中的变量是引用类型

六、__all__变量

​ 如果一个模块文件中,有__all__变量,当使用 form……import *导入时,只能导入这个列表中的元素,或者说模块。那么这个行为或者说过程指的的是:将通配符(*)进行添加筛选。

示例:

1、bubble.py模块

# all变量,对 通配符* 进行筛选 
__all__ = ["sort"]


def sort(my_list, reverse=False):
    """
    该函数用于冒泡排序
    :param my_list: 一个列表
    :param reverse: 判断是升序还是降序,默认为False升序
    :return:
    """
    for i in range(0, len(my_list) - 1):
        for j in range(0, len(my_list) - 1 - i):
            if not reverse:
                if my_list[j] < my_list[j + 1]:
                    my_list[j], my_list[j + 1] = my_list[j + 1], my_list[j]
            else:
                if my_list[j] > my_list[j + 1]:
                    my_list[j], my_list[j + 1] = my_list[j + 1], my_list[j]


def sum2(list):
    """
    该函数用于对列表中的元素进行求和
    :param list: 列表
    :return: 返回一个和值
    """
    if list == []:
        return 0
    else:
        return list[0] + sum2(list[1:])


if __name__ == "__main__":
    my_list = [23, 55, 6, 32, 99, 9, 4, 2]
    sort(my_list, reverse=True)
    print(my_list)
    result = sum2(my_list)
    print(result)

2、外部导入测试

from builtins import *

list = [12, 342, 12, 657, 32]
sorted(list)
print(list)
# 报错,无法使用sum2功能,因为已被all变量删选
sum = sum2(list)
print(sum)

一、什么是包?

​ python包(Package)是一个分层次的文件目录结构,我们将一些有联系的模块组织起来,放到这个包中,可以说这个包就是来管理模块的,更简单来说包就是文件夹。但是该文件夹下必须存在一个 _init_ .py 文件,该文件的内容可以为空,_init_.py 文件用来标识该文件夹是一个包(Package)

二、如何创建一个包

​ (1)当前python项目 ==> 右击 ==> New
在这里插入图片描述

​ (2)New ==> Python Package
在这里插入图片描述

​ (3)Python Package ==> 包名称 ==> ok
在这里插入图片描述

**注意:**包是否创建成功,检查在包创建好之后是否自动生成 _init_ .py 文件,该文件控制着包的导入行为

三、包的导入方式

1、import
# 导入单个包中的某个模块
import 包名称.模块名称
# 导入多个包中的某个模块
import 包名称.模块名称, 包名称.模块名称
2、from……import
# 导入单个个包下的单个模块
from 包名称 import 模块名称
# 导入单个包下的多个模块
from 包名称 import 模块名称, 模块名称
# 导入单个包下的所有模块
from 包名称 import *
3、as
# 给某个包下的某个模块起一个别名
import 包名称.模块名称 as 别名
# 给某个包起一个别名
import 包名称 as 别名
# 给某个包下的某个模块起一个别名
from 包名称 import 模块名称 as 别名
4、包 (Package) 和 目录 (Directory)的区别

​ 从测试角度而言,如果对于包中的模块要求并不是很高,或者说是这个包中的模块都可以被使用,那么不管创建一个目录(Directory)还是一个包(Package)基本上没有什么区别,唯一最大的区别就是包(Package)里面会自动创建一个_init_ .py文件,那么这个 _init_ .py文件到到底有什么作用呢?

5、_init_ .py 的作用

​ _init_ .py 的作用类似于模块中的 __all__变量的作用,在 init.py文件中同样添加一行 all对应的列表,可以在 from……import * 导入包的方式中删选模块,被写入all变量列表的模块将可以使用,没有被写入的模块不同通过通配符(*)的形式导入和使用。


以上均为自己所了解到的关于包和模块的知识,如果大家有某种见解,还请给位能够指点,希望大家的共同进步,以及csdn大家庭的壮大,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御弟謌謌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值