模块概述

到此之前,我们都是在一个py文件里操作,接下来,我们学习模块的内容,可以从其他文件引入内容(如函数等)

1. 什么是模块

一个py文件就是一个模块,模块是一些相似功能的集合体

2. 为什么要用模块

模块具有以下好处

(1)减少重复代码,提高开发效率

(2)使代码的组织结构更清晰,有条理性

3. 模块的分类

模块按来源分为三类:

(1)内置模块,也就是python解释器自带的模块,如time, os, sys等

(2)扩展模块(第三方模块),通过pip安装的模块

(3)自定义模块,自己写的模块

自定义模块

1. 创建自定义模块

先来写一个模块,命名为game_of_throne

print("-----来自game_of_throne模块-----")
name = "stack" def hello1():
print("我是game_of_throne模块的func1") def hello2():
print("我是game_of_throne模块的func2")

2. 自定义模块的导入及调用

我们引入game_of_throne模块,调用里面的name和func1和func2

 import game_of_throne     # 导入模块
print(game_of_throne.name) # 调用模块里的变量
game_of_throne.func1() # 调用模块里的函数
game_of_throne.func2()

执行一下,看看结果

-----来自game_of_throne模块-----
stack
我是game_of_throne模块的func1
我是game_of_throne模块的func2

可以看到,导入模块时,模块里的代码会自动执行,事实上,模块被执行时发生了三件事:

1. 创建了一个以被导入模块名字命名的名称空间

2. 自动执行模块中的代码(将模块中的所有内容加载到内存)

3. 执行模块中的代码需通过模块名. 的方式获取

这里需要注意的是,自动执行仅会在首次导入时进行,之后会直接从内存里引用

 import game_of_throne
print(game_of_throne.name)
game_of_throne.func1()
game_of_throne.func2()
import game_of_throne # 重复导入只会从内存中引用
game_of_throne.func2()

执行结果

-----来自game_of_throne模块-----
stack
我是game_of_throne模块的func1
我是game_of_throne模块的func2
我是game_of_throne模块的func2

import还可以导入多个模块

# 方式一:官方推荐
import time
import os
import sys # 方式二:不推荐
import time,os,sys

模块导入的另外一种方法是:from 模块名 import 内容,来看一段代码

 name = "robert"
from game_of_throne import name, func1, func2
print(name)
func1()
func2()

执行结果

-----来自game_of_throne模块-----
stack
我是game_of_throne模块的func1
我是game_of_throne模块的func2

可以看到,从game_of_throne模块导入的name把本文件里面的name给覆盖了,如果把本文件的name放在后面呢,来看

# name = "robert"
from game_of_throne import name, func1, func2
name = "robert"
print(name)
func1()
func2()

执行结果

-----来自game_of_throne模块-----
robert
我是game_of_throne模块的func1
我是game_of_throne模块的func2

运用这种方法导入时会与本文件里的重名的内容相互覆盖,所以使用时需慎重,from game_of_throne import name, func1, func2这句话实际上做了两件事:

(1)将模块game_of_throne 中的代码加载到内存(执行一遍)

(2)将name,func1,func2引入到当前的名称空间(可以用globals()验证)

from game_of_throne import name, func1, func2
print(globals())

执行结果

-----来自game_of_throne模块-----
{'__name__': '__main__', '__doc__': '\n模块被执行发生了三件事:\n1. 创建一个以被导入模块的名字命名的名称空间\n2. 自动执行模块中的代码(将模块中的所有内容加载到内存)\n3. 要想执行模块中的代码必须通过模块名. 的方式执行获取\n', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001AF6D7985F8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/模块.py', '__cached__': None, 'name': 'stack', 'func1': <function func1 at 0x000001AF6D86A950>, 'func2': <function func2 at 0x000001AF6D86A9D8>}

可以看到当前全局变量中有name,func1,func2,说明指定的变量和函数已经被引入到当前的名称空间。

两种导入方式对比:

(1)使用from...import...直接将模块中的内容导入到当前的名称空间中,之后调用直接使用名字就可以

(2)使用from...import...比较方便,但是容易与当前文件中的对象冲突

3. 模块的改名

上面的模块名是不是写着很费劲啊,我们可以给它取一个短一点的名字,就像我们的小名一样,以后就用这个小名来调用

import game_of_throne as got
got.func1()
got.func2()

执行结果

-----来自game_of_throne模块-----
我是game_of_throne模块的func1
我是game_of_throne模块的func2

模块改名除了方便引用外,还有另外一个作用,就是优化代码,方便拓展(统一接口),比如我们有两个模块:mysql.py和oracle.py

# mysql.py
def sqlparse():
print('from mysql sqlparse') # oracle.py
def sqlparse():
print('from oracle sqlparse')

有一点这样的代码:

 import mysql.py
import oracle.py
db_type = input(">>>")
if db_type == "mysql":
mysql.sqlparse()
elif db_type == "oracle":
oracle.sqlparse()

我们可以通过模块的改名对其进行优化

 db_type = input(">>>")
if db_type == "mysql":
import mysql as db
elif db_type == "oracle":
import oracle as db
db.sqlparse()

from...import...也可以改名

from game_of_throne import func1 as f1

也可以导入所有

from game_of_throne import *

import * 表示导入所有(除去下划线开头的名字),这种方式要慎用,因为导入所有极有可能覆盖掉本文件中的内容,这种方式一般只在两种情况下使用:

(1)对导入的模块了如指掌,里面的所有代码都清楚,确认过导入之后不会覆盖原文件的内容

(2)使用__all__控制 * 的范围(注意__all__放在要导入的模块里,而不是本文件里)

__all__ = ["name", "func2", "func4"]
from game_of_throne import *

func1()

func3()

执行结果

Traceback (most recent call last):
-----来自game_of_throne模块-----
File "D:/模块.py", line 161, in <module>
func1()
NameError: name 'func1' is not defined

报错,fiunc1未找到,说明func1没有被导入到当前的名称空间

文件的两个作用

1. 作为脚本,直接运行

game_of_throne作为脚本直接运行,__name__为__main__

# game_of_throne
print(__name__)

执行结果

__main__

2. 作为模块供别人调用

import game_of_throne
print(__name__)

执行结果

-----来自game_of_throne模块-----
__main__

补充:if __name__ == "__main__"通常作为项目的启动文件用

文件的搜索路径

内存中找-------->built-in内置模块-------->sys.path

先从内存中找,如果内存中有,直接引用;没有的话再在内置模块中找,找不到最后再在sys.path中找。

import sys
print(sys.path

执行结果

['D:\\Day13', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36', 'C:\\Python36\\lib\\site-packages', 'C:\\Program Files\\JetBrains\\PyCharm 2018.3.2\\helpers\\pycharm_matplotlib_backend']

如果要引入的模块不在当前文件所在的文件夹里需要手动将其路径添加到sys.path里

    import game_of_throne
ModuleNotFoundError: No module named 'game_of_throne'

手动添加到sys.path里

sys.path.append("D:/Day12")

执行结果

-----来自game_of_throne模块-----

总结一下:

1. 模块是集成了相似功能的文件

2. 使用模块能够减少重复代码,提高开发效率;使代码组织结构更清晰

3. 模块导入的两种方式

  import  模块名;

  from  模块名  import   内容

4. 模块改名:as

5. 文件搜索路径

  内存

  内置模块

  sys.path

python模块之自定义模块的更多相关文章

  1. python基础知识8——模块1——自定义模块和第三方开源模块

    模块的认识 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需 ...

  2. Python开发【第一篇】Python基础之自定义模块和内置模块

    为什么要有模块,将代码归类.模块,用一砣代码实现了某个功能的代码集合. Python中叫模块,其他语言叫类库. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代 ...

  3. Python爬虫与数据分析之模块:内置模块、开源模块、自定义模块

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

  4. 【python】导入自定义模块

    一.直接import 1.当执行文件与要导入的py文件在同一目录下时 假设要在wangyi.py中导入weibo.py文件 import weibo 2.当执行文件与要导入的py文件所在文件夹在同一目 ...

  5. vscode如何配置debug,python正则表达式如何匹配括号,关于python如何导入自定义模块

    关于vscode如何配置debug的问题: 1.下载安装好python,并且配置好 环境变量 2.https://www.cnblogs.com/asce/p/11600904.html 3.严格按照 ...

  6. Python模块01/自定义模块/time模块/datetime模块/random模块

    Python模块01/自定义模块/time模块/datetime模块/random模块 内容大纲 1.自定义模块 2.time模块 3.datetime模块 4.random模块 1.自定义模块 1. ...

  7. Python:导入自定义模块

    在C语言里为了工程文件的主程序main代码简洁的效果,我们经常用include“XXX”的来导入其.h文件 在Python里Import自己的自定义模块需要注意几个坑 以main主函数和需要导入的ha ...

  8. python from import 自定义模块

    from douban250.items import Douban250Item python import 自定义模块 (1)主程序与模块程序在同一目录下: 如下面程序结构: `-- src    ...

  9. 使用python开发ansible自定义模块的简单案例

    安装的版本ansible版本<=2.7,<=2.8是不行的哦 安装模块 pip install ansible==2.7 先导出环境变量 我们自定义模块的目录. 我存放的目录 export ...

随机推荐

  1. HNOI2019 游记

    HNOI2019 游记 Day 0 其实考前几天,心里还是挺慌的.结果最后 Day 0 的时候,因为种种原因反而释然了.也许是觉得,在这一步退役,也没有什么好害怕的吧. OI 本身就是一项偶然性太大的 ...

  2. PID 通俗解释

    PID 控制原理3 个故事:看完您就明白了.1.: PID 的故事小明接到这样一个任务:有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就 ...

  3. Bootloader升级方式一————擦、写flash在RAM中运行

    在汽车ECU软件运行中,软件代码运行安全性是第一,在代码中尽可能的不要固化有flash_erase.flash_write操作存在,主要是防止当出现异常情况时,程序跑飞,误调用erase.write对 ...

  4. Libre OJ 130、131、132 (树状数组 单点修改、区间查询 -> 区间修改,单点查询 -> 区间修改,区间查询)

    这三题均可以用树状数组.分块或线段树来做 #130. 树状数组 1 :单点修改,区间查询 题目链接:https://loj.ac/problem/130 题目描述 这是一道模板题. 给定数列 a[1] ...

  5. D: Starry的神奇魔法(矩阵快速幂)

    题目链接:https://oj.ismdeep.com/contest/Problem?id=1284&pid=3 D: Starry的神奇魔法 Time Limit: 1 s      Me ...

  6. [WC2018]州区划分

    [WC2018]州区划分 注意审题: 1.有序选择 2.若干个州 3.贡献是州满意度的乘积 枚举最后一个州是哪一个,合法时候贡献sum[s]^p,否则贡献0 存在欧拉回路:每个点都是偶度数,且图连通( ...

  7. Spring Cloud Vault介绍

    https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247484838&idx=1&sn=6439ed96133dde ...

  8. js 调试技巧

    快捷键 1.快速查看HTML中dom元素绑定那些JS事件方法 chrome中      F12-->Elements-->Event Listenners 参考:https://jingy ...

  9. netsh interface portproxy的一个简单例子

    netsh interface portproxy的微软帮助文档地址: https://technet.microsoft.com/zh-cn/library/cc776297(WS.10).aspx ...

  10. 做IT项目管理也需要具备产品思维

    不知道大家有没有听过大胡子姜志辉老师的公开课,我自己认为讲的还是不错的. 因为本身大胡子老师就是一个IT行业的人士,自己还经历了程序员.架构师.项目经理.敏捷教练.产品经理.公司持有人等多个角色.所以 ...