ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

模块-初识

2021-04-01 11:35:30  阅读:177  来源: 互联网

标签:spam py 导入 初识 m1 模块 import


模块

1、什么是模块

模块就是一系列功能的集合体

模块分为四种类别:

1、一个py文件就可以是一个模块
2、包:就是一个存放有__ init__.py文件的文件夹
3、使用C编写并链接到python解释器的内置模块
4、已被编译为共享库或DDL的C或C++扩展

模块有三种来源:

1、python解释器自带的
	内置库 # import time
    标准库 # import os
2、第三方的库
3、自定义的库

2、为何要用模块

1、拿来主义,极大的提升开发效率
2、解决代码冗余

3、如何用模块

3.1、导入语法

import首次导入模块会发生三件事:
import spam
1、会触发spam.py运行,所以会产生一个模块的名称空间
2、运行spam.py的代码,将运行过程中产生的名字都丢到模块的名称空间中
3、在当前执行文件的名称空间中拿到一个名字spam,该名字就是指向模块的名称空间
ps:后续的导入直接引用首次导入的成果
# spam.py
print('from spam')
money = 1000
def read1():
    print(1)
def read2():
    print(2)
def change():
    print(cha)
# run.py
import m1 
import m1
import m1
# 只会输出一次from spam,后面导入模块会直接引用首次导入的成果,访问里面方法和变量需要加入前缀
print(spam.money) # 1000

from import 首次导入模块会发生三件事:
from spam import money
1、会触发spam.py运行,所以会产生一个模块的名称空间
2、运行spam.py的代码,将运行过程中产生的名字都丢到模块的名称空间中
3、在当前执行文件的名称空间中拿到一个名字money,该名字就是指向模块的名称空间对应的名字
ps:后续的导入直接引用首次导入的成果
# spam.py
print('from spam')
money = 1000
def read1():
    print(1)
def read2():
    print(2)
def change():
    print(cha)
# run.py
from spam import money
from spam import money
# 也只是输出一次from spam,后续的导入直接引用首次导入的成果,不需要加入前缀
print(money) # 1000

导入模块可以起别名:
import span as a
from span import money as b
同时导入多个模块:
import span,os,time
import span as a,os,time as tm
from span import read,func
from span import * # (导入模块中所有函数)
# * 是个双刃剑,容易和当前名称空间的名称冲突 可以通过__ all __ =[ ] 来控制 * 导入的函数

3.2、循环导入问题

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

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

# run.py
import m1
# 运行run.py ,会先导入m1模块,输出from m1 ,然后from m2 import y导入m2模块去找y,执行m2模块,先输出from m2,接着from m1 import x会去m1模块找x,由于m1模块已经导入过,不会重复导入,此时的m1中的x还没有加载,所以会报错

解决方案:

1、把存在循环导入问题的导入语句放在一个函数里
2、不要出现循环导入,把要用的数据放在第三方模块

3.3、模块的搜索路径

优先级:
1、内存
2、内置
3、sys.path 强调:sys.path是以执行程序为准
模块的查找顺序:
1、在第一次导入某个模块时(比如spam),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用
    ps:python解释器在启动时会自动加载一些模块到内存中,可以使用sys.modules查看
2、如果没有,解释器则会查找同名的内置模块
3、如果还没有找到就从sys.path给出的目录列表中依次寻找spam.py文件。
PS:
我们自定义的模块名不应该与系统内置模块重名。
import sys
# 找foo.py就把foo.py的文件夹添加到环境变量中
sys.path.append('/Users/linhaifeng/PycharmProjects/s14/day21/aa')
import foo

编写模块模板:

"The module is used to..." #模块的文档描述

import sys #导入模块

x=1 #定义全局变量,如果非必须,则最好使用局部变量,这样可以提高代码的易维护性,并且可以节省内存提高性能

class Foo: #定义类,并写好类的注释
    'Class Foo is used to...'
    pass

def test(): #定义函数,并写好函数的注释
    'Function test is used to…'
    pass

if __name__ == '__main__': #主程序
    test() #在被当做脚本执行时,执行此处的代码

标签:spam,py,导入,初识,m1,模块,import
来源: https://www.cnblogs.com/BaiJiaZhengMing/p/14605432.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有