模块

什么是模块

函数是某一功能的集合体,而模块是一系列功能的集合体,因此模块可以看成是一堆函数的集合体。一个py文件内部就可以放一堆函数,因此一个py文件就可以看成是一个模块,如果文件名为module.py,则模块名为module。模块分为以下几类:

  • 自定义模块:即使用python编写的.py文件
  • 第三方模块:已被编译为共享库或DLL的C或C++扩展,需要自己下载,如requests
  • 内置模块:使用C编写并链接到python解释器的内置模块,直接用就行了,如time
  • 包:把一系列模块组织到一起的文件夹,并有一个_init_.py文件

使用模块

我们一般使用import和from...import导入模块。导入模块时将文件执行一遍

import

在用import模块导入时发生了以下几件事(如import time):

  1. 打开time文件
  2. 把time文件内的内容读入python解释器的内存,然后把文件内的名字放入特定的模块time的名称空间
  3. 在使用time.sleep(1)这个方法的时候,回去time模块的名称空间内部寻找time的方法
  4. 然后直接使用time.sleep(1)就行了

想比用from...import...而言

  • 优点:模块里的方法和变量都能拿到使用
  • 缺点:占用内存比较大,在使用时必须得通过模块名.方法()使用

from ... import ...

在用from...import模块导入时发生了以下几件事(如from time import sleep):

  1. 打开time文件
  2. 把time文件内的内容读入到python解释器的内存,然后把文件内的名字放入到特定的模块time的名称空间内
  3. 把sleep单独拿出来放入import与from....import.py的名称空间中去
  4. 然后直接使用sleep(1)就可以了

相比较import而言

  • 优点:直接使用方法()就行了
  • 缺点:只能拿到单独的某个方法,并且若文件中定义了sleep参数,在使用时会冲突
import time    # 导入time模块
time.sleep(3) from time import sleep # 导入time模块中的某个方法
from time import sleep,time # 导入模块中的sleep和time方法
from time import * # 导入模块time
sleep(3) import time as t # 相当于给time模块取别名
t.sleep(3) # 正确
time.sleep(3) # 错误

循环导入问题

有m1和m2两个文件,然后m1需要找到m2的y,m2需要找到m1的x。但是由于代码自上而下运行,m1中的x还没有生成,m2中的y也没有生成,所以m1找不到m2的y;m2找不到m1的x,就造成了一个死循环

# m1.py
from m2 import y
x = 10 # m2.py
from m1 import x
y = 20

解决方案一

在导入之前让变量提前生成

# m1.py
x = 10
from m2 import y
print(y) # m2.py
y = 20
from m1 import x
print(x)

在运行m1.py文件时,会执行两次打印。将m2中的print(x)打印出来,结果并不是我们想要的;其次若变量多个时,不方便使用

解决方案二

把需要导入的名字封装到函数体内部。由于名字的执行顺序是:内置—>全局—>局部。在调用函数之前,全局变量已经生成了,m2能找到x,y就能够生成,问题就解决了

# m1.py
def func1():
x = 10
from m2 import y
print(y) # m2.py
def func2():
y = 20
from m1 import x
print(x) func1()

模块的搜索路径

  • 先搜索内存中有的:运行过的模块
  • 再搜索内置模块中的模块
  • 最后搜索环境变量中的模块

Python文件的两种用途

模块文件:当做模块导入

运行文件:当做文件运行

包是自带_init_.py文件的文件,包也是模块。包在被导入的时候发生三件事(如导入包test):

  1. 创建一个包的名称空间,打开test里的_init_.py文件
  2. Python解释器运行解释__init__.py文件,把__init__.py里的名字丢入到包的名称空间内
  3. 导入包其实就是导入包下的__init__.py。并且可以通过import... 和from...import...就行导入

导入包内包

aaa.bbb指向aaa内部的文件夹bbb包,如果我们需要导入bbb这个包

# aaa/__init__.py
from aaa import bbb # run.py
import aaa
print(aaa.bbb)

导入包内包的模块

如果bbb包内有m1.py文件,我们需要在run.py内导入m3模块

# aaa/__init__.py
from aaa.bbb import m3 # run.py
import aaa
aaa.bbb.m3

绝对导入与相对导入

绝对导入

# aaa/__init__.py
from aaa.m1 import func1
from aaa.m2 import func2

相对导入

from .m1 import func1
  • . 代表当前被导入文件所在的文件夹
  • .. 代表当前被导入文件所在文件夹的上一级
  • ... 代表当前被导入文件所在的文件夹的上一级的上一级

注意事项:. 号前面必须得是一个包,不能是一个模块;当文件是执行文件时,不能用相对导入;包内所有的文件都是被导入使用的,而不是被直接运行的

day15-模块的基础及导入的更多相关文章

  1. Day15模块(导入,使用)

    Day15模块 什么是模块: 一系列功能的集合体 一个py文件就是一个模块 aaa.py就是aaa模块 模块四种形式: 内置的模块 py文件 第三方的 包 模块三种来源:内置的,第三方,自定义 为什么 ...

  2. es 模块的基础知识,深度了解

    // 一模块的基础知识 /** * export :用于模块输出的出口 * import :文件引入的入口 */ // 1,第一种方式使用export方式输出 var a = 'a'; var b = ...

  3. 【Python3之模块及包的导入】

    一.模块导入 1.定义 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...

  4. python之模块、包的导入过程和开发规范

    摘要:导入模块.导入包.编程规范 以My_module为例,My_module的代码如下: __all__ = ['name','read'] print('in mymodule') name = ...

  5. DAY16 模块和包的导入

    一.包 1.包的定义 包:就是一系列模块的结合体 2.重点 1.包中一定要有一个专门来管理包中所有模块的文件 2.包名:存放一系列模块的文件夹名字 3.包名(包对象)存放的是管理模块的那个文件的地址, ...

  6. Day 16 模块和包的导入

    包的认识 包通过文件夹来管理一些列功能相近的模块 包:一系列模块的集合体 重点:包中一定有一个专门来管理包中所有模块的文件 包名:存放一系列模块的文件夹名字 包名(包对象)存放的是管理模块的那个文件地 ...

  7. DAY15 模块

    一.模块 1.1 模块的定义:模块就是一系列功能的集合体 1.2 模块的四种存在方式: 1.使用python编写的.py文件(任一py文件都可以作为模块) 2.包:一堆py文件的集合体 3.使用C编写 ...

  8. Python全栈之路----常用模块学习----模块的种类和导入方法

    什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码 ...

  9. node.js的http模块的基础 学到的东西

    node.js的http模块的基础 学到的东西 其中客户端:我们在node.js中如果要请求服务端中的js或者其他脚本的话要使用http.request()方法他会返回http.ClientReque ...

  10. Python中模块与包的导入(朴实易懂版的总结)

    这几天,被python包与模块的导入问题,折磨的不行,以前想的很简单,其实不然,经查资料研究,特总结如下: 基本注意点 模块:一般指一个py文件:包:含有许多py文件的文件夹,含有 或不含有(Pyth ...

随机推荐

  1. C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理

    一.MFC概念和作用 1.全称Microsoft Foundation Class Library,我们称为微软基础类库,封闭了绝大部分的win32 Api函数,C++语法中的数据结构,程序的运行流程 ...

  2. .net mvc4 + ajaxfileupload.js 解决IE浏览器中弹出下载对话框问题

    摘要:每一个人遇到的问题都不一样,在网上找了一大圈都没有解决到我的问题!由于我的环境如标题所看到的.攻克了这个问题. 主要问题:在于响应头的设置 Controller: [HttpPost] publ ...

  3. HttpUtils 发送http请求工具类

    import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URISyntaxEx ...

  4. 如何让aboboo 便携版在citrix下使用(aboboo在IPAD上使用)aboboo苹果版

    公司使用的是citrix的共享虚拟桌面.如何可以让aboboo在其下面运行呢? 网上有提供绿色版,但是总是弹出首次配置无法安装的报错界面. 察看帮助文档:http://www.aboboo.com/d ...

  5. HDU5834Magic boy Bi Luo with his excited tree 树形dp

    分析:典型的两遍dfs树形dp,先统计到子树的,再统计从祖先来的,dp[i][0]代表从从子树回来的最大值,dp[i][1]代表不回来,id[i]记录从i开始到哪不回来 吐槽:赛场上想到了状态,但是不 ...

  6. 【Poj3126】【BNUOJ3245】Prime Path

    http://poj.org/problem?id=3126 https://www.bnuoj.com/v3/problem_show.php?pid=3245 题目鬼图 刚开始看到题目的图觉得这题 ...

  7. tflearn 保存模型重新训练

    from:https://stackoverflow.com/questions/41616292/how-to-load-and-retrain-tflean-model This is to cr ...

  8. [ZJOI 2007] 矩阵游戏

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1059 [算法] 二分图最大匹配 时间复杂度 : O(N^3) [代码] #inclu ...

  9. struct框架

    配置文件struct-config.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE str ...

  10. bzoj 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛【树形dp】

    设f[u][0/1]为u这个点不选/选,转移的时候从儿子转移,f[u][1]=sum(f[son][0])+1,f[u][0]=sum(max(f[son][0],f[e[i].to][1])) #i ...