模块的简介
模块是Python中非常核心的一块内容,用的非常多,它比较简单
1.简介
1.模块的本质
模块就是一个内部具有一定功能(功能无论大小)的py文件
如果把开发程序比喻成制造一台电脑,编写模块就像是在制造电脑的零部件,准备好零部件后,剩下的工作就是按照逻辑把它们组装到一起。
2.模块的历史
根据模块的本质我们可以知道,当我们实现一些复杂的功能的时候,直接调用别人的模块就可以实现目的,因此在最开始的时候其他程序员都看不起python,给他起名:调包侠。
但是随着时间的发展,代码的功能变得越来越复杂了,项目的要求变得越来越繁琐,之前看不起python的人也开始使用python成为了调包侠,最终逃不过一个真香定律。
所以总结下来,使用模块既保证了代码的重用性,又增强了程序的结构性和可维护性。另外除了自定义模块外,我们还可以导入使用内置或第三方模块提供的现成功能,这种“拿来主义”极大地提高了程序员的开发效率。
3.python模块的多种表现形式
这里了解就可以,方便后面的理解
1、py文件(一个py文件也可以看成一个模块)
2、含有多个py文件的文件夹(通常在存储的时候会根据功能来存放,比如功能相似的放在一起)
3、已被编译为共享库或DLL的c或c++扩展(了解一下就好)
4、使用C编写并链接到python解释器的内置模块(了解一下就好)
4.为什么要用模块?
站在巨人的肩膀上,别人写好的一些功能我们把它下载下来直接用在我们自己的项目中,大大提高开发效率
支付宝支付、微信支付、发短信、验证码、等等很多的服务
别人已经开发好了,给它下载下来,直接挪到我们自己的python文件中使用就行了
2、模块的分类
所谓的模块分类我们可以看成模块的来源,这里我们把模块分成三类来源:
1.自定义模块
自定义模块就是我们程序员自己编写的模块文件
2.内置模块
这些模块是python解释器自带的模块
3.第三方模块
这些就是一些大佬写的模块文件
3.补充两个python代码的网址
"""
以后我们再开发一些复杂的功能的时候,就可以想想或者查查有没有别人已经写好了,直接下载下来使用
"""
# 当你遇到一个你不会的技术栈的时候,一般情况都有人开发好了
github:https://github.com/ 国外
gitee:https://gitee.com/ 国内
模块都导入方式之import句式
比如我们定义了一个py文件当模块:a.py
然后调用的代码如下:
import a
这种形式下会直接运行调用模块的文件内部的所有代码,之后我们就可以通过:模块名.变量名的形式来调用模块的函数或变量。
通过上面代码我们可以发现左边是执行文件右边的a.py是被导入的模块文件,执行文件运行的时候运行流程和名称空间的变化如下:
①这个时候先是运行了py文件产生了一个全局名称空间
②然后运行a.py文件,就会在内存中创建一个模块a对应的名称空间,把a.py中的名称全部放到里面,执行文件内会产生一个模块a的名称,当我们调用a中的名称就会去a模块的名称空间中寻找。这里需要注意导入模块的时候内部代码全会执行一遍,比如print操作会打印文字。
③根据流程图我们可以看到导入模块之后打印了a模块中给的name绑定的jason,这里就想到雨
④之后调用了a中的函数func1
"""
学习模块的时候一定要弄清楚:谁是执行文件,谁是导入文件?
运行当前文件,会导入a文件到此文件中,并且会执行导入文件
导入文件多次,那么,也只会执行一次导入文件中得代码,只需要导入一次即可
导入文件的时候发生了什么事儿?
1. 首先会运行执行文件,产生执行文件的全局名称空间
2. 运行导入文件
3. 会产生导入文件的全局名称空间,把导入文件中的名字都丢到全局名称空间中
4. 会在执行文件中产生一个名字a指向导入文件的名称空间
"""
from...import...句式
这里也用a.py当模块文件
调用代码如下:
from a import 函数名(或是变量名)
这种形式下调用模块内的名称比较自由,可以掉几个也可以调用所有的名称,但是在我们调用的时候容易跟执行文件内的名称产生冲突,导致引用的时候导致同一变量绑定的值错误切换。
"""
from...import...句式
导入模块也会执行导入文件,多次导入也只会执行一次,跟import句式一样
导入文件的时候发生了什么事儿?
1. 首先会运行执行文件,产生执行文件的全局名称空间
2. 运行导入文件md
3. 会产生导入文件的全局名称空间,把导入文件中的名字都丢到全局名称空间中
4. 会在执行文件中产生一个名字money指向导入文件的名称空间中得money
如果使用from...import...句式的情况,在执行文件中会出现名字冲突的情况(在执行文件中出现了和导入的名字一样的时候)
出现冲突的时候离谁近用谁的
以后所有的导入语句都写在文件的开头
"""
整体流程跟上面相似,在引用的时候名称有所区别
①这个时候先是运行了py文件产生了一个全局名称空间
②然后运行a.py文件,就会在内存中创建一个模块a对应的名称空间,把a.py中的名称全部放到里面,执行文件内会产生一个模块a的名称,当我们调用a中的名称就会去a模块的名称空间中寻找。这里需要注意导入模块的时候内部代码全会执行一遍,比如print操作会打印文字。
③根据流程图我们可以看到导入模块之后打印了a模块中给的name绑定的jason
④之后调用了a中的函数func1
导入语句的其他用法
1. 起别名
from md import money as m
from md import read1 as r1
from md import read2 as r2
import md
def read1():
print('from read1')
read1()
r1()
md.read1()
2. 连续导入
import md
import time
import os
import sys
import md,time,os,sys
3. 通用导入
from md import *
from md import *
read1()
change()
__all__ = ['money', 'read1', 'change']
循环导入问题
循环导入就是两个py文件互相导入对方,但是这里我们可以根据上面写的知识点:牢记谁是执行文件,谁是模块文件,来进行简单的分析:
md1:
import md2
name = 'from md1'
print(md2.name)
md2
name = 'from md2'
import md1
print(md1.name)
这里简单说一下流程;
1.我们把md1文件当作执行文件执行之后直接跳到md2文件执行,进行导入模块操作
2.md2中执行到import md1后再次回到md1中执行后续内容(这里是当作导入模块的操作执行,不是正常的流程走下去),然后输出print(md2.name)一次
3.md1模块导入之后回到md2那边执行后续的代码,输出print(md1.name)
4.md2导入结束之后走md1中后面的代码print(md2.name)
注:这里md2文件中的import不能放在最上面,会导致md1中的print获取不到md2中的name直接报错
判断文件类型(执行文件、导入文件)
这里需要引入一个函数:双下划线name
__name__
当我们运行代码的时候,如果双下划线name所在文件是被执行文件,那么就会返回双下划线main
__main__
如果双下划线name所在文件是被导入文件的时候就会返回被导入的模块名
应用场景
if __name__ == '__main__': # a
read2()
if __name__ == '__main__':
'''在这个判断里面写的代码,只有是以执行文件运行的时候,才会被执行,当被当成导入文件的时候,不会被运行'''
标签:文件,name,py,导入,模块,import
From: https://www.cnblogs.com/wolongnp/p/17705780.html