Python语言中,模块分为三类。

第一类:内置模块,也叫做标准库。此类模块就是python解释器给你提供的,比如我们之前见过的 time模块,os模块。标准库的模块非常多(200多个,每个模块又有很多功能),我们这几天 就讲常用的十几种,后面课程中还会陆续的讲到。

第二类:第三方模块,第三方库。一些python大神写的非常好用的模块,必须通过pip install 指令安 装的模块,比如BeautfulSoup, Django,等等。大概有6000多个。

第三类:自定义模块。我们自己在项目中定义的一些模块。

一、自定义模块

  • 什么是模块?

    • 模块的本质就是.py文件,封装代码的最小单位
  • 什么是自定义模块?

    • 就是自己写的.py文件,可以定义函数,变量、循环等
  • 模块的运行方式:

    • 脚本方式:用解释器运行(cmd运行、pyc右键运行)
    • 模块的方式:import导入运行,为导入它的模块提供资源
  • python为我们内置了全局变量__name__

    • 当文件被当做脚本执行时:name 等于'main'
    • 当文件被当做模块导入时:__name__等于模块名
    • 这样设置的作用:用来控制.py文件在不同的应用场景下执行不同的逻辑(或者是在模块文件中测试代码)
  • print('from the tbjx.py')
    
    __all__ = ['name', 'read1',]
    
    name = '太白金星'
    
    def read1():
    
    def read2():
    print('tbjx模块')
    read1() def change(): global name
    name = 'barry' #添加了这个判断的的调用,说明是在测试阶段,那么调用本模块的时候,下面的read1()不会执行的
    if __name__ == '__main__':
    # 在模块文件中测试read1()函数
    # 此模块被导入时 __name__ == tbjx 所以不执行
    read1()

二、模块的搜索路径

  • Python中引用模块是按照一定的规则以及顺序去寻找的,这个查询顺序为

    • 内存中已经加载的模块->内置模块->sys.path路径中包含的模块
  • 模块的查找顺序
    1. 在第一次导入某个模块时(比如tbjx),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用(ps:python解释器在启动时会自动加载一些模块到内存中,可以使用sys.modules查看)
    2. 如果没有,解释器则会查找同名的内置模块
    3. 如果还没有找到就从sys.path给出的目录列表中依次寻找tbjx.py文件。
  • 需要特别注意的是:
    • 我们自定义的模块名不应该与系统内置模块重名!!!!
#在初始化后,python程序可以修改sys.path,路径放到前面的优先于标准库被加载。

import sys
sys.path.append('/a/b/c/d')
sys.path.insert(0,'/x/y/z') #排在前的目录,优先被搜索
注意:搜索时按照sys.path中从左到右的顺序查找,位于前的优先被查找,sys.path中还可能包含.zip归档文件和.egg文件,python会把.zip归档文件当成一个目录去处理, #首先制作归档文件:zip module.zip foo.py bar.py
import sys
sys.path.append('module.zip')
import foo,bar #也可以使用zip中目录结构的具体位置
sys.path.append('module.zip/lib/python') #windows下的路径不加r开头,会语法错误
sys.path.insert(0,r'C:\Users\Administrator\PycharmProjects\a') #至于.egg文件是由setuptools创建的包,这是按照第三方python库和扩展时使用的一种常见格式,.egg文件实际上只是添加了额外元数据(如版本号,依赖项等)的.zip文件。 #需要强调的一点是:只能从.zip文件中导入.py,.pyc等文件。使用C编写的共享库和扩展块无法直接从.zip文件中加载(此时setuptools等打包系统有时能提供一种规避方法),且从.zip中加载文件不会创建.pyc或者.pyo文件,因此一定要事先创建他们,来避免加载模块是性能下降。 接下来我们就开始讲解python常用的内置模块,由于Python常用的模块非常多,我们不可能将所有的模块都讲完, 所以只针对于工作中经常用到模块进行讲解。剩下的模块可以在课余时间自学。
import sys
#过去当前文件的绝对路径
print(__file__) #使用os模块获取当前文件的父路径
import os
print(os.path.dirname(__file__)+'/A') #使用os、sys模块获取当前文件夹的相对路径
import sys
import os
sys.path.append(os.path.dirname(__file__) + '/aa')

三、导入方式

3.1、直接导入

import 模块名

3.2、导入多个模块

import os,sys,json   # 这样写可以但是不推荐

#推荐写法  
#多行导入:易于阅读 易于编辑 易于搜索 易于维护。
import os
import sys
import json

3.3、from ... import ... 使用

  • from...import... 与import对比
    • 唯一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀:tbjx.
  • from...import...的方式有好处也有坏处
    • 好处:使用起来方便了
    • 坏处:容易与当前执行文件中的名字冲突、执行文件有与模块同名的变量或者函数名,会有覆盖效果。

一行导入一个:

from ... import ... 的使用示例。

from tbjx import name, read1
print(name)
read1() '''
执行结果:
from the tbjx.py
太白金星
tbjx模块: 太白金星 '''

一行导入多个:

from tbjx import read1,read2,name

3.4、 from ... import *

  • from spam import * 把tbjx中所有的不是以下划线(_)开头的名字都导入到当前位置

​ 大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。

可以使用all来控制*(用来发布新版本),在tbjx.py中新增一行

#这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字
__all__=['money','read1']

3.5、模块循环导入问题

​ 模块循环/嵌套导入抛出异常的根本原因是由于在python中模块被导入一次之后,就不会重新导入,只会在第一次导入时执行模块内代码

​ 在我们的项目中应该尽量避免出现循环/嵌套导入,如果出现多个模块都需要共享的数据,可以将共享的数据集中存放到某一个地方在程序出现了循环/嵌套导入后的异常分析、解决方法如下(了解,以后尽量避免

3.6、为模块起别名

  • 好处

    • 可以将很长的模块名改成很短,方便使用
    import tbjx as t
    t.read1()
    • 有利于代码的扩展和优化
    #mysql.py
    def sqlparse():
    print('from mysql sqlparse')
    #oracle.py
    def sqlparse():
    print('from oracle sqlparse') #test.py
    db_type=input('>>: ')
    if db_type == 'mysql':
    import mysql as db
    elif db_type == 'oracle':
    import oracle as db db.sqlparse()

初始python模块的更多相关文章

  1. python基础之初始python

    初始python之基础一 一.Python 介绍 1.python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发 ...

  2. python模块介绍- binascii 二进制和ASCII转换

    python模块介绍-binascii二进制和ASCII转换 目录 项目简介 简介: Uu编码 Binhex编码 Base64编码 QP码 CRC校验和 二进制转换 其他实例 项目简介 Python中 ...

  3. Python/模块与包之模块

    Python/模块与包之模块 1.什么是模块? 模块就是py文件 2.为什么要用模块? 如果在解释器上进行编码,把解释器关闭之前写的文件就不存在了,如果使用模块的话就能永久保存在磁盘中. 3.如何使用 ...

  4. 零基础学Python--------入门篇 第1章 初始Python

    入门篇 第1章  初始Python 1.1  Pyhton 概述 1.1.1 了解 Python Python,本义是指“蟒蛇”.1989年,荷兰人Guido van Rossum发明了一种面向对象的 ...

  5. python 模块和包

    一,模块 1,什么是模块? 常见的场景: 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py 的后缀. 但其实 import 加载的模块分为四个通用类别: 1,使用pyt ...

  6. 01_python_初始python

    一.初始python python是一门解释型语言,弱类型语言 / python解释器最为常用的是cpython(官方) 弱类型语言:   a = 1 a = 'alex'   #说明变量a既可以是整 ...

  7. python模块module package

    python模块module   package module package 常用模块 模块与包的区别 模块分为内置模块.第三方模块,自定义模块 程序会先从内置到第三方再到当前工作目录下去找你导入的 ...

  8. python 模块和包以及他们的导入关系

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  9. 22 Python 模块与包

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

随机推荐

  1. .net core中使用jwt进行认证

    JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息.由于此信息是经过数字签名的,因此可以被验证和信任 ...

  2. 简单的特征值梯度剪枝,CPU和ARM上带来4-5倍的训练加速 | ECCV 2020

    论文通过DBTD方法计算过滤阈值,再结合随机剪枝算法对特征值梯度进行裁剪,稀疏化特征值梯度,能够降低回传阶段的计算量,在CPU和ARM上的训练分别有3.99倍和5.92倍的加速效果   来源:晓飞的算 ...

  3. ElasticSearch7.6.1 安装及其head插件安装

    本来打算写一篇ES和Solr的差别的,后来想想算了简单说说吧, 如果是对已存在数据建立完成索引的情况下,Solr更快 一但进行索引的操作的时候,Solr的IO是阻塞的 对于大数据量的实时检索,还是El ...

  4. myeclipse前端界面乱码

    框起来的值默认的格式是ISO-8859-1,改为UTF-8

  5. 20190923-11Linux crond 系统定时任务 000 019

    crond 服务管理 1.重新启动crond服务 [root@hadoop101 ~]# service crond restart centOS7是 systemctl restart crond ...

  6. 转载:把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架构,微服务,以及相关的项目管理等等,这样你的核心竞争力才会越来越高

    https://developer.51cto.com/art/202001/608984.htm 把你的精力专注在java,jvm原理,spring原理,mysql锁,事务,多线程,大并发,分布式架 ...

  7. composer 三大组成部分

    composer 三大组成部分:1. 仓库 2. 命令行下载器 3. 自动加载. 1. 仓库 公有仓库 https://packagist.org 私有仓库 https://packagist.com ...

  8. 抽象工厂模式详解 —— head first 设计模式

    项目实例 假设你有一家 pizza 店,你有很多种 pizza,要在系统中显示你所有 pizza 种类.实现这个功能并不难,使用普通方式实现: public class PizzaStore { Pi ...

  9. RocketMQ的发送模式和消费模式

    前言 小伙伴们大家好啊,王子又来和大家一起闲谈MQ技术了. 通过之前文章的学习,我们已经对RocketMQ的基本架构有了初步的了解,那今天王子就和大家一起来点实际的,用代码和大家一起看看RocketM ...

  10. [LeetCode]347. 前 K 个高频元素(堆)

    题目 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1 ...