ICode9

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

[模块的分类,模块的使用,模块的搜索路径优先级]

2021-03-31 20:03:07  阅读:191  来源: 互联网

标签:优先级 spam money 路径 导入 模块 print import


[模块的分类,模块的使用,模块的搜索路径优先级]

  • 模块介绍

]

1、什么是模块?

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

模块分为四个类别:

1、一个py文件就可以是一个模块

2、包:就是一个存放有init.py文件的文件夹

3、使用 C编写并连接到python解释器的内置模块

4、已被编译为共享库或者C++扩展

模块有三种来源:

1、python解释器自带的

内置的、标准库

2、第三方库

3、自定义库

2、为什么要用模块?

1、拿来主义,极大地提升开发效率

2、解决代码冗余

3、如何用模块?

import首次导入模块会发生三件事:

导入语法:import # 需要加前缀

1、会触发spam.py的运行,所以会产生一个模块的名称空间
2、运行spam.py的代码,将运行过程中产生的名字都丢到模块的名称空间
3、在当前执行文件的名称空间中拿到一个名字spam.该名字指向模块的名称空间
# run.py    执行spam.py的模块

print('------>')

# 首次导入模块发生的事情
# 1、运行spam.py,创建一个模块的名称空间,将spam.py运行过程中产生的名字都丢到模块的名称空间中
# 2、在当前名称空间中得到一个名字,该名字是指向模块的名称空间

import spam    # 后面跟模块名不要跟.py,该模块名指向的是spam.py的名称空间
import spam    # 后续导入不会执行
import spam
# ps: 后续的导入直接引用首次导入的成功,不会重复执行spam.py、不会重复创建名称空间

print(spam.money)  # 指名道姓向spam.py调money
print(spam.read1)
print(spam.read2)
print(spam.change)

money = 2000   
spam.read1()  # spam模块: 1000   名称空间的关系是在定义阶段确立的与调用无关   

def read1():
    print('xxx')

spam.read2()  # spam模块: 1000


money = 2000
spam.change()
print(money)
print(spam.money)


# 3、导入规范
# 通常情况下所有的导入语句都应该写在文件的开头,然后分为三部分:
# 第一部分:先导入自带的模块
# 第二部分:导入第三方
# 第三部分:导入自定义的

# 4、import的其他用法
import os,sys,re   # 在一行一次导入多个模块(不建议使用)
import spam as sm  # 为模块起别名
print(sm.money)


money = 2000
print(spam.money)  # 1000  # 加spam.前缀,名字不会与当前名称空间名字冲突,每次调用都需要加前缀
print(money)  # 2000 没加前缀就是向当前名称空间调用

from spam import money # 不需要加前缀

from...import...首次导入模块发生三件事:

1、会触发spam.py的运行,所以会产生一个模块的名称空间
2、运行spam.py的代码,将运行过程中产生的名字都丢到模块的名称空间
3、在当前执行文件的名称空间中拿到一个名字叫'money'.该名字指向模块的名称空间
# run.py  执行spam.的模块

print('------>')

# 首次导入模块发生的事情
# 1、运行spam.py,创建一个模块的名称空间,将spam.py运行过程中产生的名字都丢到模块的名称空间中
# 2、在当前名称空间中得到一个名字money,该名字是指向模块的名称空间的那个money
from spam import money  
from spam import money  # 后续导入不会执行
from spam import money
from spam import read1
# ps: 后续的导入直接引用首次导入的成功,不会重复执行spam.py、不会重复创建名称空间

money = 2000
print(money)  # 2000  money与当前名称空间名字冲突,会互相覆盖

money = 2000
read1()      # spam模块:1000 先确定read1()来自于哪,以来的地方为准找作用域关系


money = 2000
def read1():
    print('xxxx',money)

read1() # xxxx 2000  # 此时read1()找的是当前名称空间


# 其他用法
from spam import money,read1,read2,change  # 一行导入多个名字
from spam import money as m,read1 as r1,read2 as r2,change # 也支持as,为模块起别名
print(m)
print(r1)
print(r2)

# from...import*
from spam import *  # 把spam中所有的不是以下划线开头的名字都导入到当前位置
# print(money)
# print(read1)
print(read2)
print(change)
# 大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有
# 可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。
导入语法
import spam as sm      # 可以跟换别名 as 把spam 跟换成sm
import spam,os,time    # 可以一次导入多个模块 用逗号隔开

from spam import money as m  # 也可以跟换别名
from spam import money,f1,f2  # 导入多个
from spam import *  #  *把spam所有名字都导入
f1()
__all__可以指定*里面的名字 例如:__all__=['fi','f2']

模块的搜索路径优先级

 1、内存
 2、内置
 3、环境变量 (sys.path)  # 当前执行程序文件所在的文件夹
# 内存---》内置---》sys.path

# 1.内存:在第一次导入某个模块时(比如spam),会先检查该模块是否已经被加载到内存中
#     (当前执行文件的名称空间对应的内存),如果有则直接引用
# ps:python解释器在启动时会自动加载一些模块到内存中,可以使用sys.modules查看
import m1   # 导入m1模块
import time

m1.f1()
time.sleep(5)  # 在五秒内删除m1并执行当前模块仍能调取m1 过完5秒再执行就出现报错,说明优先从内存找
import m1
m1.f1()

# 2.内置:如果内存没有,python解释器则会查找同名的内置模块
import time,os

print(time)  # <module 'time' (built-in)>
print(os)    # <module 'os' from 'D:\\Python38\\lib\\os.py'>
 

# 3.sys.path:如果内置还没有找到就从sys.path给出的目录列表中依次寻找spam.py文件
import sys
print(sys.path)

import m1
m1.f1()

import aaa.m1 as m
aaa.m1.f1()
m.f1()

# 需要特别注意的是:我们自定义的模块名不应该与系统内置模块重名。虽然每次都说,但是仍然会有人不停的犯错。 

# 在初始化后,python程序可以修改sys.path,路径放到前面的优先于标准库被加载
import sys
print(sys.path)
sys.path.append(r'D:\python17\day02') # windows下的路径不加r开头,会语法错误

import m2
m2.f2()


sys.path.append(r'D:\python17')
import day02.m2  # D:\python17\day02\m2
day02.m2.f2()

import time
time.sleep(3)

标签:优先级,spam,money,路径,导入,模块,print,import
来源: https://www.cnblogs.com/liupengfei1123/p/14603450.html

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

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

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

ICode9版权所有