首页 > 其他分享 >模块

模块

时间:2023-09-15 19:33:55浏览次数:28  
标签:文件 name py 导入 模块 import

模块的简介

模块是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

相关文章

  • Python并发编程——IO模型、阻塞IO、非阻塞IO、多路复用、异步IO、IO模型比较、select
    文章目录每日测验一IO模型介绍二阻塞IO(blockingIO)三非阻塞IO(non-blockingIO)四多路复用IO(IOmultiplexing)五异步IO(AsynchronousI/O)六IO模型比较分析七selectors模块网络并发知识点梳理网络并发知识点梳理每日测验简述死锁现象你用过哪些队列阐述进......
  • 视频监控/安防监控/视频云存储EasyCVR平台设备分配模块升级详解
    (1)安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台支持将部署在监控现场的前端设备进行统一集中接入,可兼容多协议、多类型设备,管理员可选择任意一路或多路视频实时观看,视频画面支持单画面、多画面显示,视频窗口数量有1、4、9、16个可选,还能支持视频轮巡播放。平台分发的视频......
  • 关于python中os模块指向软链路径
    关于pythonos模块获取路径问题如果py文件放在软链路径下,那么无法获取当前路径,只能获取软链对应的真实路径Python3.8.2创建软链路径#1.在/System/Volumes/Data创建ccc目录mkdir-p/System/Volumes/Data/ccc#2.创建软链:test_ccc->/System/Volumes/Data/ccccd~&......
  • DC电源模块单路、双路输出的不同应用场景
    BOSHIDADC电源模块单路、双路输出的不同应用场景DC电源模块是一种常见的供电设备,通常用于将市电转换为稳定的直流电源,以供电给各种电子设备。DC电源模块的输出方式分为单路和双路两种,下面将分别介绍它们的不同应用场景。一、单路输出单路输出的DC电源模块通常只有一个输出端口......
  • BOSHIDA DC电源模块单路、双路输出的不同应用场景
    三河博电科技BOSHIDADC电源模块单路、双路输出的不同应用场景DC电源模块是一种常见的供电设备,通常用于将市电转换为稳定的直流电源,以供电给各种电子设备。DC电源模块的输出方式分为单路和双路两种,下面将分别介绍它们的不同应用场景。 一、单路输出单路输出的DC电源模块通......
  • Python学习笔记-Python异常、模块与包
    了解异常什么是异常当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUG。bug单词的诞生早期计算机采用大量继电器工作,马克二型计算机就是这样的。1945年9月9日,下午三点,马克二型计算机无法正常工作了,技术人员试......
  • 为什么基于transformer的序列分类不用decoder模块?
    Transformer原本是为机器翻译设计的编码-解码(Encoder-Decoder)结构。在序列分类任务中,主要利用的是Transformer的Encoder模块来获取输入序列的特征表示,而不需要Decoder模块,主要有以下原因:解码模块主要用来生成目标序列,而分类任务只需要判别整个源序列的类别,不需要生成目......
  • 7.前端设计模式之模块模式
    将代码拆分成更小更易复用的代码块 JavaScript从ES2015开始支持模块化,一个文件就是一个模块,以前也可以把一个大的JS文件拆分到多个文件里,但容易出现定义的变量、函数名称冲突,文件多了依赖关系也不好管理,上线时觉得a.js文件没什么用就没发布,直到某个功能出现xxxisnotafunction......
  • Flutter插件flutter_boost 在android模块中的报红问题解决.
    1,在开发Flutter插件时,打开插件的android项目,准备编写native端的代码时,发现各种报红,代码无法跳转,体验十分不好。就像我下面的截图一样:导入了FlutterBoostflutterBoost源码爆红。但是运行正常。。这说明本身是没有问题的。。分明是没有错误的类都存在。但是就是爆红。。。。可......
  • DC电源模块在保护设备损坏的重要功能
    BOSHIDADC电源模块在保护设备损坏的重要功能DC电源模块是一种电源管理设备,用于将交流电转换为直流电并提供给设备供电。它通常由多个电子元件组成,包括整流器、滤波器、稳压器等,以确保电源输出稳定,满足设备的电源需求。在实际应用中,DC电源模块有着非常重要的保护设备损坏的功能。以......